@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
@@ -571,25 +571,18 @@ export class RunAIPromptResolver extends ResolverBase {
571
571
  }
572
572
 
573
573
  /**
574
- * Helper method to select an embedding model by size
574
+ * Selects a local embedding model by size: `'small'` is the lowest-PowerRank active local model;
575
+ * `'medium'` and anything else is the platform default (`AIEngine.DefaultLocalEmbeddingModel`).
576
+ * Picking by position in the list would shift whenever a model is added.
575
577
  * @private
576
578
  */
577
579
  private selectEmbeddingModelBySize(modelSize: string): MJAIModelEntityExtended {
578
- const localModels = AIEngine.Instance.LocalEmbeddingModels;
579
-
580
- if (!localModels || localModels.length === 0) {
580
+ const engine = AIEngine.Instance;
581
+ const model = modelSize === 'small' ? engine.LowestPowerLocalEmbeddingModel : engine.DefaultLocalEmbeddingModel;
582
+ if (!model) {
581
583
  throw new Error('No local embedding models available');
582
584
  }
583
-
584
- // Models are already sorted by PowerRank (highest first)
585
- switch (modelSize) {
586
- case 'small':
587
- return localModels[localModels.length - 1]; // Lowest power
588
- case 'medium':
589
- default:
590
- const midIndex = Math.floor(localModels.length / 2);
591
- return localModels[midIndex] || localModels[0];
592
- }
585
+ return model;
593
586
  }
594
587
 
595
588
  /**
@@ -825,7 +818,8 @@ export class RunAIPromptResolver extends ResolverBase {
825
818
  async EmbedText(
826
819
  @Arg('textToEmbed', () => [String]) textToEmbed: string[],
827
820
  @Arg('modelSize') modelSize: string,
828
- @Ctx() { userPayload }: { userPayload: UserPayload }
821
+ @Ctx() { userPayload }: { userPayload: UserPayload },
822
+ @Arg('inputType', { nullable: true, description: "'query' for search text, 'document' (default) for text that is stored and compared" }) inputType?: string
829
823
  ): Promise<EmbedTextResult> {
830
824
  // Check API key scope authorization for embedding generation
831
825
  await this.CheckAPIKeyScopeAuthorization('embedding:generate', '*', userPayload);
@@ -847,6 +841,11 @@ export class RunAIPromptResolver extends ResolverBase {
847
841
  // Ensure AI Engine is configured
848
842
  await AIEngine.Instance.Config(false, currentUser);
849
843
 
844
+ const role = inputType === 'query' || inputType === 'document' ? inputType : undefined;
845
+ if (inputType != null && !role) {
846
+ return { embeddings: [], modelName: 'Unknown', vectorDimensions: 0, error: `inputType must be 'query' or 'document'` };
847
+ }
848
+
850
849
  // Select embedding model by size
851
850
  const model = this.selectEmbeddingModelBySize(modelSize);
852
851
 
@@ -863,7 +862,7 @@ export class RunAIPromptResolver extends ResolverBase {
863
862
  }
864
863
 
865
864
  // Use AIEngine's EmbedText method
866
- const result = await AIEngine.Instance.EmbedText(model, text);
865
+ const result = await AIEngine.Instance.EmbedText(model, text, undefined, { inputType: role });
867
866
 
868
867
  if (result && result.vector && result.vector.length > 0) {
869
868
  embeddings.push(result.vector);
@@ -904,9 +903,10 @@ export class RunAIPromptResolver extends ResolverBase {
904
903
  async EmbedTextSystemUser(
905
904
  @Arg('textToEmbed', () => [String]) textToEmbed: string[],
906
905
  @Arg('modelSize') modelSize: string,
907
- @Ctx() { userPayload }: { userPayload: UserPayload }
906
+ @Ctx() { userPayload }: { userPayload: UserPayload },
907
+ @Arg('inputType', { nullable: true, description: "'query' for search text, 'document' (default) for text that is stored and compared" }) inputType?: string
908
908
  ): Promise<EmbedTextResult> {
909
909
  // Reuse the same logic as the regular mutation
910
- return this.EmbedText(textToEmbed, modelSize, { userPayload });
910
+ return this.EmbedText(textToEmbed, modelSize, { userPayload }, inputType);
911
911
  }
912
912
  }
@@ -1,6 +1,7 @@
1
1
  import { Resolver, Mutation, Arg, Ctx, ObjectType, Field } from 'type-graphql';
2
2
  import { AppContext, UserPayload } from '../types.js';
3
3
  import { LogError, LogStatus, Metadata, RunView } from '@memberjunction/core';
4
+ import { EscapeSQLString } from '@memberjunction/global';
4
5
  import { MJTemplateContentEntity, MJTemplateEntityExtended } from '@memberjunction/core-entities';
5
6
  import { GetTemplateRunRefusal, TemplateEngineServer } from '@memberjunction/templates';
6
7
  import { ResolverBase } from '../generic/ResolverBase.js';
@@ -84,12 +85,13 @@ export class RunTemplateResolver extends ResolverBase {
84
85
  }
85
86
 
86
87
  // Load template content (get the first/highest priority content)
87
- const rv = new RunView();
88
+ const rv = RunView.FromMetadataProvider(p);
88
89
  const templateContentResult = await rv.RunView<MJTemplateContentEntity>({
89
90
  EntityName: 'MJ: Template Contents',
90
- ExtraFilter: `TemplateID = '${templateId}'`,
91
+ ExtraFilter: `TemplateID = '${EscapeSQLString(templateEntity.ID)}'`,
91
92
  OrderBy: 'Priority ASC',
92
93
  MaxRows: 1,
94
+ SkipTotalRowCount: true,
93
95
  ResultType: 'entity_object'
94
96
  }, currentUser);
95
97
 
@@ -102,12 +104,14 @@ export class RunTemplateResolver extends ResolverBase {
102
104
  }
103
105
 
104
106
  // Configure and render the template
105
- await TemplateEngineServer.Instance.Config(true /*always refresh to get latest templates*/, currentUser);
107
+ await TemplateEngineServer.Instance.Config(true /*always refresh to get latest templates*/, currentUser, p);
106
108
  const result = await TemplateEngineServer.Instance.RenderTemplate(
107
109
  templateEntity,
108
110
  templateContentResult.Results[0],
109
- data,
110
- true // skip validation for execution
111
+ data,
112
+ true, // skip validation for execution
113
+ undefined,
114
+ { ContextUser: currentUser },
111
115
  );
112
116
 
113
117
  const executionTime = Date.now() - startTime;
@@ -15,6 +15,7 @@ import { AppContext, UserPayload } from '../types.js';
15
15
  import { LogError, LogStatus, UserInfo } from '@memberjunction/core';
16
16
  import { TestEngine } from '@memberjunction/testing-engine';
17
17
  import { ResolverBase } from '../generic/ResolverBase.js';
18
+ import { ProjectEntityObjectForCaller, ProjectableEntityObject } from '../generic/fieldSecurityTransport.js';
18
19
  import { StartLivenessPulse } from '../generic/FireAndForgetHeartbeat.js';
19
20
  import { TestRunVariables, TestLogMessage, TestRunResult as EngineTestRunResult } from '@memberjunction/testing-engine-base';
20
21
 
@@ -447,7 +448,8 @@ export class RunTestResolver extends ResolverBase {
447
448
  testRunId: (testRun as { ID?: string })?.ID || testId,
448
449
  type: 'progress',
449
450
  testRun: testRun && typeof (testRun as { GetAll?: () => Record<string, unknown> }).GetAll === 'function'
450
- ? (testRun as { GetAll: () => Record<string, unknown> }).GetAll()
451
+ // projected for the recipient: the run object comes from the test engine, not a load bound to them
452
+ ? ProjectEntityObjectForCaller(testRun as unknown as ProjectableEntityObject, userPayload.userRecord)
451
453
  : undefined,
452
454
  progress: {
453
455
  currentStep: progress.step,
@@ -319,6 +319,7 @@ export class SyncDataResolver {
319
319
  }
320
320
  else {
321
321
  // pass back the full record as it was JUST BEFORE the delete, often quite useful on the other end
322
+ // fls-guard: system-user-only resolver (@RequireSystemUser)
322
323
  result.RecordJSON = await altKeyResult.GetDataObjectJSON({
323
324
  includeRelatedEntityData: false,
324
325
  excludeFields: [],
@@ -337,6 +338,7 @@ export class SyncDataResolver {
337
338
  }
338
339
  else if (await entityObject.InnerLoad(pk)) {
339
340
  // pass back the full record as it was JUST BEFORE the delete, often quite useful on the other end
341
+ // fls-guard: system-user-only resolver (@RequireSystemUser)
340
342
  result.RecordJSON = await entityObject.GetDataObjectJSON({
341
343
  includeRelatedEntityData: false,
342
344
  excludeFields: [],
@@ -368,6 +370,7 @@ export class SyncDataResolver {
368
370
  result.Success = true;
369
371
  result.PrimaryKey = new CompositeKey(entityObject.PrimaryKeys.map((pk) => ({FieldName: pk.Name, Value: pk.Value})));
370
372
  // pass back the full record AFTER the sync, that's often quite useful on the other end
373
+ // fls-guard: system-user-only resolver (@RequireSystemUser)
371
374
  result.RecordJSON = await entityObject.GetDataObjectJSON({
372
375
  includeRelatedEntityData: false,
373
376
  excludeFields: [],
@@ -411,6 +414,7 @@ export class SyncDataResolver {
411
414
  result.PrimaryKey = new CompositeKey(entityObject.PrimaryKeys.map((pk) => ({FieldName: pk.Name, Value: pk.Value})));
412
415
  }
413
416
  // pass back the full record AFTER the sync, that's often quite useful on the other end
417
+ // fls-guard: system-user-only resolver (@RequireSystemUser)
414
418
  result.RecordJSON = await entityObject.GetDataObjectJSON({
415
419
  includeRelatedEntityData: false,
416
420
  excludeFields: [],
@@ -151,6 +151,7 @@ export class TestQuerySQLResolver extends ResolverBase {
151
151
 
152
152
  return {
153
153
  Success: result.Success,
154
+ // fls-guard: query rows; the SQL is refused before it runs if it reads a field the caller is denied
154
155
  Results: result.Results ? JSON.stringify(result.Results) : undefined,
155
156
  RowCount: result.RowCount,
156
157
  ExecutionTime: result.ExecutionTime,
@@ -1,9 +1,10 @@
1
1
  import { Arg, Ctx, Field, InputType, Int, Mutation, ObjectType, registerEnumType } from 'type-graphql';
2
2
  import { AppContext } from '../types.js';
3
- import { CompositeKey, EntityInfo, IMetadataProvider, KeyValuePair, LogError, Metadata, TransactionVariable, TransactionGroupBase, BaseEntity, EntityDeleteOptions, EntitySaveOptions } from '@memberjunction/core';
3
+ import { AssertClientInputWritableForUser, CompositeKey, EntityInfo, IMetadataProvider, KeyValuePair, LogError, Metadata, RecordChangeMetadataSource, TransactionVariable, TransactionGroupBase, BaseEntity, UserInfo } from '@memberjunction/core';
4
4
  import { SafeJSONParse, ValuesEqual } from '@memberjunction/global';
5
5
  import { GetReadWriteProvider } from '../util.js';
6
6
  import { ResolverBase } from '../generic/ResolverBase.js';
7
+ import { ProjectValuesForCaller } from '../generic/fieldSecurityTransport.js';
7
8
 
8
9
  export enum TransactionVariableType {
9
10
  Define = "Define",
@@ -148,16 +149,18 @@ export class TransactionResolver extends ResolverBase {
148
149
  // BEFORE any Save()/Delete() runs below: a 'Use' variable sets its field at Submit(), after
149
150
  // every server-side write check has passed, so an entity whose check depends on a field's
150
151
  // final value must be able to see that a variable will set it.
152
+ const user: UserInfo = context.userPayload.userRecord;
151
153
  for (const item of group.Items) {
152
- entityObjects.push(await md.GetEntityObject(item.EntityName, context.userPayload.userRecord));
154
+ entityObjects.push(await md.GetEntityObject(item.EntityName, user));
153
155
  }
156
+ this.AssertNetworkInputWritable(group, entityObjects, user);
154
157
  this.AddNetworkVariables(group, entityObjects, tg);
155
158
 
156
159
  for (const [index, item] of group.Items.entries()) {
157
160
  const entity = entityObjects[index];
158
161
 
159
162
  // get the values from the payload
160
- const itemValues = SafeJSONParse(item.EntityObjectJSON);
163
+ const itemValues = SafeJSONParse<Record<string, unknown>>(item.EntityObjectJSON) ?? {};
161
164
  // build a primary key for the item
162
165
  const pkey = new CompositeKey(entity.PrimaryKeys.map(pk => {
163
166
  const kv = new KeyValuePair();
@@ -171,8 +174,10 @@ export class TransactionResolver extends ResolverBase {
171
174
  if (item.OperationType === "Update") {
172
175
  await entity.InnerLoad(pkey);
173
176
  if (typeof entity.GetDataObject === 'function') {
177
+ // fls-guard: pre-update snapshot; projected before the delta is built
174
178
  preUpdateValues.set(index, await entity.GetDataObject());
175
179
  } else if (typeof entity.GetAll === 'function') {
180
+ // fls-guard: pre-update snapshot; projected before the delta is built
176
181
  preUpdateValues.set(index, { ...(entity.GetAll() as Record<string, unknown>) });
177
182
  }
178
183
  }
@@ -197,6 +202,7 @@ export class TransactionResolver extends ResolverBase {
197
202
  // Awaiting costs nothing here — DataObjectParams defaults
198
203
  // includeRelatedEntityData to false, which guards the method's only awaited
199
204
  // work, so with no params this is GetAll() plus a filter loop.
205
+ // fls-guard: projected in PrepareReturnValue
200
206
  objectValues.push(await entity.GetDataObject());
201
207
  entity.TransactionGroup = tg;
202
208
  if (!await entity.Delete()) {
@@ -221,17 +227,17 @@ export class TransactionResolver extends ResolverBase {
221
227
  `TransactionResolver::ExecuteTransactionGroup --- ${refusals.length} of ${group.Items.length} ` +
222
228
  `item(s) were refused, so the group was not submitted:\n${refusals.join('\n')}`
223
229
  );
224
- return await this.PrepareReturnValue(false, entityObjects, objectValues, group, preUpdateValues);
230
+ return await this.PrepareReturnValue(false, entityObjects, objectValues, group, preUpdateValues, md, user);
225
231
  }
226
232
 
227
233
  // after all that, we are ready to roll, so let's run the TG
228
234
  if (await tg.Submit()) {
229
235
  // success!
230
- return await this.PrepareReturnValue(true, entityObjects, objectValues, group, preUpdateValues);
236
+ return await this.PrepareReturnValue(true, entityObjects, objectValues, group, preUpdateValues, md, user);
231
237
  }
232
238
  else {
233
239
  // failure, send back the results
234
- return await this.PrepareReturnValue(false, entityObjects, objectValues, group, preUpdateValues);
240
+ return await this.PrepareReturnValue(false, entityObjects, objectValues, group, preUpdateValues, md, user);
235
241
  }
236
242
  }
237
243
  catch (err) {
@@ -240,6 +246,32 @@ export class TransactionResolver extends ResolverBase {
240
246
  }
241
247
  }
242
248
 
249
+ /**
250
+ * Field-level security gate on everything the client sent, run before any item is applied.
251
+ *
252
+ * Each create or update payload must name only fields the caller may read, and so must every transaction
253
+ * variable: a `Define` on a denied field would copy its value into another item's readable
254
+ * field at `Submit()`, and a `Use` would write it. A key that names no field is refused with
255
+ * the same message as a denied one (see `AssertClientInputWritableForUser`). Callers denied
256
+ * nothing on an entity are not affected. A delete payload is not gated: only its primary key
257
+ * is read, and the record is loaded from the database.
258
+ */
259
+ protected AssertNetworkInputWritable(group: TransactionInputType, entityObjects: BaseEntity[], user: UserInfo): void {
260
+ for (const [index, item] of group.Items.entries()) {
261
+ if (item.OperationType === TransactionOperationType.Delete) {
262
+ continue;
263
+ }
264
+ const values = SafeJSONParse<Record<string, unknown>>(item.EntityObjectJSON);
265
+ AssertClientInputWritableForUser(entityObjects[index]?.EntityInfo, values, user);
266
+ }
267
+ for (const networkVar of group.Variables ?? []) {
268
+ const target = entityObjects[networkVar.ItemIndex];
269
+ if (target && networkVar.FieldName) {
270
+ AssertClientInputWritableForUser(target.EntityInfo, { [networkVar.FieldName]: null }, user);
271
+ }
272
+ }
273
+ }
274
+
243
275
  /**
244
276
  * Adds the network payload's variables to the group, mapping each one's item index to the entity
245
277
  * object built for that item.
@@ -261,13 +293,18 @@ export class TransactionResolver extends ResolverBase {
261
293
  entityObjects: BaseEntity[],
262
294
  objectValues: unknown[],
263
295
  group: TransactionInputType,
264
- preUpdateValues?: Map<number, Record<string, unknown>>
296
+ preUpdateValues?: Map<number, Record<string, unknown>>,
297
+ provider?: RecordChangeMetadataSource,
298
+ user?: UserInfo
265
299
  ): Promise<TransactionOutputType> {
266
300
  const jsonResults = [];
267
301
  for (let i = 0; i < group.Items.length; i++) {
268
302
  const item = group.Items[i];
303
+ const project = (values: Record<string, unknown>) =>
304
+ ProjectValuesForCaller(entityObjects[i]?.EntityInfo, values, user, provider);
269
305
  if (item.OperationType === 'Delete') {
270
- jsonResults.push(JSON.stringify(objectValues[i]));
306
+ const deleted = objectValues[i];
307
+ jsonResults.push(JSON.stringify(deleted && typeof deleted === 'object' ? project(deleted as Record<string, unknown>) : deleted));
271
308
  }
272
309
  else if (item.OperationType === 'Update') {
273
310
  jsonResults.push(
@@ -276,13 +313,15 @@ export class TransactionResolver extends ResolverBase {
276
313
  objectValues[i],
277
314
  preUpdateValues?.get(i),
278
315
  group,
279
- i
316
+ i,
317
+ project
280
318
  )
281
319
  );
282
320
  }
283
321
  else {
284
- // create, return what is in the database
285
- jsonResults.push(await entityObjects[i].GetDataObjectJSON());
322
+ // create, return what is in the database, as the caller may read it
323
+ // fls-guard: projected by project()
324
+ jsonResults.push(JSON.stringify(project(await entityObjects[i].GetDataObject())));
286
325
  }
287
326
  }
288
327
 
@@ -303,20 +342,32 @@ export class TransactionResolver extends ResolverBase {
303
342
  * - Any field whose post-save value differs from its pre-update DB snapshot (`preSaveValues`),
304
343
  * capturing virtual fields, triggers, or server-side `BeforeSave()` mutations automatically
305
344
  * while omitting unchanged columns.
345
+ *
346
+ * Both rows are projected for the caller BEFORE they are compared. Comparing a full-width
347
+ * post-save row against a snapshot taken from a narrowed load would count every denied value
348
+ * as changed, and the delta would then deliver exactly the values the caller may not read.
306
349
  */
307
350
  private async serializeUpdateReturnValue(
308
351
  entity: BaseEntity,
309
352
  sentValues: unknown,
310
353
  preSaveValues: Record<string, unknown> | undefined,
311
354
  group: TransactionInputType,
312
- itemIndex: number
355
+ itemIndex: number,
356
+ project: (values: Record<string, unknown>) => Record<string, unknown>
313
357
  ): Promise<string> {
314
- const fullDataObj: Record<string, unknown> | null = typeof entity.GetDataObject === 'function'
358
+ const rawDataObj: Record<string, unknown> | null = typeof entity.GetDataObject === 'function'
359
+ // fls-guard: projected by project() below
315
360
  ? (await entity.GetDataObject() as Record<string, unknown>)
361
+ // fls-guard: projected by project() below
316
362
  : SafeJSONParse<Record<string, unknown>>(await entity.GetDataObjectJSON());
317
- if (!fullDataObj || typeof fullDataObj !== 'object' || !sentValues || typeof sentValues !== 'object') {
318
- return await entity.GetDataObjectJSON();
363
+ if (!rawDataObj || typeof rawDataObj !== 'object') {
364
+ return JSON.stringify(rawDataObj);
365
+ }
366
+ const fullDataObj = project(rawDataObj);
367
+ if (!sentValues || typeof sentValues !== 'object') {
368
+ return JSON.stringify(fullDataObj);
319
369
  }
370
+ preSaveValues = preSaveValues ? project(preSaveValues) : preSaveValues;
320
371
 
321
372
  const sentRecord = sentValues as Record<string, unknown>;
322
373
  const includeKeys = new Set<string>([
@@ -5,6 +5,7 @@ import { MJUserView_, MJUserViewResolverBase } from '../generated/generated.js';
5
5
  import { UserResolver } from './UserResolver.js';
6
6
  import { MJUserViewEntity, MJUserViewEntityExtended } from '@memberjunction/core-entities';
7
7
  import { GetReadOnlyProvider, GetReadWriteProvider } from '../util.js';
8
+ import { ProjectEntityObjectForCaller } from '../generic/fieldSecurityTransport.js';
8
9
 
9
10
  @Resolver(MJUserView_)
10
11
  export class UserViewResolver extends MJUserViewResolverBase {
@@ -63,7 +64,7 @@ export class UserViewResolver extends MJUserViewResolverBase {
63
64
  await viewEntity.UpdateWhereClause(true); // force regeneration regardless of dirty state — that is the whole point of this endpoint
64
65
 
65
66
  if (await viewEntity.Save()) {
66
- return viewEntity.GetAll();
67
+ return ProjectEntityObjectForCaller(viewEntity, u, p);
67
68
  } else {
68
69
  throw new Error('Failed to update where clause');
69
70
  }
@@ -23,6 +23,8 @@ vi.mock('../../auth/index.js', () => ({ GetSystemUser: vi.fn(),
23
23
  vi.mock('mssql', () => ({ default: { Request: vi.fn() } }));
24
24
 
25
25
  import {
26
+ GetDataResolver,
27
+ GetDataInputType,
26
28
  RegisterAccessToken,
27
29
  DeleteAccessToken,
28
30
  TokenExists,
@@ -31,6 +33,7 @@ import {
31
33
  PruneExpiredTokens,
32
34
  GetAccessTokenCount,
33
35
  } from '../GetDataResolver.js';
36
+ import type { AppContext } from '../../types.js';
34
37
 
35
38
  // ---------------------------------------------------------------------------
36
39
  // Regression coverage for a memory leak (Memory Leak Audit Round 7, Critical):
@@ -137,4 +140,53 @@ describe('GetDataResolver access-token lifecycle', () => {
137
140
  expect(GetAccessTokenCount()).toBeLessThan(before + 51);
138
141
  expect(TokenExists(survivorToken)).toBe(true);
139
142
  });
143
+
144
+ it('never leaks raw secret token values in thrown or returned error messages', async () => {
145
+ const duplicateSecret = `secret-dup-${uniqueToken()}`;
146
+ RegisterAccessToken(duplicateSecret, 60_000);
147
+
148
+ try {
149
+ RegisterAccessToken(duplicateSecret, 60_000);
150
+ expect.unreachable('Expected duplicate registration to throw');
151
+ } catch (err) {
152
+ expect((err as Error).message).not.toContain(duplicateSecret);
153
+ }
154
+
155
+ const missingSecret = `secret-missing-${uniqueToken()}`;
156
+ try {
157
+ DeleteAccessToken(missingSecret);
158
+ expect.unreachable('Expected deleting unknown token to throw');
159
+ } catch (err) {
160
+ expect((err as Error).message).not.toContain(missingSecret);
161
+ }
162
+
163
+ try {
164
+ RecordTokenUse(missingSecret, {});
165
+ expect.unreachable('Expected recording unknown token use to throw');
166
+ } catch (err) {
167
+ expect((err as Error).message).not.toContain(missingSecret);
168
+ }
169
+
170
+ const resolver = new GetDataResolver();
171
+ const input = new GetDataInputType();
172
+ input.Token = missingSecret;
173
+ input.Queries = ['SELECT 1'];
174
+ const output = await resolver.GetData(input, { dataSources: [] } as Partial<AppContext> as AppContext);
175
+ expect(output.Success).toBe(false);
176
+ expect(JSON.stringify(output.ErrorMessages)).not.toContain(missingSecret);
177
+ });
178
+
179
+ it('rejects empty tokens and near-miss prefix tokens across multiple active slots', () => {
180
+ const first = `slot-a-${uniqueToken()}`;
181
+ const second = `slot-b-${uniqueToken()}`;
182
+ RegisterAccessToken(first, 60_000);
183
+ RegisterAccessToken(second, 60_000);
184
+
185
+ expect(IsTokenValid('')).toBe(false);
186
+ expect(TokenExists('')).toBe(false);
187
+ expect(IsTokenValid(first.slice(0, -1))).toBe(false);
188
+ expect(IsTokenValid(`${second}-extra`)).toBe(false);
189
+ expect(IsTokenValid(first)).toBe(true);
190
+ expect(IsTokenValid(second)).toBe(true);
191
+ });
140
192
  });
@@ -90,4 +90,47 @@ describe('RecordDependencyResolver', () => {
90
90
  expect(result[0].IsSoftLink).toBeUndefined();
91
91
  expect(result[0].EntityIDFieldName).toBeUndefined();
92
92
  });
93
+
94
+ it('forwards contextUser and options to provider and maps FieldDisplayName', async () => {
95
+ const mockDep: RecordDependency = {
96
+ EntityName: 'Users',
97
+ RelatedEntityName: 'MJ: Task Links',
98
+ FieldName: 'RecordID',
99
+ FieldDisplayName: 'Linked Record',
100
+ PrimaryKey: new CompositeKey([new KeyValuePair('ID', 'TL-200')]),
101
+ IsSoftLink: true,
102
+ EntityIDFieldName: 'EntityID',
103
+ };
104
+
105
+ const getRecordDepsSpy = vi.fn().mockResolvedValue([mockDep]);
106
+ const mockProvider = {
107
+ GetRecordDependencies: getRecordDepsSpy,
108
+ } as unknown as IMetadataProvider;
109
+
110
+ vi.mocked(GetReadOnlyProvider).mockReturnValue(mockProvider as never);
111
+
112
+ const resolver = new RecordDependencyResolver();
113
+ const mockUser = { ID: 'u-1', Email: 'test@example.com' };
114
+ const mockContext = {
115
+ dataSource: {},
116
+ userPayload: { userRecord: mockUser },
117
+ providers: [],
118
+ } as unknown as AppContext;
119
+ const mockPubSub = {} as PubSubEngine;
120
+ const options = { LinkType: 'soft' as const, IncludeSystemEntities: false };
121
+
122
+ const result = await resolver.GetRecordDependencies(
123
+ 'Users',
124
+ { KeyValuePairs: [{ FieldName: 'ID', Value: 'USER-1' }] },
125
+ mockContext,
126
+ mockPubSub,
127
+ options
128
+ );
129
+
130
+ expect(getRecordDepsSpy).toHaveBeenCalledTimes(1);
131
+ expect(getRecordDepsSpy.mock.calls[0][0]).toBe('Users');
132
+ expect(getRecordDepsSpy.mock.calls[0][2]).toBe(mockUser);
133
+ expect(getRecordDepsSpy.mock.calls[0][3]).toEqual(options);
134
+ expect(result[0].FieldDisplayName).toBe('Linked Record');
135
+ });
93
136
  });
@@ -268,6 +268,7 @@ async function findConversationByEgressID(egressID: string, contextUser: UserInf
268
268
  Fields: ['ID'],
269
269
  OrderBy: '__mj_CreatedAt DESC',
270
270
  MaxRows: 1,
271
+ SkipTotalRowCount: true,
271
272
  ResultType: 'simple',
272
273
  },
273
274
  contextUser,
@@ -288,6 +289,7 @@ async function findConversationByRoomName(roomName: string, contextUser: UserInf
288
289
  Fields: ['ID'],
289
290
  OrderBy: '__mj_CreatedAt DESC',
290
291
  MaxRows: 1,
292
+ SkipTotalRowCount: true,
291
293
  ResultType: 'simple',
292
294
  },
293
295
  contextUser,
@@ -1,7 +1,8 @@
1
1
  import {
2
- BaseEntity, CompositeKey, EntityDeleteOptions, EntityPermissionType,
2
+ AssertClientInputWritableForUser, BaseEntity, CompositeKey, EntityDeleteOptions, EntityPermissionType,
3
3
  EntitySaveOptions, LogError, Metadata, UserInfo
4
4
  } from '@memberjunction/core';
5
+ import { ProjectValuesForCaller } from '../generic/fieldSecurityTransport.js';
5
6
 
6
7
  /**
7
8
  * Entity CRUD Implementation Functions for REST endpoints
@@ -42,6 +43,9 @@ export class EntityCRUDHandler {
42
43
  delete data.options;
43
44
  }
44
45
 
46
+ // Field-level security: refuse a key the caller may not read, or that names no field
47
+ AssertClientInputWritableForUser(entity.EntityInfo, data, user);
48
+
45
49
  // Set values on the entity
46
50
  for (const key in data) {
47
51
  entity.Set(key, data[key]);
@@ -70,7 +74,7 @@ export class EntityCRUDHandler {
70
74
  }
71
75
 
72
76
  // Get entity data for response
73
- const entityData = await entity.GetDataObject();
77
+ const entityData = await this.responseData(entity, user, md);
74
78
  return { success: true, entity: entityData };
75
79
  } catch (error: any) {
76
80
  LogError(error);
@@ -114,7 +118,7 @@ export class EntityCRUDHandler {
114
118
  }
115
119
 
116
120
  // Get entity data for response
117
- const entityData = await entity.GetDataObject();
121
+ const entityData = await this.responseData(entity, user, md);
118
122
  return { success: true, entity: entityData };
119
123
  } catch (error: any) {
120
124
  LogError(error);
@@ -171,6 +175,9 @@ export class EntityCRUDHandler {
171
175
  delete data.options;
172
176
  }
173
177
 
178
+ // Field-level security: refuse a key the caller may not read, or that names no field
179
+ AssertClientInputWritableForUser(entity.EntityInfo, data, user);
180
+
174
181
  // Update entity with new values
175
182
  for (const key in data) {
176
183
  entity.Set(key, data[key]);
@@ -179,7 +186,7 @@ export class EntityCRUDHandler {
179
186
  // Check if entity is dirty
180
187
  if (!entity.Dirty && !options.IgnoreDirtyState) {
181
188
  // Nothing changed, return success
182
- const entityData = await entity.GetDataObject();
189
+ const entityData = await this.responseData(entity, user, md);
183
190
  return { success: true, entity: entityData };
184
191
  }
185
192
 
@@ -206,7 +213,7 @@ export class EntityCRUDHandler {
206
213
  }
207
214
 
208
215
  // Get entity data for response
209
- const entityData = await entity.GetDataObject();
216
+ const entityData = await this.responseData(entity, user, md);
210
217
  return { success: true, entity: entityData };
211
218
  } catch (error: any) {
212
219
  LogError(error);
@@ -273,6 +280,16 @@ export class EntityCRUDHandler {
273
280
  return this.DeleteEntity(entityName, id, options, user);
274
281
  }
275
282
 
283
+ /**
284
+ * The record's field values for the response, reduced to what `user` may READ. An entity
285
+ * object built for a restricted user holds no denied value already; this is the backstop for
286
+ * one that does.
287
+ */
288
+ private static async responseData(entity: BaseEntity, user: UserInfo, md: Metadata): Promise<Record<string, unknown>> {
289
+ // fls-guard: projected by ProjectValuesForCaller
290
+ return ProjectValuesForCaller(entity.EntityInfo, await entity.GetDataObject() as Record<string, unknown>, user, md);
291
+ }
292
+
276
293
  /**
277
294
  * Build the record key from the `:id` path segment. A single-column key (any column name) is
278
295
  * the bare value; a composite key is the URL-encoded `Field1|Value1||Field2|Value2` segment.
@@ -18,7 +18,7 @@
18
18
 
19
19
  import { BaseSingleton } from '@memberjunction/global';
20
20
  import { LogStatus } from '@memberjunction/core';
21
- import { randomBytes } from 'node:crypto';
21
+ import { createHmac, randomBytes } from 'node:crypto';
22
22
  import jwt from 'jsonwebtoken';
23
23
 
24
24
  /** The token's `typ` claim — the route rejects any token whose `typ` differs. */
@@ -78,7 +78,11 @@ export class MediaAccessKeyManager extends BaseSingleton<MediaAccessKeyManager>
78
78
  }
79
79
  const configured = process.env.MJ_BASE_ENCRYPTION_KEY?.trim();
80
80
  if (configured) {
81
- this.secret = configured;
81
+ // Key separation: never sign tokens with the field-encryption master key itself. Derive a
82
+ // dedicated HS256 signing key (HKDF-style HMAC expand) so a token-signing compromise and the
83
+ // data-at-rest key stay decoupled. Tokens are short-lived, so changing the derivation only
84
+ // invalidates in-flight URLs, exactly like a restart on the ephemeral path below.
85
+ this.secret = createHmac('sha256', configured).update('mj-media-access-token-signing-v1').digest('base64');
82
86
  } else {
83
87
  this.secret = randomBytes(32).toString('base64');
84
88
  LogStatus(