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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (664) hide show
  1. package/README.md +96 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/agentSessions/BridgeHostInstance.d.ts +8 -3
  4. package/dist/agentSessions/BridgeHostInstance.d.ts.map +1 -1
  5. package/dist/agentSessions/BridgeHostInstance.js +14 -4
  6. package/dist/agentSessions/BridgeHostInstance.js.map +1 -1
  7. package/dist/agentSessions/HandoffOfferExpiry.d.ts +10 -0
  8. package/dist/agentSessions/HandoffOfferExpiry.d.ts.map +1 -0
  9. package/dist/agentSessions/HandoffOfferExpiry.js +18 -0
  10. package/dist/agentSessions/HandoffOfferExpiry.js.map +1 -0
  11. package/dist/agentSessions/ReturningVisitorRecap.js +1 -0
  12. package/dist/agentSessions/ReturningVisitorRecap.js.map +1 -1
  13. package/dist/agentSessions/SessionJanitor.d.ts +34 -11
  14. package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
  15. package/dist/agentSessions/SessionJanitor.js +88 -44
  16. package/dist/agentSessions/SessionJanitor.js.map +1 -1
  17. package/dist/agentSessions/SessionManager.d.ts +29 -9
  18. package/dist/agentSessions/SessionManager.d.ts.map +1 -1
  19. package/dist/agentSessions/SessionManager.js +62 -16
  20. package/dist/agentSessions/SessionManager.js.map +1 -1
  21. package/dist/agentSessions/conversationBrowsers.d.ts +61 -0
  22. package/dist/agentSessions/conversationBrowsers.d.ts.map +1 -0
  23. package/dist/agentSessions/conversationBrowsers.js +118 -0
  24. package/dist/agentSessions/conversationBrowsers.js.map +1 -0
  25. package/dist/agentSessions/sessionDeadline.d.ts +43 -0
  26. package/dist/agentSessions/sessionDeadline.d.ts.map +1 -0
  27. package/dist/agentSessions/sessionDeadline.js +68 -0
  28. package/dist/agentSessions/sessionDeadline.js.map +1 -0
  29. package/dist/auth/APIKeyScopeAuth.d.ts.map +1 -1
  30. package/dist/auth/APIKeyScopeAuth.js +5 -4
  31. package/dist/auth/APIKeyScopeAuth.js.map +1 -1
  32. package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
  33. package/dist/auth/AuthProviderCatalogRouter.js +2 -0
  34. package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
  35. package/dist/auth/index.d.ts.map +1 -1
  36. package/dist/auth/index.js +51 -10
  37. package/dist/auth/index.js.map +1 -1
  38. package/dist/auth/initializeProviders.d.ts +10 -0
  39. package/dist/auth/initializeProviders.d.ts.map +1 -1
  40. package/dist/auth/initializeProviders.js +37 -1
  41. package/dist/auth/initializeProviders.js.map +1 -1
  42. package/dist/auth/localDevAuth.d.ts +79 -0
  43. package/dist/auth/localDevAuth.d.ts.map +1 -0
  44. package/dist/auth/localDevAuth.js +439 -0
  45. package/dist/auth/localDevAuth.js.map +1 -0
  46. package/dist/auth/loginEmailResolution.d.ts +41 -0
  47. package/dist/auth/loginEmailResolution.d.ts.map +1 -0
  48. package/dist/auth/loginEmailResolution.js +47 -0
  49. package/dist/auth/loginEmailResolution.js.map +1 -0
  50. package/dist/auth/magicLink/MagicLinkKeys.d.ts +51 -3
  51. package/dist/auth/magicLink/MagicLinkKeys.d.ts.map +1 -1
  52. package/dist/auth/magicLink/MagicLinkKeys.js +130 -13
  53. package/dist/auth/magicLink/MagicLinkKeys.js.map +1 -1
  54. package/dist/auth/magicLink/MagicLinkRouter.d.ts +3 -0
  55. package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
  56. package/dist/auth/magicLink/MagicLinkRouter.js +23 -5
  57. package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
  58. package/dist/auth/magicLink/MagicLinkService.d.ts +39 -5
  59. package/dist/auth/magicLink/MagicLinkService.d.ts.map +1 -1
  60. package/dist/auth/magicLink/MagicLinkService.js +221 -9
  61. package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
  62. package/dist/auth/magicLink/index.d.ts +1 -1
  63. package/dist/auth/magicLink/index.d.ts.map +1 -1
  64. package/dist/auth/magicLink/index.js +1 -1
  65. package/dist/auth/magicLink/index.js.map +1 -1
  66. package/dist/auth/magicLink/redeemLanding.d.ts +2 -2
  67. package/dist/auth/magicLink/redeemLanding.d.ts.map +1 -1
  68. package/dist/auth/magicLink/redeemLanding.js +7 -4
  69. package/dist/auth/magicLink/redeemLanding.js.map +1 -1
  70. package/dist/auth/magicLink/types.d.ts +39 -3
  71. package/dist/auth/magicLink/types.d.ts.map +1 -1
  72. package/dist/auth/magicLink/types.js +0 -4
  73. package/dist/auth/magicLink/types.js.map +1 -1
  74. package/dist/auth/newUsers.d.ts.map +1 -1
  75. package/dist/auth/newUsers.js +1 -0
  76. package/dist/auth/newUsers.js.map +1 -1
  77. package/dist/auth/sessionUserClone.d.ts +1 -1
  78. package/dist/auth/sessionUserClone.d.ts.map +1 -1
  79. package/dist/auth/sessionUserClone.js +3 -2
  80. package/dist/auth/sessionUserClone.js.map +1 -1
  81. package/dist/backgroundSweepConfigUnits.d.ts +231 -0
  82. package/dist/backgroundSweepConfigUnits.d.ts.map +1 -0
  83. package/dist/backgroundSweepConfigUnits.js +180 -0
  84. package/dist/backgroundSweepConfigUnits.js.map +1 -0
  85. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts +292 -0
  86. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts.map +1 -0
  87. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js +442 -0
  88. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js.map +1 -0
  89. package/dist/broadcast/index.d.ts +6 -0
  90. package/dist/broadcast/index.d.ts.map +1 -0
  91. package/dist/broadcast/index.js +6 -0
  92. package/dist/broadcast/index.js.map +1 -0
  93. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts +43 -0
  94. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts.map +1 -0
  95. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js +144 -0
  96. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js.map +1 -0
  97. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts +46 -0
  98. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts.map +1 -0
  99. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js +149 -0
  100. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js.map +1 -0
  101. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts +49 -0
  102. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts.map +1 -0
  103. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js +131 -0
  104. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js.map +1 -0
  105. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts +24 -0
  106. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts.map +1 -0
  107. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js +51 -0
  108. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js.map +1 -0
  109. package/dist/cache.d.ts +3 -2
  110. package/dist/cache.d.ts.map +1 -1
  111. package/dist/cache.js.map +1 -1
  112. package/dist/config.d.ts +1402 -8
  113. package/dist/config.d.ts.map +1 -1
  114. package/dist/config.js +120 -0
  115. package/dist/config.js.map +1 -1
  116. package/dist/context.d.ts +5 -1
  117. package/dist/context.d.ts.map +1 -1
  118. package/dist/context.js +64 -12
  119. package/dist/context.js.map +1 -1
  120. package/dist/coreRoutes.d.ts +3 -1
  121. package/dist/coreRoutes.d.ts.map +1 -1
  122. package/dist/coreRoutes.js +20 -4
  123. package/dist/coreRoutes.js.map +1 -1
  124. package/dist/generated/graphql-schemas/__mj.d.ts +863 -14
  125. package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
  126. package/dist/generated/graphql-schemas/__mj.js +4167 -62
  127. package/dist/generated/graphql-schemas/__mj.js.map +1 -1
  128. package/dist/generic/CacheInvalidationResolver.d.ts +50 -30
  129. package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
  130. package/dist/generic/CacheInvalidationResolver.js +154 -79
  131. package/dist/generic/CacheInvalidationResolver.js.map +1 -1
  132. package/dist/generic/OrphanedConversationDetailReconciler.d.ts +11 -0
  133. package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -1
  134. package/dist/generic/OrphanedConversationDetailReconciler.js +29 -1
  135. package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
  136. package/dist/generic/PubSubManager.d.ts +10 -0
  137. package/dist/generic/PubSubManager.d.ts.map +1 -1
  138. package/dist/generic/PubSubManager.js +44 -1
  139. package/dist/generic/PubSubManager.js.map +1 -1
  140. package/dist/generic/PushStatusResolver.d.ts +39 -6
  141. package/dist/generic/PushStatusResolver.d.ts.map +1 -1
  142. package/dist/generic/PushStatusResolver.js +93 -11
  143. package/dist/generic/PushStatusResolver.js.map +1 -1
  144. package/dist/generic/ResolverBase.d.ts +114 -29
  145. package/dist/generic/ResolverBase.d.ts.map +1 -1
  146. package/dist/generic/ResolverBase.js +509 -220
  147. package/dist/generic/ResolverBase.js.map +1 -1
  148. package/dist/generic/RunViewResolver.d.ts +15 -3
  149. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  150. package/dist/generic/RunViewResolver.js +126 -20
  151. package/dist/generic/RunViewResolver.js.map +1 -1
  152. package/dist/generic/actionOutputFieldSecurity.d.ts +26 -0
  153. package/dist/generic/actionOutputFieldSecurity.d.ts.map +1 -0
  154. package/dist/generic/actionOutputFieldSecurity.js +47 -0
  155. package/dist/generic/actionOutputFieldSecurity.js.map +1 -0
  156. package/dist/generic/fieldSecurityTransport.d.ts +30 -0
  157. package/dist/generic/fieldSecurityTransport.d.ts.map +1 -0
  158. package/dist/generic/fieldSecurityTransport.js +30 -0
  159. package/dist/generic/fieldSecurityTransport.js.map +1 -0
  160. package/dist/index.d.ts +4 -0
  161. package/dist/index.d.ts.map +1 -1
  162. package/dist/index.js +262 -84
  163. package/dist/index.js.map +1 -1
  164. package/dist/integration/ConnectionPause.d.ts +121 -0
  165. package/dist/integration/ConnectionPause.d.ts.map +1 -0
  166. package/dist/integration/ConnectionPause.js +183 -0
  167. package/dist/integration/ConnectionPause.js.map +1 -0
  168. package/dist/integration/CustomColumnPromoter.d.ts +72 -6
  169. package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
  170. package/dist/integration/CustomColumnPromoter.js +93 -47
  171. package/dist/integration/CustomColumnPromoter.js.map +1 -1
  172. package/dist/integration/EntityMapLifecycle.d.ts +78 -4
  173. package/dist/integration/EntityMapLifecycle.d.ts.map +1 -1
  174. package/dist/integration/EntityMapLifecycle.js +199 -5
  175. package/dist/integration/EntityMapLifecycle.js.map +1 -1
  176. package/dist/integration/InactiveRowWarnings.d.ts +31 -0
  177. package/dist/integration/InactiveRowWarnings.d.ts.map +1 -1
  178. package/dist/integration/InactiveRowWarnings.js +29 -0
  179. package/dist/integration/InactiveRowWarnings.js.map +1 -1
  180. package/dist/integration/ObjectNamesByID.d.ts +28 -0
  181. package/dist/integration/ObjectNamesByID.d.ts.map +1 -0
  182. package/dist/integration/ObjectNamesByID.js +87 -0
  183. package/dist/integration/ObjectNamesByID.js.map +1 -0
  184. package/dist/integration/PostRestartIntrospect.d.ts +26 -0
  185. package/dist/integration/PostRestartIntrospect.d.ts.map +1 -0
  186. package/dist/integration/PostRestartIntrospect.js +27 -0
  187. package/dist/integration/PostRestartIntrospect.js.map +1 -0
  188. package/dist/integration/RSUPostRestartProgress.d.ts +176 -0
  189. package/dist/integration/RSUPostRestartProgress.d.ts.map +1 -0
  190. package/dist/integration/RSUPostRestartProgress.js +323 -0
  191. package/dist/integration/RSUPostRestartProgress.js.map +1 -0
  192. package/dist/integration/RSUProgressBridge.d.ts +41 -2
  193. package/dist/integration/RSUProgressBridge.d.ts.map +1 -1
  194. package/dist/integration/RSUProgressBridge.js +84 -1
  195. package/dist/integration/RSUProgressBridge.js.map +1 -1
  196. package/dist/integration/RunArtifactAuthorization.d.ts +39 -0
  197. package/dist/integration/RunArtifactAuthorization.d.ts.map +1 -0
  198. package/dist/integration/RunArtifactAuthorization.js +45 -0
  199. package/dist/integration/RunArtifactAuthorization.js.map +1 -0
  200. package/dist/integration/SchemaRefreshLaunch.d.ts +9 -0
  201. package/dist/integration/SchemaRefreshLaunch.d.ts.map +1 -1
  202. package/dist/integration/SchemaRefreshLaunch.js +3 -2
  203. package/dist/integration/SchemaRefreshLaunch.js.map +1 -1
  204. package/dist/integration/ScopedFieldsForBuild.d.ts +46 -0
  205. package/dist/integration/ScopedFieldsForBuild.d.ts.map +1 -0
  206. package/dist/integration/ScopedFieldsForBuild.js +91 -0
  207. package/dist/integration/ScopedFieldsForBuild.js.map +1 -0
  208. package/dist/integration/TargetConfigGuard.d.ts +40 -0
  209. package/dist/integration/TargetConfigGuard.d.ts.map +1 -0
  210. package/dist/integration/TargetConfigGuard.js +40 -0
  211. package/dist/integration/TargetConfigGuard.js.map +1 -0
  212. package/dist/logging/variablesLoggingMiddleware.d.ts +12 -0
  213. package/dist/logging/variablesLoggingMiddleware.d.ts.map +1 -1
  214. package/dist/logging/variablesLoggingMiddleware.js +50 -1
  215. package/dist/logging/variablesLoggingMiddleware.js.map +1 -1
  216. package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts.map +1 -1
  217. package/dist/realtimeSessions/SessionVerificationPortsBase.js +1 -0
  218. package/dist/realtimeSessions/SessionVerificationPortsBase.js.map +1 -1
  219. package/dist/realtimeSessions/ownedRealtimeSession.d.ts +8 -6
  220. package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -1
  221. package/dist/realtimeSessions/ownedRealtimeSession.js +14 -6
  222. package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -1
  223. package/dist/realtimeSessions/sessionAccess.d.ts +103 -11
  224. package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -1
  225. package/dist/realtimeSessions/sessionAccess.js +147 -22
  226. package/dist/realtimeSessions/sessionAccess.js.map +1 -1
  227. package/dist/realtimeSessions/sessionConfigStamps.js +1 -1
  228. package/dist/realtimeSessions/sessionConfigStamps.js.map +1 -1
  229. package/dist/realtimeSessions/subscriptionAuthorization.d.ts.map +1 -1
  230. package/dist/realtimeSessions/subscriptionAuthorization.js +5 -2
  231. package/dist/realtimeSessions/subscriptionAuthorization.js.map +1 -1
  232. package/dist/realtimeSessions/verificationWorkflow.d.ts +2 -0
  233. package/dist/realtimeSessions/verificationWorkflow.d.ts.map +1 -1
  234. package/dist/realtimeSessions/verificationWorkflow.js +1 -1
  235. package/dist/realtimeSessions/verificationWorkflow.js.map +1 -1
  236. package/dist/realtimeWidget/WidgetRouter.d.ts.map +1 -1
  237. package/dist/realtimeWidget/WidgetRouter.js +19 -3
  238. package/dist/realtimeWidget/WidgetRouter.js.map +1 -1
  239. package/dist/realtimeWidget/WidgetSessionService.d.ts +67 -7
  240. package/dist/realtimeWidget/WidgetSessionService.d.ts.map +1 -1
  241. package/dist/realtimeWidget/WidgetSessionService.js +203 -19
  242. package/dist/realtimeWidget/WidgetSessionService.js.map +1 -1
  243. package/dist/realtimeWidget/host-identity.d.ts +1 -1
  244. package/dist/realtimeWidget/host-identity.js +1 -1
  245. package/dist/realtimeWidget/visitorIdentity.d.ts.map +1 -1
  246. package/dist/realtimeWidget/visitorIdentity.js +1 -0
  247. package/dist/realtimeWidget/visitorIdentity.js.map +1 -1
  248. package/dist/realtimeWidget/widgetCore.d.ts +20 -1
  249. package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
  250. package/dist/realtimeWidget/widgetCore.js +21 -8
  251. package/dist/realtimeWidget/widgetCore.js.map +1 -1
  252. package/dist/realtimeWidget/widgetGuestElevation.d.ts +1 -1
  253. package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
  254. package/dist/realtimeWidget/widgetGuestElevation.js +3 -1
  255. package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
  256. package/dist/requestOrigin.d.ts +22 -0
  257. package/dist/requestOrigin.d.ts.map +1 -0
  258. package/dist/requestOrigin.js +60 -0
  259. package/dist/requestOrigin.js.map +1 -0
  260. package/dist/resolvers/ActionResolver.d.ts +19 -1
  261. package/dist/resolvers/ActionResolver.d.ts.map +1 -1
  262. package/dist/resolvers/ActionResolver.js +63 -12
  263. package/dist/resolvers/ActionResolver.js.map +1 -1
  264. package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
  265. package/dist/resolvers/AdhocQueryResolver.js +1 -0
  266. package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
  267. package/dist/resolvers/AgentRunStatusPublisher.d.ts +18 -4
  268. package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -1
  269. package/dist/resolvers/AgentRunStatusPublisher.js +32 -8
  270. package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -1
  271. package/dist/resolvers/AgentSessionResolver.d.ts +10 -4
  272. package/dist/resolvers/AgentSessionResolver.d.ts.map +1 -1
  273. package/dist/resolvers/AgentSessionResolver.js +44 -17
  274. package/dist/resolvers/AgentSessionResolver.js.map +1 -1
  275. package/dist/resolvers/AutotagPipelineResolver.d.ts.map +1 -1
  276. package/dist/resolvers/AutotagPipelineResolver.js +2 -1
  277. package/dist/resolvers/AutotagPipelineResolver.js.map +1 -1
  278. package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -1
  279. package/dist/resolvers/ConversationRunEventsResolver.js +2 -0
  280. package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -1
  281. package/dist/resolvers/EntityCommunicationsResolver.d.ts +13 -1
  282. package/dist/resolvers/EntityCommunicationsResolver.d.ts.map +1 -1
  283. package/dist/resolvers/EntityCommunicationsResolver.js +50 -14
  284. package/dist/resolvers/EntityCommunicationsResolver.js.map +1 -1
  285. package/dist/resolvers/ExecuteRemoteOperationResolver.d.ts +6 -0
  286. package/dist/resolvers/ExecuteRemoteOperationResolver.d.ts.map +1 -1
  287. package/dist/resolvers/ExecuteRemoteOperationResolver.js +30 -7
  288. package/dist/resolvers/ExecuteRemoteOperationResolver.js.map +1 -1
  289. package/dist/resolvers/FetchEntityVectorsResolver.d.ts +28 -0
  290. package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
  291. package/dist/resolvers/FetchEntityVectorsResolver.js +117 -21
  292. package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
  293. package/dist/resolvers/FileCategoryResolver.d.ts.map +1 -1
  294. package/dist/resolvers/FileCategoryResolver.js +1 -0
  295. package/dist/resolvers/FileCategoryResolver.js.map +1 -1
  296. package/dist/resolvers/FileResolver.d.ts +5 -0
  297. package/dist/resolvers/FileResolver.d.ts.map +1 -1
  298. package/dist/resolvers/FileResolver.js +13 -4
  299. package/dist/resolvers/FileResolver.js.map +1 -1
  300. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  301. package/dist/resolvers/GetDataResolver.js +34 -13
  302. package/dist/resolvers/GetDataResolver.js.map +1 -1
  303. package/dist/resolvers/IntegrationDiscoveryResolver.d.ts +401 -11
  304. package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
  305. package/dist/resolvers/IntegrationDiscoveryResolver.js +2713 -1290
  306. package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
  307. package/dist/resolvers/MCPResolver.d.ts.map +1 -1
  308. package/dist/resolvers/MCPResolver.js +13 -2
  309. package/dist/resolvers/MCPResolver.js.map +1 -1
  310. package/dist/resolvers/MergeRecordsResolver.d.ts +8 -1
  311. package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
  312. package/dist/resolvers/MergeRecordsResolver.js +31 -3
  313. package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
  314. package/dist/resolvers/PipelineProgressResolver.d.ts +6 -0
  315. package/dist/resolvers/PipelineProgressResolver.d.ts.map +1 -1
  316. package/dist/resolvers/PipelineProgressResolver.js +5 -3
  317. package/dist/resolvers/PipelineProgressResolver.js.map +1 -1
  318. package/dist/resolvers/QueryResolver.d.ts.map +1 -1
  319. package/dist/resolvers/QueryResolver.js +20 -6
  320. package/dist/resolvers/QueryResolver.js.map +1 -1
  321. package/dist/resolvers/QuerySystemUserResolver.d.ts +38 -0
  322. package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
  323. package/dist/resolvers/QuerySystemUserResolver.js +184 -88
  324. package/dist/resolvers/QuerySystemUserResolver.js.map +1 -1
  325. package/dist/resolvers/RSUResolver.d.ts.map +1 -1
  326. package/dist/resolvers/RSUResolver.js +12 -0
  327. package/dist/resolvers/RSUResolver.js.map +1 -1
  328. package/dist/resolvers/RealtimeBridgeResolver.d.ts.map +1 -1
  329. package/dist/resolvers/RealtimeBridgeResolver.js +1 -0
  330. package/dist/resolvers/RealtimeBridgeResolver.js.map +1 -1
  331. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +22 -2
  332. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
  333. package/dist/resolvers/RealtimeClientSessionResolver.js +118 -33
  334. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
  335. package/dist/resolvers/RemoteBrowserActionResolver.d.ts +62 -10
  336. package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
  337. package/dist/resolvers/RemoteBrowserActionResolver.js +224 -39
  338. package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
  339. package/dist/resolvers/RunAIAgentResolver.d.ts +80 -16
  340. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  341. package/dist/resolvers/RunAIAgentResolver.js +388 -125
  342. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  343. package/dist/resolvers/RunAIPromptResolver.d.ts +5 -3
  344. package/dist/resolvers/RunAIPromptResolver.d.ts.map +1 -1
  345. package/dist/resolvers/RunAIPromptResolver.js +19 -18
  346. package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
  347. package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
  348. package/dist/resolvers/RunTemplateResolver.js +7 -5
  349. package/dist/resolvers/RunTemplateResolver.js.map +1 -1
  350. package/dist/resolvers/RunTestResolver.d.ts.map +1 -1
  351. package/dist/resolvers/RunTestResolver.js +3 -1
  352. package/dist/resolvers/RunTestResolver.js.map +1 -1
  353. package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
  354. package/dist/resolvers/SyncDataResolver.js +4 -0
  355. package/dist/resolvers/SyncDataResolver.js.map +1 -1
  356. package/dist/resolvers/TestQuerySQLResolver.d.ts.map +1 -1
  357. package/dist/resolvers/TestQuerySQLResolver.js +1 -0
  358. package/dist/resolvers/TestQuerySQLResolver.js.map +1 -1
  359. package/dist/resolvers/TransactionGroupResolver.d.ts +17 -2
  360. package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
  361. package/dist/resolvers/TransactionGroupResolver.js +60 -15
  362. package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
  363. package/dist/resolvers/UserViewResolver.d.ts +1 -1
  364. package/dist/resolvers/UserViewResolver.d.ts.map +1 -1
  365. package/dist/resolvers/UserViewResolver.js +2 -1
  366. package/dist/resolvers/UserViewResolver.js.map +1 -1
  367. package/dist/resolvers/meetingRecordingRegistration.d.ts.map +1 -1
  368. package/dist/resolvers/meetingRecordingRegistration.js +2 -0
  369. package/dist/resolvers/meetingRecordingRegistration.js.map +1 -1
  370. package/dist/rest/EntityCRUDHandler.d.ts +6 -0
  371. package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
  372. package/dist/rest/EntityCRUDHandler.js +19 -5
  373. package/dist/rest/EntityCRUDHandler.js.map +1 -1
  374. package/dist/rest/MediaAccessKeys.d.ts.map +1 -1
  375. package/dist/rest/MediaAccessKeys.js +6 -2
  376. package/dist/rest/MediaAccessKeys.js.map +1 -1
  377. package/dist/rest/OAuthCallbackHandler.d.ts.map +1 -1
  378. package/dist/rest/OAuthCallbackHandler.js +11 -5
  379. package/dist/rest/OAuthCallbackHandler.js.map +1 -1
  380. package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
  381. package/dist/rest/RESTEndpointHandler.js +8 -5
  382. package/dist/rest/RESTEndpointHandler.js.map +1 -1
  383. package/dist/rest/RealtimeRecordingHandler.d.ts +3 -3
  384. package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -1
  385. package/dist/rest/RealtimeRecordingHandler.js +6 -8
  386. package/dist/rest/RealtimeRecordingHandler.js.map +1 -1
  387. package/dist/rest/ViewOperationsHandler.d.ts +6 -0
  388. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  389. package/dist/rest/ViewOperationsHandler.js +24 -6
  390. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  391. package/dist/rest/setupRESTEndpoints.d.ts +3 -1
  392. package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
  393. package/dist/rest/setupRESTEndpoints.js +11 -2
  394. package/dist/rest/setupRESTEndpoints.js.map +1 -1
  395. package/dist/serverRoleConfigUnits.d.ts +29 -0
  396. package/dist/serverRoleConfigUnits.d.ts.map +1 -0
  397. package/dist/serverRoleConfigUnits.js +33 -0
  398. package/dist/serverRoleConfigUnits.js.map +1 -0
  399. package/dist/services/DurableEntityActionTaskSubmitter.d.ts.map +1 -1
  400. package/dist/services/DurableEntityActionTaskSubmitter.js +6 -1
  401. package/dist/services/DurableEntityActionTaskSubmitter.js.map +1 -1
  402. package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
  403. package/dist/services/TaskGraphActionRunner.js +2 -26
  404. package/dist/services/TaskGraphActionRunner.js.map +1 -1
  405. package/dist/services/TaskGraphAgentRunner.d.ts +6 -0
  406. package/dist/services/TaskGraphAgentRunner.d.ts.map +1 -1
  407. package/dist/services/TaskGraphAgentRunner.js +38 -0
  408. package/dist/services/TaskGraphAgentRunner.js.map +1 -1
  409. package/dist/services/TaskGraphContinuationDeliverer.d.ts +5 -0
  410. package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
  411. package/dist/services/TaskGraphContinuationDeliverer.js +43 -15
  412. package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
  413. package/dist/services/WorkQueueHostService.d.ts +2 -1
  414. package/dist/services/WorkQueueHostService.d.ts.map +1 -1
  415. package/dist/services/WorkQueueHostService.js +19 -4
  416. package/dist/services/WorkQueueHostService.js.map +1 -1
  417. package/dist/services/workQueueConfig.d.ts +2 -2
  418. package/dist/services/workQueueConfig.js +5 -5
  419. package/dist/services/workQueueConfig.js.map +1 -1
  420. package/dist/sharedCache.js +1 -1
  421. package/dist/sharedCache.js.map +1 -1
  422. package/dist/types.d.ts +40 -1
  423. package/dist/types.d.ts.map +1 -1
  424. package/dist/types.js.map +1 -1
  425. package/package.json +98 -98
  426. package/src/__tests__/APIKeyScopeAuth.test.ts +4 -8
  427. package/src/__tests__/ActionResolver.fieldSecurity.test.ts +237 -0
  428. package/src/__tests__/ActiveOperations.test.ts +68 -0
  429. package/src/__tests__/AdhocQueryResolver.dialect.test.ts +137 -0
  430. package/src/__tests__/AgentRunStatusPublisher.test.ts +49 -0
  431. package/src/__tests__/AgentSessionResolver.ownership.test.ts +150 -0
  432. package/src/__tests__/AssertTargetConfigs.test.ts +75 -0
  433. package/src/__tests__/BatchApplyParity.test.ts +109 -0
  434. package/src/__tests__/BridgeHostInstance.test.ts +42 -0
  435. package/src/__tests__/CollectInactiveRowWarnings.test.ts +115 -0
  436. package/src/__tests__/ConnectionPause.test.ts +192 -0
  437. package/src/__tests__/ConnectionPauseResolver.test.ts +166 -0
  438. package/src/__tests__/ConnectionPauseSave.test.ts +143 -0
  439. package/src/__tests__/CustomColumnPromoterCompletion.test.ts +142 -0
  440. package/src/__tests__/CustomColumnPromoterOnePass.test.ts +15 -1
  441. package/src/__tests__/DeleteConnectionRemovesPerConnectionCatalog.test.ts +51 -0
  442. package/src/__tests__/DetachedDiscoveryStart.test.ts +65 -0
  443. package/src/__tests__/DurableEntityActionTaskSubmitter.test.ts +73 -0
  444. package/src/__tests__/EntityCommunicationsResolver.actingUser.test.ts +151 -0
  445. package/src/__tests__/EntityMapLifecycle.rekey.test.ts +252 -0
  446. package/src/__tests__/EvolutionActsOnWhatItDetects.test.ts +113 -0
  447. package/src/__tests__/ExecuteRemoteOperationResolver.test.ts +213 -0
  448. package/src/__tests__/FetchEntityVectorsResolver.test.ts +206 -3
  449. package/src/__tests__/FileResolver.fieldSecurity.test.ts +82 -0
  450. package/src/__tests__/HandoffOfferExpiry.test.ts +40 -0
  451. package/src/__tests__/IntegrationRunArtifactAuthorization.test.ts +126 -0
  452. package/src/__tests__/MagicLinkKeys.test.ts +102 -0
  453. package/src/__tests__/MediaAccessKeys.test.ts +57 -10
  454. package/src/__tests__/NewArrivalsDefaultDisabled.test.ts +50 -0
  455. package/src/__tests__/ObjectNamesByID.test.ts +176 -0
  456. package/src/__tests__/PipelineProgressResolver.filter.test.ts +58 -0
  457. package/src/__tests__/PostRestartMapsInCatalogScope.test.ts +146 -0
  458. package/src/__tests__/QuerySystemUserResolver.childRows.test.ts +80 -0
  459. package/src/__tests__/QuerySystemUserResolver.collision.test.ts +200 -0
  460. package/src/__tests__/QuerySystemUserResolver.fieldSecurity.test.ts +49 -0
  461. package/src/__tests__/QuerySystemUserResolver.permissions.test.ts +132 -0
  462. package/src/__tests__/RESTEndpointHandler.test.ts +25 -0
  463. package/src/__tests__/RSUPostRestartProgress.test.ts +343 -0
  464. package/src/__tests__/RSUProgressBridge.test.ts +188 -5
  465. package/src/__tests__/RSUStartupSweepWiring.test.ts +30 -0
  466. package/src/__tests__/ReactivateRefreshMessage.test.ts +10 -3
  467. package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +23 -3
  468. package/src/__tests__/RealtimeClientSessionResolver.test.ts +346 -46
  469. package/src/__tests__/{RefreshAdoptsNewColumns.test.ts → RefreshReportsNewColumns.test.ts} +25 -16
  470. package/src/__tests__/RemoteBrowserActionRecovery.test.ts +287 -0
  471. package/src/__tests__/RemoteBrowserActionResolver.goalRunLink.test.ts +3 -0
  472. package/src/__tests__/RemoteBrowserActionResolver.ownership.test.ts +100 -0
  473. package/src/__tests__/RemoteBrowserAudioStream.test.ts +3 -0
  474. package/src/__tests__/RemoteBrowserSnapshot.test.ts +3 -0
  475. package/src/__tests__/ResolverBase.clientOldValues.test.ts +344 -14
  476. package/src/__tests__/ResolverBase.deleteReturnProjection.test.ts +52 -0
  477. package/src/__tests__/ResolverBase.encryptedApiZeroReencrypt.test.ts +307 -0
  478. package/src/__tests__/ResolverBase.entityMessageRelay.test.ts +227 -0
  479. package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +83 -1
  480. package/src/__tests__/ResolverBase.publishStatusUpdate.test.ts +68 -0
  481. package/src/__tests__/ResolverBase.userViewCacheAndDedup.test.ts +130 -0
  482. package/src/__tests__/RunAIAgentResolver.branch.test.ts +72 -13
  483. package/src/__tests__/RunAIAgentResolver.consultPredecessor.test.ts +289 -0
  484. package/src/__tests__/RunAIAgentResolver.conversationWriter.test.ts +210 -0
  485. package/src/__tests__/RunAIAgentResolver.fireAndForgetCompletion.test.ts +209 -0
  486. package/src/__tests__/RunAIAgentResolver.handoff.test.ts +649 -0
  487. package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +19 -27
  488. package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +10 -2
  489. package/src/__tests__/RunAIAgentResolver.serverReply.test.ts +358 -0
  490. package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +91 -13
  491. package/src/__tests__/RunTemplateResolver.test.ts +35 -2
  492. package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +11 -0
  493. package/src/__tests__/SchemaEvolutionCustomColumns.test.ts +119 -0
  494. package/src/__tests__/SchemaRefreshLaunch.test.ts +24 -2
  495. package/src/__tests__/ScopedFieldsForBuild.test.ts +192 -0
  496. package/src/__tests__/SessionJanitor.test.ts +195 -4
  497. package/src/__tests__/SessionManager.test.ts +164 -0
  498. package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +2 -2
  499. package/src/__tests__/TaskGraphAgentRunner.test.ts +272 -16
  500. package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +114 -3
  501. package/src/__tests__/TransactionGroupResolver.fieldSecurity.test.ts +199 -0
  502. package/src/__tests__/UserViewResolver.updateWhereClause.test.ts +15 -0
  503. package/src/__tests__/ViewOperationsHandler.test.ts +9 -7
  504. package/src/__tests__/WidgetSessionService.test.ts +583 -4
  505. package/src/__tests__/WorkQueueHostService.test.ts +25 -7
  506. package/src/__tests__/apiRootBoot.test.ts +1 -1
  507. package/src/__tests__/backgroundSweepConfigUnits.test.ts +153 -0
  508. package/src/__tests__/buildMagicLinkSessionUser.test.ts +96 -0
  509. package/src/__tests__/cacheBroadcastProviders.test.ts +403 -0
  510. package/src/__tests__/cacheInvalidationRecordData.test.ts +45 -0
  511. package/src/__tests__/contextRequestOrigin.test.ts +105 -0
  512. package/src/__tests__/conversationBrowsers.test.ts +62 -0
  513. package/src/__tests__/fieldSecurityFixtures.ts +91 -0
  514. package/src/__tests__/globalCors.test.ts +3 -3
  515. package/src/__tests__/localDevAuth.test.ts +196 -0
  516. package/src/__tests__/magicLinkExtensionCapabilities.test.ts +413 -0
  517. package/src/__tests__/orphanedConversationDetailReconciler.start.test.ts +82 -0
  518. package/src/__tests__/orphanedConversationDetailReconciler.test.ts +10 -0
  519. package/src/__tests__/ownedRealtimeSession.test.ts +14 -0
  520. package/src/__tests__/pushStatusResolver.filter.test.ts +57 -1
  521. package/src/__tests__/realtimeRecordingHandler.test.ts +24 -2
  522. package/src/__tests__/realtimeSessions/RealtimeSessionEventsResolver.test.ts +29 -1
  523. package/src/__tests__/realtimeSessions/ownedRealtimeSession.anonymous.test.ts +31 -0
  524. package/src/__tests__/realtimeSessions/ownedRealtimeSession.namedScoped.test.ts +37 -0
  525. package/src/__tests__/realtimeSessions/sessionAccess.test.ts +224 -7
  526. package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +1 -1
  527. package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +25 -4
  528. package/src/__tests__/requestOrigin.test.ts +104 -0
  529. package/src/__tests__/resolverBase.cloudEventChangedFields.test.ts +157 -0
  530. package/src/__tests__/resolverBase.fieldSecurityTransport.test.ts +222 -0
  531. package/src/__tests__/resolverBase.fls.test.ts +146 -97
  532. package/src/__tests__/restTransport.fieldSecurity.test.ts +148 -0
  533. package/src/__tests__/runParamsTimeZone.test.ts +179 -0
  534. package/src/__tests__/runStreams.fieldSecurity.test.ts +100 -0
  535. package/src/__tests__/runViewProperties.test.ts +114 -0
  536. package/src/__tests__/scalabilityBenchmarks.test.ts +765 -0
  537. package/src/__tests__/scalabilityDatabaseIntegration.test.ts +207 -0
  538. package/src/__tests__/securityHardeningPr6034.test.ts +120 -0
  539. package/src/__tests__/sessionDeadline.test.ts +51 -0
  540. package/src/__tests__/sessionUserClone.test.ts +5 -1
  541. package/src/__tests__/sharedCache.test.ts +11 -0
  542. package/src/__tests__/startupSweepOrder.test.ts +40 -0
  543. package/src/__tests__/unifiedAuth.test.ts +101 -1
  544. package/src/__tests__/widgetGuestElevation.test.ts +2 -0
  545. package/src/agentSessions/BridgeHostInstance.ts +20 -5
  546. package/src/agentSessions/HandoffOfferExpiry.ts +18 -0
  547. package/src/agentSessions/ReturningVisitorRecap.ts +1 -0
  548. package/src/agentSessions/SessionJanitor.ts +95 -45
  549. package/src/agentSessions/SessionManager.ts +73 -20
  550. package/src/agentSessions/conversationBrowsers.ts +143 -0
  551. package/src/agentSessions/sessionDeadline.ts +81 -0
  552. package/src/auth/APIKeyScopeAuth.ts +5 -4
  553. package/src/auth/AuthProviderCatalogRouter.ts +3 -0
  554. package/src/auth/__tests__/loginEmailResolution.test.ts +67 -0
  555. package/src/auth/index.ts +56 -12
  556. package/src/auth/initializeProviders.ts +43 -1
  557. package/src/auth/localDevAuth.ts +528 -0
  558. package/src/auth/loginEmailResolution.ts +67 -0
  559. package/src/auth/magicLink/MagicLinkKeys.ts +147 -15
  560. package/src/auth/magicLink/MagicLinkRouter.ts +33 -6
  561. package/src/auth/magicLink/MagicLinkService.ts +250 -10
  562. package/src/auth/magicLink/index.ts +1 -1
  563. package/src/auth/magicLink/redeemLanding.ts +7 -4
  564. package/src/auth/magicLink/types.ts +38 -3
  565. package/src/auth/newUsers.ts +1 -0
  566. package/src/auth/sessionUserClone.ts +3 -2
  567. package/src/backgroundSweepConfigUnits.ts +213 -0
  568. package/src/broadcast/BaseCacheInvalidationBroadcastProvider.ts +674 -0
  569. package/src/broadcast/index.ts +5 -0
  570. package/src/broadcast/providers/AWSIoTCoreBroadcastProvider.ts +180 -0
  571. package/src/broadcast/providers/AzureWebPubSubBroadcastProvider.ts +182 -0
  572. package/src/broadcast/providers/GCPPubSubBroadcastProvider.ts +169 -0
  573. package/src/broadcast/providers/SequencedRoleBucketBroadcastProvider.ts +57 -0
  574. package/src/cache.ts +2 -1
  575. package/src/config.ts +138 -0
  576. package/src/context.ts +71 -14
  577. package/src/coreRoutes.ts +29 -7
  578. package/src/generated/graphql-schemas/__mj.ts +4145 -1193
  579. package/src/generic/CacheInvalidationResolver.ts +135 -78
  580. package/src/generic/OrphanedConversationDetailReconciler.ts +36 -3
  581. package/src/generic/PubSubManager.ts +54 -1
  582. package/src/generic/PushStatusResolver.ts +108 -11
  583. package/src/generic/ResolverBase.ts +635 -234
  584. package/src/generic/RunViewResolver.ts +176 -64
  585. package/src/generic/actionOutputFieldSecurity.ts +75 -0
  586. package/src/generic/fieldSecurityTransport.ts +62 -0
  587. package/src/index.ts +310 -85
  588. package/src/integration/ConnectionPause.ts +222 -0
  589. package/src/integration/CustomColumnPromoter.ts +129 -54
  590. package/src/integration/EntityMapLifecycle.ts +229 -6
  591. package/src/integration/InactiveRowWarnings.ts +50 -0
  592. package/src/integration/ObjectNamesByID.ts +97 -0
  593. package/src/integration/PostRestartIntrospect.ts +49 -0
  594. package/src/integration/RSUPostRestartProgress.ts +359 -0
  595. package/src/integration/RSUProgressBridge.ts +85 -2
  596. package/src/integration/RunArtifactAuthorization.ts +65 -0
  597. package/src/integration/SchemaRefreshLaunch.ts +12 -2
  598. package/src/integration/ScopedFieldsForBuild.ts +113 -0
  599. package/src/integration/TargetConfigGuard.ts +71 -0
  600. package/src/logging/variablesLoggingMiddleware.ts +59 -3
  601. package/src/realtimeSessions/README.md +7 -3
  602. package/src/realtimeSessions/SessionVerificationPortsBase.ts +1 -0
  603. package/src/realtimeSessions/ownedRealtimeSession.ts +16 -6
  604. package/src/realtimeSessions/sessionAccess.ts +211 -25
  605. package/src/realtimeSessions/sessionConfigStamps.ts +1 -1
  606. package/src/realtimeSessions/subscriptionAuthorization.ts +4 -2
  607. package/src/realtimeSessions/verificationWorkflow.ts +3 -1
  608. package/src/realtimeWidget/WidgetRouter.ts +22 -4
  609. package/src/realtimeWidget/WidgetSessionService.ts +254 -17
  610. package/src/realtimeWidget/host-identity.ts +1 -1
  611. package/src/realtimeWidget/visitorIdentity.ts +1 -0
  612. package/src/realtimeWidget/widgetCore.ts +34 -9
  613. package/src/realtimeWidget/widgetGuestElevation.ts +3 -1
  614. package/src/requestOrigin.ts +64 -0
  615. package/src/resolvers/ActionResolver.ts +78 -15
  616. package/src/resolvers/AdhocQueryResolver.ts +1 -0
  617. package/src/resolvers/AgentRunStatusPublisher.ts +36 -8
  618. package/src/resolvers/AgentSessionResolver.ts +50 -18
  619. package/src/resolvers/AutotagPipelineResolver.ts +2 -1
  620. package/src/resolvers/ConversationRunEventsResolver.ts +2 -0
  621. package/src/resolvers/EntityCommunicationsResolver.ts +56 -15
  622. package/src/resolvers/ExecuteRemoteOperationResolver.ts +41 -9
  623. package/src/resolvers/FetchEntityVectorsResolver.ts +132 -21
  624. package/src/resolvers/FileCategoryResolver.ts +1 -0
  625. package/src/resolvers/FileResolver.ts +14 -4
  626. package/src/resolvers/GetDataResolver.ts +35 -13
  627. package/src/resolvers/IntegrationDiscoveryResolver.ts +1570 -209
  628. package/src/resolvers/MCPResolver.ts +15 -2
  629. package/src/resolvers/MergeRecordsResolver.ts +23 -2
  630. package/src/resolvers/PipelineProgressResolver.ts +12 -3
  631. package/src/resolvers/QueryResolver.ts +20 -6
  632. package/src/resolvers/QuerySystemUserResolver.ts +207 -99
  633. package/src/resolvers/RSUResolver.ts +12 -0
  634. package/src/resolvers/RealtimeBridgeResolver.ts +1 -0
  635. package/src/resolvers/RealtimeClientSessionResolver.ts +144 -40
  636. package/src/resolvers/RemoteBrowserActionResolver.ts +252 -37
  637. package/src/resolvers/RunAIAgentResolver.ts +518 -163
  638. package/src/resolvers/RunAIPromptResolver.ts +18 -18
  639. package/src/resolvers/RunTemplateResolver.ts +9 -5
  640. package/src/resolvers/RunTestResolver.ts +3 -1
  641. package/src/resolvers/SyncDataResolver.ts +4 -0
  642. package/src/resolvers/TestQuerySQLResolver.ts +1 -0
  643. package/src/resolvers/TransactionGroupResolver.ts +66 -15
  644. package/src/resolvers/UserViewResolver.ts +2 -1
  645. package/src/resolvers/__tests__/GetDataResolver.tokens.test.ts +52 -0
  646. package/src/resolvers/__tests__/MergeRecordsResolver.test.ts +43 -0
  647. package/src/resolvers/meetingRecordingRegistration.ts +2 -0
  648. package/src/rest/EntityCRUDHandler.ts +22 -5
  649. package/src/rest/MediaAccessKeys.ts +6 -2
  650. package/src/rest/OAuthCallbackHandler.ts +13 -5
  651. package/src/rest/RESTEndpointHandler.ts +8 -5
  652. package/src/rest/RealtimeRecordingHandler.ts +9 -10
  653. package/src/rest/ViewOperationsHandler.ts +26 -7
  654. package/src/rest/setupRESTEndpoints.ts +11 -2
  655. package/src/serverRoleConfigUnits.ts +48 -0
  656. package/src/services/DurableEntityActionTaskSubmitter.ts +10 -2
  657. package/src/services/TaskGraphActionRunner.ts +2 -23
  658. package/src/services/TaskGraphAgentRunner.ts +43 -0
  659. package/src/services/TaskGraphContinuationDeliverer.ts +53 -20
  660. package/src/services/WorkQueueHostService.ts +26 -4
  661. package/src/services/workQueueConfig.ts +5 -5
  662. package/src/sharedCache.ts +1 -1
  663. package/src/types.ts +41 -1
  664. package/src/services/TaskOrchestration-Integration.md +0 -188
@@ -12,13 +12,13 @@ const REMOTE_OP_PROGRESS_TOPIC = 'RemoteOperationProgress';
12
12
  /** Input for the generic Remote Operation transport mutation. */
13
13
  @InputType()
14
14
  export class ExecuteRemoteOperationInput {
15
- @Field()
15
+ @Field(() => String)
16
16
  operationKey: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
17
17
 
18
- @Field()
18
+ @Field(() => String)
19
19
  inputJSON: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
20
20
 
21
- @Field()
21
+ @Field(() => String)
22
22
  invokeMode: string; // 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
  /**
@@ -28,16 +28,24 @@ export class ExecuteRemoteOperationInput {
28
28
  */
29
29
  @Field(() => String, { nullable: true })
30
30
  progressChannelId?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
31
+
32
+ /**
33
+ * Optional structural contract fingerprint emitted by CodeGen (or supplied by the caller).
34
+ * When provided, the server rejects requests whose fingerprint diverges from the server's
35
+ * active operation contract with `ResultCode = 'CONTRACT_MISMATCH'`.
36
+ */
37
+ @Field(() => String, { nullable: true })
38
+ contractFingerprint?: string; // case-violation-ok-legacy-back-compat: matches camelCase GraphQL input field convention on ExecuteRemoteOperationInput
31
39
  }
32
40
 
33
41
  /** A single streamed progress envelope delivered over the `RemoteOperationProgress` subscription. */
34
42
  @ObjectType()
35
43
  export class RemoteOperationProgressNotification {
36
- @Field()
44
+ @Field(() => String)
37
45
  ChannelId: string;
38
46
 
39
47
  /** JSON-serialized {@link RemoteOpProgress}. */
40
- @Field()
48
+ @Field(() => String)
41
49
  ProgressJSON: string;
42
50
  }
43
51
 
@@ -71,7 +79,7 @@ export class ExecuteRemoteOperationResultType {
71
79
  export class ExecuteRemoteOperationResolver extends ResolverBase {
72
80
  @Mutation(() => ExecuteRemoteOperationResultType)
73
81
  async ExecuteRemoteOperation(
74
- @Arg('input') input: ExecuteRemoteOperationInput,
82
+ @Arg('input', () => ExecuteRemoteOperationInput) input: ExecuteRemoteOperationInput,
75
83
  @Ctx() ctx: AppContext,
76
84
  @PubSub() pubSub: PubSubEngine,
77
85
  ): Promise<ExecuteRemoteOperationResultType> {
@@ -111,9 +119,24 @@ export class ExecuteRemoteOperationResolver extends ResolverBase {
111
119
  return fail(invokability.ResultCode ?? 'OPERATION_UNAVAILABLE', invokability.Reason ?? `Operation '${key}' is unavailable`);
112
120
  }
113
121
 
114
- let parsedInput: unknown;
122
+ // (5) Contract fingerprint gate: when the client sends a contractFingerprint, verify it against
123
+ // the active server operation's ContractFingerprint (or metadata-derived fingerprint) so stale
124
+ // client bundles fail loudly with CONTRACT_MISMATCH rather than mis-deserializing.
125
+ const clientFingerprint = input.contractFingerprint?.trim();
126
+ if (clientFingerprint) {
127
+ const expectedFingerprint =
128
+ opDecl?.ContractFingerprint ?? RemoteOperationEngineBase.Instance.GetContractFingerprint(key);
129
+ if (expectedFingerprint && clientFingerprint !== expectedFingerprint) {
130
+ return fail(
131
+ 'CONTRACT_MISMATCH',
132
+ `Contract fingerprint mismatch for operation '${key}' (client='${clientFingerprint}', server='${expectedFingerprint}')`,
133
+ );
134
+ }
135
+ }
136
+
137
+ let parsedInput: object | string | number | boolean | null;
115
138
  try {
116
- parsedInput = input.inputJSON ? JSON.parse(input.inputJSON) : {};
139
+ parsedInput = input.inputJSON ? (JSON.parse(input.inputJSON) as object | string | number | boolean | null) : {};
117
140
  } catch (e) {
118
141
  return fail('INVALID_INPUT_JSON', `Invalid input JSON: ${e instanceof Error ? e.message : String(e)}`);
119
142
  }
@@ -127,7 +150,16 @@ export class ExecuteRemoteOperationResolver extends ResolverBase {
127
150
  : undefined;
128
151
 
129
152
  // Route through the per-request provider (server in-process path; runs the op's Authorize + InternalExecute).
130
- const result = await provider.RouteOperation(key, parsedInput, { user, mode: input.invokeMode as RemoteOpInvokeMode, onProgress });
153
+ const result = await provider.RouteOperation(key, parsedInput, {
154
+ user,
155
+ mode: input.invokeMode as RemoteOpInvokeMode,
156
+ onProgress,
157
+ contractFingerprint: clientFingerprint,
158
+ requestOrigin: ctx.RequestOrigin,
159
+ clientIp: ctx.ClientIp,
160
+ sessionId: ctx.userPayload?.sessionId,
161
+ apiKeyHash: ctx.userPayload?.apiKeyHash,
162
+ });
131
163
 
132
164
  return {
133
165
  success: result.Success,
@@ -50,6 +50,12 @@ type LabelledVector = { row: StoredVectorRow; labels: Record<string, string> };
50
50
  /** Most Entity Record Document IDs named in one `ID IN (...)` filter when fetching VectorJSON. */
51
51
  const VECTOR_FETCH_CHUNK_SIZE = 1000;
52
52
 
53
+ /** Most record keys named in one view when checking which matched records the caller may read. */
54
+ const READABLE_KEY_CHECK_CHUNK_SIZE = 1000;
55
+
56
+ /** A match returned by an external vector index's `QueryIndex`. */
57
+ type IndexMatch = { id: string; values?: number[]; metadata?: Record<string, unknown>; score?: number };
58
+
53
59
  /* ───── Resolver ───── */
54
60
 
55
61
  @Resolver()
@@ -70,15 +76,18 @@ export class FetchEntityVectorsResolver extends ResolverBase {
70
76
  }
71
77
 
72
78
  const limit = maxRecords ?? 1000;
79
+ // Every read runs on this request's provider.
80
+ const md = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true }) ?? Metadata.Provider;
81
+ const rv = RunView.FromMetadataProvider(md);
73
82
 
74
83
  // Step 1: Load the EntityDocument
75
- const entityDoc = await this.loadEntityDocument(entityDocumentID, currentUser);
84
+ const entityDoc = await this.loadEntityDocument(entityDocumentID, currentUser, rv);
76
85
  if (!entityDoc) {
77
86
  return this.errorResult(`EntityDocument not found: ${entityDocumentID}`, startTime);
78
87
  }
79
88
 
80
89
  // Step 2: Resolve the VectorIndex
81
- const vectorIndex = await this.resolveVectorIndex(entityDoc, currentUser);
90
+ const vectorIndex = await this.resolveVectorIndex(entityDoc, currentUser, rv);
82
91
  if (!vectorIndex) {
83
92
  return this.errorResult(
84
93
  `Could not resolve VectorIndex for EntityDocument "${entityDoc.Name}"`,
@@ -87,7 +96,7 @@ export class FetchEntityVectorsResolver extends ResolverBase {
87
96
  }
88
97
 
89
98
  // Step 3: Create VectorDB provider instance
90
- const vectorDBInstance = await this.createVectorDBInstance(vectorIndex, currentUser);
99
+ const vectorDBInstance = await this.createVectorDBInstance(vectorIndex, currentUser, rv);
91
100
  if (!vectorDBInstance) {
92
101
  return this.errorResult(
93
102
  `Could not create VectorDB provider for index "${vectorIndex.Name}"`,
@@ -100,12 +109,21 @@ export class FetchEntityVectorsResolver extends ResolverBase {
100
109
  // document ID rather than the index name, and return matches without vector values.
101
110
  // Read the stored Entity Record Document rows instead.
102
111
  if (vectorDBInstance.QueryKeyIsEntityDocumentID) {
103
- const md = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true }) ?? Metadata.Provider;
104
- const results = await this.fetchStoredVectors(entityDoc, limit, filter, currentUser, md);
112
+ const results = await this.fetchStoredVectors(entityDoc, limit, filter, currentUser, md, rv);
105
113
  LogStatus(`FetchEntityVectors: Loaded ${results.length} stored vectors for entity "${entityDoc.Entity}" in ${Date.now() - startTime}ms`);
106
114
  return { Success: true, Results: results, TotalCount: results.length, ElapsedMs: Date.now() - startTime };
107
115
  }
108
116
 
117
+ // The external index was built under whoever ran the sync and is not filtered for this
118
+ // caller, so check here that they may read the source entity at all.
119
+ const entityInfo = this.readableEntity(entityDoc.Entity, currentUser, md);
120
+ if (!entityInfo) {
121
+ return this.errorResult(
122
+ `Entity "${entityDoc.Entity}" does not exist or you do not have permission to read it`,
123
+ startTime
124
+ );
125
+ }
126
+
109
127
  // Step 4: Query with zero vector + Entity metadata filter.
110
128
  // Pinecone's list API doesn't support metadata filtering, but query does.
111
129
  // A zero vector returns results in arbitrary order (similarity is meaningless),
@@ -136,12 +154,15 @@ export class FetchEntityVectorsResolver extends ResolverBase {
136
154
  );
137
155
  }
138
156
 
139
- // Step 5: Convert query matches to result format
140
- const matches = (queryResponse.data as { matches?: Array<{ id: string; values?: number[]; metadata?: Record<string, unknown>; score?: number }> }).matches ?? [];
157
+ // Step 5: Keep only matches for records this caller may read (the index is not filtered
158
+ // by row-level security), then convert them without the fields this caller may not read
159
+ const allMatches = (queryResponse.data as { matches?: IndexMatch[] }).matches ?? [];
160
+ const matches = await this.readableMatches(entityInfo, allMatches, currentUser, rv);
161
+ const denied = entityInfo.GetDeniedReadFields(currentUser);
141
162
  const results: EntityVectorItem[] = matches.map(match => ({
142
163
  ID: match.id,
143
164
  Values: match.values ?? [],
144
- Metadata: JSON.stringify(match.metadata ?? {}),
165
+ Metadata: JSON.stringify(this.withoutDeniedFields(match.metadata ?? {}, denied)),
145
166
  }));
146
167
  LogStatus(`FetchEntityVectors: Queried ${results.length} vectors for entity "${entityName}" in ${Date.now() - startTime}ms`);
147
168
 
@@ -158,12 +179,100 @@ export class FetchEntityVectorsResolver extends ResolverBase {
158
179
  }
159
180
  }
160
181
 
182
+ /**
183
+ * The entity's metadata when `contextUser` may read it, else null — whether it is missing or
184
+ * unreadable is deliberately not distinguished.
185
+ */
186
+ private readableEntity(entityName: string, contextUser: UserInfo, md: IMetadataProvider): EntityInfo | null {
187
+ const entityInfo = md.EntityByName(entityName);
188
+ if (!entityInfo) return null;
189
+ return entityInfo.GetUserPermisions(contextUser)?.CanRead ? entityInfo : null;
190
+ }
191
+
192
+ /**
193
+ * The matches whose record `contextUser` may read, in their original order. A match is kept only
194
+ * when its `RecordID` metadata names a key of the entity and a view run as `contextUser` returns
195
+ * that record; a match without a usable record ID cannot be checked, so it is dropped.
196
+ */
197
+ private async readableMatches(entityInfo: EntityInfo, matches: IndexMatch[], contextUser: UserInfo, rv: RunView): Promise<IndexMatch[]> {
198
+ const keyed = matches
199
+ .map(match => ({ match, key: this.matchRecordKey(entityInfo, match) }))
200
+ .filter((m): m is { match: IndexMatch; key: CompositeKey } => m.key !== null);
201
+ if (keyed.length === 0) return [];
202
+ const readable = await this.loadReadableKeys(entityInfo, keyed.map(k => k.key), contextUser, rv);
203
+ return keyed.filter(k => readable.has(this.canonicalKey(k.key))).map(k => k.match);
204
+ }
205
+
206
+ /** The record key a match's `RecordID` metadata names, or null when it names no key of the entity. */
207
+ private matchRecordKey(entityInfo: EntityInfo, match: IndexMatch): CompositeKey | null {
208
+ const recordID = match.metadata?.RecordID;
209
+ if (typeof recordID !== 'string' || recordID.length === 0) return null;
210
+ try {
211
+ return CompositeKey.FromRecordID(entityInfo, recordID);
212
+ } catch {
213
+ return null; // field names that are not the entity's primary key: never put into SQL
214
+ }
215
+ }
216
+
217
+ /**
218
+ * The canonical forms of the keys among `keys` whose record a view run as `contextUser` returns.
219
+ * The keys are checked in lists of at most {@link READABLE_KEY_CHECK_CHUNK_SIZE}, all sent in one
220
+ * `RunViews` batch.
221
+ */
222
+ private async loadReadableKeys(entityInfo: EntityInfo, keys: CompositeKey[], contextUser: UserInfo, rv: RunView): Promise<Set<string>> {
223
+ const views: RunViewParams[] = [];
224
+ for (let i = 0; i < keys.length; i += READABLE_KEY_CHECK_CHUNK_SIZE) {
225
+ views.push({
226
+ EntityName: entityInfo.Name,
227
+ ExtraFilter: this.keyFilter(entityInfo, keys.slice(i, i + READABLE_KEY_CHECK_CHUNK_SIZE)),
228
+ Fields: entityInfo.PrimaryKeys.map(pk => pk.Name),
229
+ IgnoreMaxRows: true,
230
+ BypassCache: true, // one-off key lists: a cache slot per call would only hold memory
231
+ ResultType: 'simple',
232
+ });
233
+ }
234
+ const readable = new Set<string>();
235
+ const results = await rv.RunViews<Record<string, unknown>>(views, contextUser);
236
+ for (const result of results) {
237
+ if (!result.Success) {
238
+ throw new Error(`Failed to check access to "${entityInfo.Name}" records: ${result.ErrorMessage}`);
239
+ }
240
+ for (const row of result.Results) {
241
+ readable.add(this.canonicalKey(CompositeKey.FromEntityRecord(entityInfo, row)));
242
+ }
243
+ }
244
+ return readable;
245
+ }
246
+
247
+ /** A filter matching exactly `keys`: `PK IN (...)` for a single-column key, one clause per key otherwise. */
248
+ private keyFilter(entityInfo: EntityInfo, keys: CompositeKey[]): string {
249
+ if (entityInfo.PrimaryKeys.length === 1) {
250
+ const values = keys.map(k => `'${EscapeSQLString(String(k.KeyValuePairs[0].Value))}'`).join(',');
251
+ return `${entityInfo.FirstPrimaryKey.Name} IN (${values})`; // first-pk-ok: single-column key, checked above
252
+ }
253
+ return keys.map(k => `(${k.ToWhereClause()})`).join(' OR ');
254
+ }
255
+
256
+ /** A key's field names and values, lower-cased, so keys from the index and from a view compare equal. */
257
+ private canonicalKey(key: CompositeKey): string {
258
+ return key.KeyValuePairs.map(kv => `${kv.FieldName.toLowerCase()}|${String(kv.Value).toLowerCase()}`).join('||');
259
+ }
260
+
261
+ /**
262
+ * A copy of a vector's metadata without the keys naming fields in `denied` (lowercased field
263
+ * names, as `EntityInfo.GetDeniedReadFields` returns them), compared case-insensitively.
264
+ */
265
+ private withoutDeniedFields(metadata: Record<string, unknown>, denied: Set<string>): Record<string, unknown> {
266
+ if (denied.size === 0) return metadata;
267
+ return Object.fromEntries(Object.entries(metadata).filter(([key]) => !denied.has(key.toLowerCase())));
268
+ }
269
+
161
270
  /** Load EntityDocument by ID */
162
271
  private async loadEntityDocument(
163
272
  entityDocumentID: string,
164
- contextUser: UserInfo
273
+ contextUser: UserInfo,
274
+ rv: RunView
165
275
  ): Promise<MJEntityDocumentEntity | null> {
166
- const rv = new RunView();
167
276
  const result = await rv.RunView<MJEntityDocumentEntity>({
168
277
  EntityName: 'MJ: Entity Documents',
169
278
  ExtraFilter: `ID='${EscapeSQLString(entityDocumentID)}'`,
@@ -183,9 +292,9 @@ export class FetchEntityVectorsResolver extends ResolverBase {
183
292
  */
184
293
  private async resolveVectorIndex(
185
294
  entityDoc: MJEntityDocumentEntity,
186
- contextUser: UserInfo
295
+ contextUser: UserInfo,
296
+ rv: RunView
187
297
  ): Promise<MJVectorIndexEntity | null> {
188
- const rv = new RunView();
189
298
 
190
299
  // If the EntityDocument has an explicit VectorIndexID, use it directly
191
300
  if (entityDoc.VectorIndexID) {
@@ -222,9 +331,9 @@ export class FetchEntityVectorsResolver extends ResolverBase {
222
331
  /** Create a VectorDBBase provider instance for a given VectorIndex */
223
332
  private async createVectorDBInstance(
224
333
  vectorIndex: MJVectorIndexEntity,
225
- contextUser: UserInfo
334
+ contextUser: UserInfo,
335
+ rv: RunView
226
336
  ): Promise<VectorDBBase | null> {
227
- const rv = new RunView();
228
337
  const dbResult = await rv.RunView<MJVectorDatabaseEntity>({
229
338
  EntityName: 'MJ: Vector Databases',
230
339
  ExtraFilter: `ID='${vectorIndex.VectorDatabaseID}'`,
@@ -258,19 +367,20 @@ export class FetchEntityVectorsResolver extends ResolverBase {
258
367
  limit: number,
259
368
  filter: string | undefined,
260
369
  contextUser: UserInfo,
261
- md: IMetadataProvider
370
+ md: IMetadataProvider,
371
+ rv: RunView
262
372
  ): Promise<EntityVectorItem[]> {
263
373
  const entityInfo = md.EntityByName(entityDoc.Entity);
264
374
  if (!entityInfo) {
265
375
  throw new Error(`Entity "${entityDoc.Entity}" not found in metadata`);
266
376
  }
267
377
  const nameFields = this.labelFieldNames(entityInfo);
268
- const { records, vectors } = await this.loadRecordsAndStoredVectors(entityInfo, entityDoc, nameFields, filter, contextUser);
378
+ const { records, vectors } = await this.loadRecordsAndStoredVectors(entityInfo, entityDoc, nameFields, filter, contextUser, rv);
269
379
  const labelsByRecordID = this.mapRecordLabels(entityInfo, nameFields, records);
270
380
 
271
381
  // VectorJSON is the heavy column: list without it, then fetch it only for the items returned.
272
382
  const chosen = this.selectLabelledVectors(vectors, labelsByRecordID, limit);
273
- const valuesByID = await this.loadVectorValues(chosen.map(c => c.row.ID), contextUser);
383
+ const valuesByID = await this.loadVectorValues(chosen.map(c => c.row.ID), contextUser, rv);
274
384
 
275
385
  const results: EntityVectorItem[] = [];
276
386
  for (const { row, labels } of chosen) {
@@ -305,7 +415,7 @@ export class FetchEntityVectorsResolver extends ResolverBase {
305
415
  * Fetch `VectorJSON` for the given Entity Record Document IDs, keyed by ID. The ID lists are
306
416
  * capped at {@link VECTOR_FETCH_CHUNK_SIZE} per view and all sent in one `RunViews` batch.
307
417
  */
308
- private async loadVectorValues(ids: string[], contextUser: UserInfo): Promise<Map<string, string>> {
418
+ private async loadVectorValues(ids: string[], contextUser: UserInfo, rv: RunView): Promise<Map<string, string>> {
309
419
  const valuesByID = new Map<string, string>();
310
420
  if (ids.length === 0) return valuesByID;
311
421
 
@@ -321,7 +431,7 @@ export class FetchEntityVectorsResolver extends ResolverBase {
321
431
  ResultType: 'simple',
322
432
  });
323
433
  }
324
- const results = await new RunView().RunViews<{ ID: string; VectorJSON: string | null }>(views, contextUser);
434
+ const results = await rv.RunViews<{ ID: string; VectorJSON: string | null }>(views, contextUser);
325
435
  for (const result of results) {
326
436
  if (!result.Success) {
327
437
  throw new Error(`Failed to load vector values: ${result.ErrorMessage}`);
@@ -352,10 +462,11 @@ export class FetchEntityVectorsResolver extends ResolverBase {
352
462
  entityDoc: MJEntityDocumentEntity,
353
463
  nameFields: string[],
354
464
  filter: string | undefined,
355
- contextUser: UserInfo
465
+ contextUser: UserInfo,
466
+ rv: RunView
356
467
  ): Promise<{ records: Record<string, unknown>[]; vectors: StoredVectorRow[] }> {
357
468
  const keyFields = entityInfo.PrimaryKeys.map(pk => pk.Name);
358
- const [recordResult, docResult] = await new RunView().RunViews<Record<string, unknown>>([
469
+ const [recordResult, docResult] = await rv.RunViews<Record<string, unknown>>([
359
470
  {
360
471
  EntityName: entityInfo.Name,
361
472
  ExtraFilter: filter || undefined,
@@ -34,6 +34,7 @@ export class FileCategoryResolver extends FileCategoryResolverBase {
34
34
  fileCategoryEntity.CheckPermissions(EntityPermissionType.Delete, true);
35
35
 
36
36
  await fileCategoryEntity.Load(ID);
37
+ // fls-guard: loaded as the caller; width follows its user
37
38
  const returnValue = fileCategoryEntity.GetAll();
38
39
 
39
40
  // Any files using the deleted category fall back to its parent
@@ -1,4 +1,4 @@
1
- import { EntityPermissionType, FieldValueCollection, EntitySaveOptions, IMetadataProvider, LogError, UserInfo } from '@memberjunction/core';
1
+ import { AssertClientInputWritableForUser, EntityPermissionType, FieldValueCollection, EntitySaveOptions, IMetadataProvider, LogError, UserInfo } from '@memberjunction/core';
2
2
  import { NormalizeUUID } from '@memberjunction/global';
3
3
  import { MJFileEntity, MJFileStorageProviderEntity, MJFileStorageAccountEntity } from '@memberjunction/core-entities';
4
4
  import {
@@ -47,6 +47,7 @@ import {
47
47
  import { CreateMJFileInput, MJFileResolver as FileResolverBase, MJFile_, UpdateMJFileInput } from '../generated/generated.js';
48
48
  import { FieldMapper } from '@memberjunction/graphql-dataprovider';
49
49
  import { GetReadOnlyProvider } from '../util.js';
50
+ import { ProjectEntityObjectForCaller, ProjectableEntityObject } from '../generic/fieldSecurityTransport.js';
50
51
  import { MediaAccessKeyManager } from '../rest/MediaAccessKeys.js';
51
52
  import { UploadTokenManager } from '../rest/UploadTokenManager.js';
52
53
  import { DeriveSidecarPath, ParsePeaksSidecar } from './peaksSidecar.js';
@@ -666,6 +667,8 @@ export class FileResolver extends FileResolverBase {
666
667
  const fileEntity = await provider.GetEntityObject<MJFileEntity>('MJ: Files', user);
667
668
  const providerEntity = await provider.GetEntityObject<MJFileStorageProviderEntity>('MJ: File Storage Providers', user);
668
669
  fileEntity.CheckPermissions(EntityPermissionType.Create, true);
670
+ // Field-level security: refuse a key the caller may not read, or that names no field, before anything else
671
+ AssertClientInputWritableForUser(fileEntity.EntityInfo, { ...input }, user);
669
672
 
670
673
  // The upload URL signs an overwrite of `Name` (and the row will point at `ProviderKey`): Write on the account the
671
674
  // provider resolves to, and the tracked-file rule on both keys, as for every other route that writes an object.
@@ -693,7 +696,7 @@ export class FileResolver extends FileResolverBase {
693
696
  if (!saved) {
694
697
  console.error('[CreateFile] File save failed:', fileEntity.LatestResult?.CompleteMessage);
695
698
  }
696
- const File = mapper.MapFields({ ...fileEntity.GetAll() });
699
+ const File = this.fileResponse(fileEntity, user, provider);
697
700
 
698
701
  return { File, UploadUrl, NameExists };
699
702
  }
@@ -760,8 +763,7 @@ export class FileResolver extends FileResolverBase {
760
763
  });
761
764
 
762
765
  const loaded = await fileEntity.Load(uploadResult.FileID);
763
- const mapper = new FieldMapper();
764
- const File = loaded ? (mapper.MapFields({ ...fileEntity.GetAll() }) as unknown as MJFile_) : undefined;
766
+ const File = loaded ? (this.fileResponse(fileEntity, user, provider) as unknown as MJFile_) : undefined;
765
767
 
766
768
  return {
767
769
  Success: true,
@@ -778,6 +780,14 @@ export class FileResolver extends FileResolverBase {
778
780
  }
779
781
  }
780
782
 
783
+ /**
784
+ * The file record for a response: its field values as the caller may read them, in GraphQL field
785
+ * names. The record was just saved or reloaded, and a save re-reads the whole row.
786
+ */
787
+ private fileResponse(fileEntity: ProjectableEntityObject, user: UserInfo, provider: IMetadataProvider): Record<string, unknown> {
788
+ return new FieldMapper().MapFields({ ...ProjectEntityObjectForCaller(fileEntity, user, provider) });
789
+ }
790
+
781
791
  /**
782
792
  * The account an upload will land in: the requested one, else the engine's default (the first active account) —
783
793
  * returned as an explicit ID so the account the gate checks is the account `UploadFile` uses. A requested ID is
@@ -6,6 +6,7 @@ import { QueryCompositionEngine } from '@memberjunction/generic-database-provide
6
6
  import { RequireSystemUser } from '../directives/RequireSystemUser.js';
7
7
  import { NoLog } from '../logging/NoLog.js';
8
8
  import { v4 as uuidv4 } from 'uuid';
9
+ import { createHash, timingSafeEqual } from 'node:crypto';
9
10
  import { GetReadOnlyDataSource, GetReadOnlyProvider } from '../util.js';
10
11
  import { GetDbType } from '../index.js';
11
12
  import { GetSystemUser } from '../auth/index.js';
@@ -125,9 +126,9 @@ export class GetDataResolver {
125
126
  });
126
127
  LogStatus(`GetData invoked: ${input.Queries.length} queries`);
127
128
 
128
- // validate the token
129
+ // validate the token (never echo the raw token into error messages or logs — Token is @NoLog)
129
130
  if (!IsTokenValid(input.Token)) {
130
- throw new Error(`Token ${input.Token} is not valid or has expired`);
131
+ throw new Error('Access token is not valid or has expired');
131
132
  }
132
133
 
133
134
  // Use the read-only connection for executing queries
@@ -296,6 +297,26 @@ export class GetDataAccessToken {
296
297
  const __accessTokens: GetDataAccessToken[] = [];
297
298
  const __defaultTokenLifeSpan = 1000 * 60 * 5; // 5 minutes
298
299
 
300
+ /**
301
+ * Non-short-circuiting constant-time scan over active access tokens: hashes the presented token
302
+ * once and compares against every stored token digest with `timingSafeEqual` without breaking early,
303
+ * so neither prefix similarity, token length, nor array index leaks through timing.
304
+ */
305
+ function findMatchingAccessTokenIndex(token: string): number {
306
+ if (typeof token !== 'string' || token.length === 0) {
307
+ return -1;
308
+ }
309
+ const targetDigest = createHash('sha256').update(token).digest();
310
+ let matchedIndex = -1;
311
+ for (let i = 0; i < __accessTokens.length; i++) {
312
+ const candidateDigest = createHash('sha256').update(__accessTokens[i].Token).digest();
313
+ if (timingSafeEqual(candidateDigest, targetDigest)) {
314
+ matchedIndex = i;
315
+ }
316
+ }
317
+ return matchedIndex;
318
+ }
319
+
299
320
  /**
300
321
  * Removes every token whose `ExpiresAt` has already passed (and its `TokenUses`
301
322
  * log along with it). Without this sweep `__accessTokens` grows forever — nothing
@@ -339,7 +360,7 @@ export function RegisterAccessToken(token?: string, lifeSpan: number = __default
339
360
 
340
361
  if (TokenExists(tokenToUse)) {
341
362
  // should never happen if we used the uuidv4() function but could happen if someone tries to use a custom token
342
- throw new Error(`Token ${tokenToUse} already exists`);
363
+ throw new Error('Access token already exists');
343
364
  }
344
365
 
345
366
  const newToken = new GetDataAccessToken();
@@ -356,12 +377,12 @@ export function registerAccessToken(token?: string, lifeSpan: number = __default
356
377
  return RegisterAccessToken(token, lifeSpan, requestorPayload);
357
378
  }
358
379
  export function DeleteAccessToken(token: string) {
359
- const index = __accessTokens.findIndex((t) => t.Token === token);
380
+ const index = findMatchingAccessTokenIndex(token);
360
381
  if (index >= 0) {
361
382
  __accessTokens.splice(index, 1);
362
383
  }
363
384
  else {
364
- throw new Error(`Token ${token} does not exist`);
385
+ throw new Error('Access token does not exist');
365
386
  }
366
387
  }
367
388
 
@@ -370,7 +391,7 @@ export function deleteAccessToken(token: string) {
370
391
  return DeleteAccessToken(token);
371
392
  }
372
393
  export function TokenExists(token: string) {
373
- return __accessTokens.find((t) => t.Token === token) !== undefined;
394
+ return findMatchingAccessTokenIndex(token) >= 0;
374
395
  }
375
396
 
376
397
  /** @deprecated Use {@link TokenExists}. */
@@ -378,9 +399,9 @@ export function tokenExists(token: string) {
378
399
  return TokenExists(token);
379
400
  }
380
401
  export function IsTokenValid(token: string) {
381
- const t = __accessTokens.find((t) => t.Token === token);
382
- if (t) {
383
- return t.ExpiresAt > new Date();
402
+ const index = findMatchingAccessTokenIndex(token);
403
+ if (index >= 0) {
404
+ return __accessTokens[index].ExpiresAt > new Date();
384
405
  }
385
406
  return false;
386
407
  }
@@ -390,15 +411,16 @@ export function isTokenValid(token: string) {
390
411
  return IsTokenValid(token);
391
412
  }
392
413
  export function RecordTokenUse(token: string, usePayload: any) {
393
- const t = __accessTokens.find((t) => t.Token === token);
394
- if (t) {
414
+ const index = findMatchingAccessTokenIndex(token);
415
+ if (index >= 0) {
416
+ const t = __accessTokens[index];
395
417
  if (!t.TokenUses) {
396
418
  t.TokenUses = [];
397
419
  }
398
- t.TokenUses.push({ Token: token, UsedAt: new Date(), UsePayload: usePayload });
420
+ t.TokenUses.push({ Token: t.Token, UsedAt: new Date(), UsePayload: usePayload });
399
421
  }
400
422
  else {
401
- throw new Error(`Token ${token} does not exist`);
423
+ throw new Error('Access token does not exist');
402
424
  }
403
425
  }
404
426