@memberjunction/server 6.2.0-edge.2 → 6.2.0-edge.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (435) hide show
  1. package/README.md +30 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/agentSessions/BridgeHostInstance.d.ts +25 -0
  4. package/dist/agentSessions/BridgeHostInstance.d.ts.map +1 -0
  5. package/dist/agentSessions/BridgeHostInstance.js +30 -0
  6. package/dist/agentSessions/BridgeHostInstance.js.map +1 -0
  7. package/dist/agentSessions/HostInstance.d.ts +75 -11
  8. package/dist/agentSessions/HostInstance.d.ts.map +1 -1
  9. package/dist/agentSessions/HostInstance.js +99 -28
  10. package/dist/agentSessions/HostInstance.js.map +1 -1
  11. package/dist/agentSessions/ReturningVisitorRecap.d.ts.map +1 -1
  12. package/dist/agentSessions/ReturningVisitorRecap.js +7 -3
  13. package/dist/agentSessions/ReturningVisitorRecap.js.map +1 -1
  14. package/dist/agentSessions/SessionJanitor.d.ts +173 -25
  15. package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
  16. package/dist/agentSessions/SessionJanitor.js +452 -54
  17. package/dist/agentSessions/SessionJanitor.js.map +1 -1
  18. package/dist/agentSessions/SessionManager.d.ts +43 -2
  19. package/dist/agentSessions/SessionManager.d.ts.map +1 -1
  20. package/dist/agentSessions/SessionManager.js +99 -8
  21. package/dist/agentSessions/SessionManager.js.map +1 -1
  22. package/dist/agentSessions/SessionRunIDVerifier.d.ts +63 -0
  23. package/dist/agentSessions/SessionRunIDVerifier.d.ts.map +1 -0
  24. package/dist/agentSessions/SessionRunIDVerifier.js +129 -0
  25. package/dist/agentSessions/SessionRunIDVerifier.js.map +1 -0
  26. package/dist/agentSessions/index.d.ts +2 -0
  27. package/dist/agentSessions/index.d.ts.map +1 -1
  28. package/dist/agentSessions/index.js +10 -3
  29. package/dist/agentSessions/index.js.map +1 -1
  30. package/dist/auth/actionAuthorization.d.ts +40 -0
  31. package/dist/auth/actionAuthorization.d.ts.map +1 -0
  32. package/dist/auth/actionAuthorization.js +94 -0
  33. package/dist/auth/actionAuthorization.js.map +1 -0
  34. package/dist/auth/index.d.ts.map +1 -1
  35. package/dist/auth/index.js +3 -10
  36. package/dist/auth/index.js.map +1 -1
  37. package/dist/auth/magicLink/MagicLinkService.d.ts.map +1 -1
  38. package/dist/auth/magicLink/MagicLinkService.js +6 -3
  39. package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
  40. package/dist/auth/newUsers.d.ts +10 -0
  41. package/dist/auth/newUsers.d.ts.map +1 -1
  42. package/dist/auth/newUsers.js +80 -11
  43. package/dist/auth/newUsers.js.map +1 -1
  44. package/dist/config.d.ts +4567 -71
  45. package/dist/config.d.ts.map +1 -1
  46. package/dist/config.js +246 -3
  47. package/dist/config.js.map +1 -1
  48. package/dist/context.d.ts +8 -0
  49. package/dist/context.d.ts.map +1 -1
  50. package/dist/context.js +25 -34
  51. package/dist/context.js.map +1 -1
  52. package/dist/generated/graphql-schemas/__mj.d.ts +1073 -10
  53. package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
  54. package/dist/generated/graphql-schemas/__mj.js +9188 -3649
  55. package/dist/generated/graphql-schemas/__mj.js.map +1 -1
  56. package/dist/generic/OrphanedConversationDetailReconciler.js +3 -3
  57. package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
  58. package/dist/generic/ResolverBase.d.ts +62 -6
  59. package/dist/generic/ResolverBase.d.ts.map +1 -1
  60. package/dist/generic/ResolverBase.js +179 -35
  61. package/dist/generic/ResolverBase.js.map +1 -1
  62. package/dist/generic/RunViewResolver.d.ts +4 -0
  63. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  64. package/dist/generic/RunViewResolver.js +37 -1
  65. package/dist/generic/RunViewResolver.js.map +1 -1
  66. package/dist/index.d.ts +7 -0
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +214 -159
  69. package/dist/index.js.map +1 -1
  70. package/dist/isolatedProvider.d.ts +20 -0
  71. package/dist/isolatedProvider.d.ts.map +1 -0
  72. package/dist/isolatedProvider.js +22 -0
  73. package/dist/isolatedProvider.js.map +1 -0
  74. package/dist/postgresqlCompat.d.ts +8 -0
  75. package/dist/postgresqlCompat.d.ts.map +1 -0
  76. package/dist/postgresqlCompat.js +19 -0
  77. package/dist/postgresqlCompat.js.map +1 -0
  78. package/dist/postgresqlPoolSettings.d.ts +108 -0
  79. package/dist/postgresqlPoolSettings.d.ts.map +1 -0
  80. package/dist/postgresqlPoolSettings.js +134 -0
  81. package/dist/postgresqlPoolSettings.js.map +1 -0
  82. package/dist/realtimeProxy/RealtimeProxyServer.d.ts +44 -4
  83. package/dist/realtimeProxy/RealtimeProxyServer.d.ts.map +1 -1
  84. package/dist/realtimeProxy/RealtimeProxyServer.js +121 -16
  85. package/dist/realtimeProxy/RealtimeProxyServer.js.map +1 -1
  86. package/dist/realtimeProxy/RealtimeRelayTunnel.d.ts +171 -0
  87. package/dist/realtimeProxy/RealtimeRelayTunnel.d.ts.map +1 -0
  88. package/dist/realtimeProxy/RealtimeRelayTunnel.js +532 -0
  89. package/dist/realtimeProxy/RealtimeRelayTunnel.js.map +1 -0
  90. package/dist/realtimeSessions/RealtimeSessionEventService.d.ts +148 -0
  91. package/dist/realtimeSessions/RealtimeSessionEventService.d.ts.map +1 -0
  92. package/dist/realtimeSessions/RealtimeSessionEventService.js +191 -0
  93. package/dist/realtimeSessions/RealtimeSessionEventService.js.map +1 -0
  94. package/dist/realtimeSessions/RealtimeSessionVerificationService.d.ts +66 -0
  95. package/dist/realtimeSessions/RealtimeSessionVerificationService.d.ts.map +1 -0
  96. package/dist/realtimeSessions/RealtimeSessionVerificationService.js +138 -0
  97. package/dist/realtimeSessions/RealtimeSessionVerificationService.js.map +1 -0
  98. package/dist/realtimeSessions/RealtimeVerifyRouter.d.ts +38 -0
  99. package/dist/realtimeSessions/RealtimeVerifyRouter.d.ts.map +1 -0
  100. package/dist/realtimeSessions/RealtimeVerifyRouter.js +98 -0
  101. package/dist/realtimeSessions/RealtimeVerifyRouter.js.map +1 -0
  102. package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts +61 -0
  103. package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts.map +1 -0
  104. package/dist/realtimeSessions/SessionVerificationPortsBase.js +149 -0
  105. package/dist/realtimeSessions/SessionVerificationPortsBase.js.map +1 -0
  106. package/dist/realtimeSessions/SlidingWindowRateLimiter.d.ts +57 -0
  107. package/dist/realtimeSessions/SlidingWindowRateLimiter.d.ts.map +1 -0
  108. package/dist/realtimeSessions/SlidingWindowRateLimiter.js +69 -0
  109. package/dist/realtimeSessions/SlidingWindowRateLimiter.js.map +1 -0
  110. package/dist/realtimeSessions/index.d.ts +17 -0
  111. package/dist/realtimeSessions/index.d.ts.map +1 -0
  112. package/dist/realtimeSessions/index.js +17 -0
  113. package/dist/realtimeSessions/index.js.map +1 -0
  114. package/dist/realtimeSessions/sessionAccess.d.ts +86 -0
  115. package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -0
  116. package/dist/realtimeSessions/sessionAccess.js +90 -0
  117. package/dist/realtimeSessions/sessionAccess.js.map +1 -0
  118. package/dist/realtimeSessions/sessionConfigStamps.d.ts +70 -0
  119. package/dist/realtimeSessions/sessionConfigStamps.d.ts.map +1 -0
  120. package/dist/realtimeSessions/sessionConfigStamps.js +93 -0
  121. package/dist/realtimeSessions/sessionConfigStamps.js.map +1 -0
  122. package/dist/realtimeSessions/subscriptionAuthorization.d.ts +65 -0
  123. package/dist/realtimeSessions/subscriptionAuthorization.d.ts.map +1 -0
  124. package/dist/realtimeSessions/subscriptionAuthorization.js +71 -0
  125. package/dist/realtimeSessions/subscriptionAuthorization.js.map +1 -0
  126. package/dist/realtimeSessions/verificationCore.d.ts +243 -0
  127. package/dist/realtimeSessions/verificationCore.d.ts.map +1 -0
  128. package/dist/realtimeSessions/verificationCore.js +356 -0
  129. package/dist/realtimeSessions/verificationCore.js.map +1 -0
  130. package/dist/realtimeSessions/verificationPages.d.ts +66 -0
  131. package/dist/realtimeSessions/verificationPages.d.ts.map +1 -0
  132. package/dist/realtimeSessions/verificationPages.js +110 -0
  133. package/dist/realtimeSessions/verificationPages.js.map +1 -0
  134. package/dist/realtimeSessions/verificationPolicy.d.ts +147 -0
  135. package/dist/realtimeSessions/verificationPolicy.d.ts.map +1 -0
  136. package/dist/realtimeSessions/verificationPolicy.js +249 -0
  137. package/dist/realtimeSessions/verificationPolicy.js.map +1 -0
  138. package/dist/realtimeSessions/verificationWorkflow.d.ts +263 -0
  139. package/dist/realtimeSessions/verificationWorkflow.d.ts.map +1 -0
  140. package/dist/realtimeSessions/verificationWorkflow.js +435 -0
  141. package/dist/realtimeSessions/verificationWorkflow.js.map +1 -0
  142. package/dist/realtimeWidget/widgetGuestElevation.d.ts +20 -2
  143. package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
  144. package/dist/realtimeWidget/widgetGuestElevation.js +31 -2
  145. package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
  146. package/dist/resolvers/ActionResolver.d.ts +31 -5
  147. package/dist/resolvers/ActionResolver.d.ts.map +1 -1
  148. package/dist/resolvers/ActionResolver.js +75 -14
  149. package/dist/resolvers/ActionResolver.js.map +1 -1
  150. package/dist/resolvers/AdhocQueryResolver.d.ts +35 -17
  151. package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
  152. package/dist/resolvers/AdhocQueryResolver.js +92 -166
  153. package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
  154. package/dist/resolvers/CacheStatsResolver.d.ts +27 -0
  155. package/dist/resolvers/CacheStatsResolver.d.ts.map +1 -1
  156. package/dist/resolvers/CacheStatsResolver.js +113 -2
  157. package/dist/resolvers/CacheStatsResolver.js.map +1 -1
  158. package/dist/resolvers/ClientToolRequestResolver.d.ts +4 -2
  159. package/dist/resolvers/ClientToolRequestResolver.d.ts.map +1 -1
  160. package/dist/resolvers/ClientToolRequestResolver.js +28 -10
  161. package/dist/resolvers/ClientToolRequestResolver.js.map +1 -1
  162. package/dist/resolvers/EntityRecordNameResolver.d.ts +7 -23
  163. package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
  164. package/dist/resolvers/EntityRecordNameResolver.js +9 -47
  165. package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
  166. package/dist/resolvers/FetchEntityVectorsResolver.d.ts +12 -1
  167. package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
  168. package/dist/resolvers/FetchEntityVectorsResolver.js +83 -2
  169. package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
  170. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  171. package/dist/resolvers/GetDataResolver.js +9 -0
  172. package/dist/resolvers/GetDataResolver.js.map +1 -1
  173. package/dist/resolvers/HumanHandoffResolver.d.ts +107 -0
  174. package/dist/resolvers/HumanHandoffResolver.d.ts.map +1 -0
  175. package/dist/resolvers/HumanHandoffResolver.js +330 -0
  176. package/dist/resolvers/HumanHandoffResolver.js.map +1 -0
  177. package/dist/resolvers/MCPResolver.d.ts.map +1 -1
  178. package/dist/resolvers/MCPResolver.js +9 -4
  179. package/dist/resolvers/MCPResolver.js.map +1 -1
  180. package/dist/resolvers/MeetingResolver.d.ts +69 -0
  181. package/dist/resolvers/MeetingResolver.d.ts.map +1 -0
  182. package/dist/resolvers/MeetingResolver.js +381 -0
  183. package/dist/resolvers/MeetingResolver.js.map +1 -0
  184. package/dist/resolvers/RealtimeBridgeResolver.d.ts +88 -3
  185. package/dist/resolvers/RealtimeBridgeResolver.d.ts.map +1 -1
  186. package/dist/resolvers/RealtimeBridgeResolver.js +352 -12
  187. package/dist/resolvers/RealtimeBridgeResolver.js.map +1 -1
  188. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +156 -108
  189. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
  190. package/dist/resolvers/RealtimeClientSessionResolver.js +395 -293
  191. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
  192. package/dist/resolvers/RealtimeSessionEventsResolver.d.ts +61 -0
  193. package/dist/resolvers/RealtimeSessionEventsResolver.d.ts.map +1 -0
  194. package/dist/resolvers/RealtimeSessionEventsResolver.js +130 -0
  195. package/dist/resolvers/RealtimeSessionEventsResolver.js.map +1 -0
  196. package/dist/resolvers/RealtimeSessionVerificationResolver.d.ts +85 -0
  197. package/dist/resolvers/RealtimeSessionVerificationResolver.d.ts.map +1 -0
  198. package/dist/resolvers/RealtimeSessionVerificationResolver.js +188 -0
  199. package/dist/resolvers/RealtimeSessionVerificationResolver.js.map +1 -0
  200. package/dist/resolvers/RemoteBrowserActionResolver.d.ts +2 -0
  201. package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
  202. package/dist/resolvers/RemoteBrowserActionResolver.js +5 -1
  203. package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
  204. package/dist/resolvers/RunAIAgentResolver.d.ts +10 -0
  205. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  206. package/dist/resolvers/RunAIAgentResolver.js +68 -11
  207. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  208. package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
  209. package/dist/resolvers/RunTemplateResolver.js +12 -11
  210. package/dist/resolvers/RunTemplateResolver.js.map +1 -1
  211. package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
  212. package/dist/resolvers/SyncDataResolver.js +6 -2
  213. package/dist/resolvers/SyncDataResolver.js.map +1 -1
  214. package/dist/resolvers/SyncRolesUsersResolver.d.ts +2 -0
  215. package/dist/resolvers/SyncRolesUsersResolver.d.ts.map +1 -1
  216. package/dist/resolvers/SyncRolesUsersResolver.js +23 -6
  217. package/dist/resolvers/SyncRolesUsersResolver.js.map +1 -1
  218. package/dist/resolvers/UserAvatarResolver.d.ts +16 -0
  219. package/dist/resolvers/UserAvatarResolver.d.ts.map +1 -0
  220. package/dist/resolvers/UserAvatarResolver.js +124 -0
  221. package/dist/resolvers/UserAvatarResolver.js.map +1 -0
  222. package/dist/resolvers/UserResolver.d.ts.map +1 -1
  223. package/dist/resolvers/UserResolver.js +2 -17
  224. package/dist/resolvers/UserResolver.js.map +1 -1
  225. package/dist/resolvers/adhocTimeout.d.ts +7 -0
  226. package/dist/resolvers/adhocTimeout.d.ts.map +1 -0
  227. package/dist/resolvers/adhocTimeout.js +12 -0
  228. package/dist/resolvers/adhocTimeout.js.map +1 -0
  229. package/dist/resolvers/agentVisionConsentAudit.d.ts +37 -0
  230. package/dist/resolvers/agentVisionConsentAudit.d.ts.map +1 -0
  231. package/dist/resolvers/agentVisionConsentAudit.js +63 -0
  232. package/dist/resolvers/agentVisionConsentAudit.js.map +1 -0
  233. package/dist/resolvers/avatarInputValidation.d.ts +40 -0
  234. package/dist/resolvers/avatarInputValidation.d.ts.map +1 -0
  235. package/dist/resolvers/avatarInputValidation.js +97 -0
  236. package/dist/resolvers/avatarInputValidation.js.map +1 -0
  237. package/dist/resolvers/currentUserRoles.d.ts +29 -0
  238. package/dist/resolvers/currentUserRoles.d.ts.map +1 -1
  239. package/dist/resolvers/currentUserRoles.js +30 -0
  240. package/dist/resolvers/currentUserRoles.js.map +1 -1
  241. package/dist/resolvers/meetings/index.d.ts +5 -0
  242. package/dist/resolvers/meetings/index.d.ts.map +1 -0
  243. package/dist/resolvers/meetings/index.js +5 -0
  244. package/dist/resolvers/meetings/index.js.map +1 -0
  245. package/dist/resolvers/meetings/meetingHelpers.d.ts +17 -0
  246. package/dist/resolvers/meetings/meetingHelpers.d.ts.map +1 -0
  247. package/dist/resolvers/meetings/meetingHelpers.js +212 -0
  248. package/dist/resolvers/meetings/meetingHelpers.js.map +1 -0
  249. package/dist/resolvers/meetings/meetingMutations.d.ts +18 -0
  250. package/dist/resolvers/meetings/meetingMutations.d.ts.map +1 -0
  251. package/dist/resolvers/meetings/meetingMutations.js +439 -0
  252. package/dist/resolvers/meetings/meetingMutations.js.map +1 -0
  253. package/dist/resolvers/meetings/meetingQueries.d.ts +7 -0
  254. package/dist/resolvers/meetings/meetingQueries.d.ts.map +1 -0
  255. package/dist/resolvers/meetings/meetingQueries.js +113 -0
  256. package/dist/resolvers/meetings/meetingQueries.js.map +1 -0
  257. package/dist/resolvers/meetings/meetingTypes.d.ts +89 -0
  258. package/dist/resolvers/meetings/meetingTypes.d.ts.map +1 -0
  259. package/dist/resolvers/meetings/meetingTypes.js +345 -0
  260. package/dist/resolvers/meetings/meetingTypes.js.map +1 -0
  261. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  262. package/dist/rest/ViewOperationsHandler.js +8 -5
  263. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  264. package/dist/services/TaskGraphActionRunner.d.ts +8 -0
  265. package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
  266. package/dist/services/TaskGraphActionRunner.js +27 -1
  267. package/dist/services/TaskGraphActionRunner.js.map +1 -1
  268. package/dist/services/TaskGraphContinuationDeliverer.d.ts +4 -3
  269. package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
  270. package/dist/services/TaskGraphContinuationDeliverer.js +13 -7
  271. package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
  272. package/dist/services/WorkQueueHostService.d.ts +36 -0
  273. package/dist/services/WorkQueueHostService.d.ts.map +1 -0
  274. package/dist/services/WorkQueueHostService.js +97 -0
  275. package/dist/services/WorkQueueHostService.js.map +1 -0
  276. package/dist/services/workQueueConfig.d.ts +103 -0
  277. package/dist/services/workQueueConfig.d.ts.map +1 -0
  278. package/dist/services/workQueueConfig.js +48 -0
  279. package/dist/services/workQueueConfig.js.map +1 -0
  280. package/dist/sharedCache.d.ts +105 -0
  281. package/dist/sharedCache.d.ts.map +1 -0
  282. package/dist/sharedCache.js +276 -0
  283. package/dist/sharedCache.js.map +1 -0
  284. package/dist/types.d.ts +11 -0
  285. package/dist/types.d.ts.map +1 -1
  286. package/dist/types.js.map +1 -1
  287. package/package.json +97 -94
  288. package/src/__tests__/ActionResolver.authorization.test.ts +353 -0
  289. package/src/__tests__/AdhocQueryResolver.bugs.test.ts +14 -35
  290. package/src/__tests__/AdhocQueryResolver.pagination.test.ts +6 -2
  291. package/src/__tests__/AdhocQueryResolver.scopeGuard.test.ts +3 -3
  292. package/src/__tests__/AdhocQueryResolver.sqlAuthorizer.test.ts +104 -0
  293. package/src/__tests__/BridgeHostInstance.test.ts +232 -0
  294. package/src/__tests__/ClientToolRequestResolver.test.ts +116 -0
  295. package/src/__tests__/EntityRecordNameResolver.fieldSecurity.test.ts +27 -72
  296. package/src/__tests__/FetchEntityVectorsResolver.test.ts +285 -0
  297. package/src/__tests__/HostInstance.test.ts +84 -0
  298. package/src/__tests__/HumanHandoffResolver.test.ts +250 -0
  299. package/src/__tests__/MeetingResolver.test.ts +448 -0
  300. package/src/__tests__/RealtimeBridgeResolver.test.ts +651 -4
  301. package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +383 -0
  302. package/src/__tests__/RealtimeClientSessionResolver.test.ts +682 -58
  303. package/src/__tests__/RealtimeProxyServer.test.ts +16 -1
  304. package/src/__tests__/RealtimeRelay.test.ts +876 -0
  305. package/src/__tests__/RemoteBrowserActionResolver.goalRunLink.test.ts +129 -0
  306. package/src/__tests__/ResolverBase.adhocReadScope.test.ts +96 -0
  307. package/src/__tests__/ResolverBase.aggregateScreen.test.ts +174 -0
  308. package/src/__tests__/ResolverBase.clientOldValues.test.ts +6 -3
  309. package/src/__tests__/ResolverBase.filterEscaping.test.ts +21 -2
  310. package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +291 -0
  311. package/src/__tests__/ReturningVisitorRecap.test.ts +115 -0
  312. package/src/__tests__/RunAIAgentResolver.branch.test.ts +169 -0
  313. package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +4 -4
  314. package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +166 -0
  315. package/src/__tests__/RunTemplateResolver.test.ts +132 -0
  316. package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +63 -0
  317. package/src/__tests__/SessionJanitor.test.ts +845 -18
  318. package/src/__tests__/SessionManager.test.ts +213 -17
  319. package/src/__tests__/SessionRunIDVerifier.test.ts +251 -0
  320. package/src/__tests__/SyncRolesUsersResolver.userRoles.test.ts +97 -0
  321. package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +41 -0
  322. package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +50 -3
  323. package/src/__tests__/UserAvatarResolver.test.ts +255 -0
  324. package/src/__tests__/UserResolver.currentUser.test.ts +16 -1
  325. package/src/__tests__/WorkQueueHostService.test.ts +133 -0
  326. package/src/__tests__/actionAuthorization.test.ts +130 -0
  327. package/src/__tests__/adhocTimeoutClamp.test.ts +26 -0
  328. package/src/__tests__/agentVisionConsentAudit.test.ts +118 -0
  329. package/src/__tests__/avatarInputValidation.test.ts +160 -0
  330. package/src/__tests__/isolatedProviderTransactions.test.ts +169 -0
  331. package/src/__tests__/magicLinkService.consume.test.ts +6 -0
  332. package/src/__tests__/magicLinkService.provisionLog.test.ts +5 -0
  333. package/src/__tests__/newUsers.template.test.ts +151 -0
  334. package/src/__tests__/newUsers.test.ts +74 -5
  335. package/src/__tests__/orphanedConversationDetailReconciler.test.ts +17 -2
  336. package/src/__tests__/postgresqlPoolSettings.test.ts +131 -0
  337. package/src/__tests__/realtimeSessions/RealtimeSessionEventService.test.ts +201 -0
  338. package/src/__tests__/realtimeSessions/RealtimeSessionEventsResolver.test.ts +215 -0
  339. package/src/__tests__/realtimeSessions/RealtimeSessionVerificationResolver.test.ts +102 -0
  340. package/src/__tests__/realtimeSessions/RealtimeSessionVerificationService.test.ts +349 -0
  341. package/src/__tests__/realtimeSessions/RealtimeVerifyRouter.test.ts +131 -0
  342. package/src/__tests__/realtimeSessions/SlidingWindowRateLimiter.test.ts +56 -0
  343. package/src/__tests__/realtimeSessions/helpers.ts +4 -0
  344. package/src/__tests__/realtimeSessions/sessionAccess.test.ts +129 -0
  345. package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +124 -0
  346. package/src/__tests__/realtimeSessions/verificationCore.test.ts +355 -0
  347. package/src/__tests__/realtimeSessions/verificationPages.test.ts +84 -0
  348. package/src/__tests__/realtimeSessions/verificationPolicy.test.ts +226 -0
  349. package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +633 -0
  350. package/src/__tests__/resolverBase.fls.test.ts +87 -4
  351. package/src/__tests__/serverExtensionReservedRoots.test.ts +2 -0
  352. package/src/__tests__/sharedCache.test.ts +310 -0
  353. package/src/__tests__/translateBracketsToPG.test.ts +20 -0
  354. package/src/__tests__/widgetGuestElevation.test.ts +44 -0
  355. package/src/agentSessions/BridgeHostInstance.ts +32 -0
  356. package/src/agentSessions/HostInstance.ts +124 -28
  357. package/src/agentSessions/ReturningVisitorRecap.ts +7 -3
  358. package/src/agentSessions/SessionJanitor.ts +543 -57
  359. package/src/agentSessions/SessionManager.ts +125 -25
  360. package/src/agentSessions/SessionRunIDVerifier.ts +171 -0
  361. package/src/agentSessions/index.ts +10 -3
  362. package/src/auth/actionAuthorization.ts +116 -0
  363. package/src/auth/index.ts +3 -8
  364. package/src/auth/magicLink/MagicLinkService.ts +6 -3
  365. package/src/auth/newUsers.ts +99 -11
  366. package/src/config.ts +255 -3
  367. package/src/context.ts +26 -34
  368. package/src/generated/graphql-schemas/__mj.ts +22701 -18838
  369. package/src/generic/OrphanedConversationDetailReconciler.ts +3 -3
  370. package/src/generic/ResolverBase.ts +210 -36
  371. package/src/generic/RunViewResolver.ts +37 -2
  372. package/src/index.ts +236 -170
  373. package/src/isolatedProvider.ts +22 -0
  374. package/src/postgresqlCompat.ts +21 -0
  375. package/src/postgresqlPoolSettings.ts +213 -0
  376. package/src/realtimeProxy/RealtimeProxyServer.ts +148 -16
  377. package/src/realtimeProxy/RealtimeRelayTunnel.ts +645 -0
  378. package/src/realtimeSessions/README.md +179 -0
  379. package/src/realtimeSessions/RealtimeSessionEventService.ts +274 -0
  380. package/src/realtimeSessions/RealtimeSessionVerificationService.ts +167 -0
  381. package/src/realtimeSessions/RealtimeVerifyRouter.ts +108 -0
  382. package/src/realtimeSessions/SessionVerificationPortsBase.ts +189 -0
  383. package/src/realtimeSessions/SlidingWindowRateLimiter.ts +92 -0
  384. package/src/realtimeSessions/index.ts +16 -0
  385. package/src/realtimeSessions/sessionAccess.ts +141 -0
  386. package/src/realtimeSessions/sessionConfigStamps.ts +123 -0
  387. package/src/realtimeSessions/subscriptionAuthorization.ts +116 -0
  388. package/src/realtimeSessions/verificationCore.ts +502 -0
  389. package/src/realtimeSessions/verificationPages.ts +149 -0
  390. package/src/realtimeSessions/verificationPolicy.ts +321 -0
  391. package/src/realtimeSessions/verificationWorkflow.ts +702 -0
  392. package/src/realtimeWidget/widgetGuestElevation.ts +34 -2
  393. package/src/resolvers/ActionResolver.ts +84 -21
  394. package/src/resolvers/AdhocQueryResolver.ts +105 -187
  395. package/src/resolvers/CacheStatsResolver.ts +89 -2
  396. package/src/resolvers/ClientToolRequestResolver.ts +25 -7
  397. package/src/resolvers/EntityRecordNameResolver.ts +9 -51
  398. package/src/resolvers/FetchEntityVectorsResolver.ts +97 -2
  399. package/src/resolvers/GetDataResolver.ts +10 -0
  400. package/src/resolvers/HumanHandoffResolver.ts +312 -0
  401. package/src/resolvers/MCPResolver.ts +8 -5
  402. package/src/resolvers/MeetingResolver.ts +438 -0
  403. package/src/resolvers/RealtimeBridgeResolver.ts +385 -19
  404. package/src/resolvers/RealtimeClientSessionResolver.ts +503 -344
  405. package/src/resolvers/RealtimeSessionEventsResolver.ts +133 -0
  406. package/src/resolvers/RealtimeSessionVerificationResolver.ts +174 -0
  407. package/src/resolvers/RemoteBrowserActionResolver.ts +11 -1
  408. package/src/resolvers/RunAIAgentResolver.ts +78 -11
  409. package/src/resolvers/RunTemplateResolver.ts +13 -12
  410. package/src/resolvers/SyncDataResolver.ts +6 -2
  411. package/src/resolvers/SyncRolesUsersResolver.ts +24 -6
  412. package/src/resolvers/UserAvatarResolver.ts +111 -0
  413. package/src/resolvers/UserResolver.ts +2 -16
  414. package/src/resolvers/adhocTimeout.ts +12 -0
  415. package/src/resolvers/agentVisionConsentAudit.ts +82 -0
  416. package/src/resolvers/avatarInputValidation.ts +123 -0
  417. package/src/resolvers/currentUserRoles.ts +32 -1
  418. package/src/resolvers/meetings/index.ts +4 -0
  419. package/src/resolvers/meetings/meetingHelpers.ts +307 -0
  420. package/src/resolvers/meetings/meetingMutations.ts +556 -0
  421. package/src/resolvers/meetings/meetingQueries.ts +172 -0
  422. package/src/resolvers/meetings/meetingTypes.ts +238 -0
  423. package/src/rest/ViewOperationsHandler.ts +8 -5
  424. package/src/services/TaskGraphActionRunner.ts +29 -1
  425. package/src/services/TaskGraphContinuationDeliverer.ts +13 -7
  426. package/src/services/WorkQueueHostService.ts +129 -0
  427. package/src/services/workQueueConfig.ts +52 -0
  428. package/src/sharedCache.ts +302 -0
  429. package/src/types.ts +12 -0
  430. package/dist/resolvers/adhoc-query-helpers.d.ts +0 -33
  431. package/dist/resolvers/adhoc-query-helpers.d.ts.map +0 -1
  432. package/dist/resolvers/adhoc-query-helpers.js +0 -50
  433. package/dist/resolvers/adhoc-query-helpers.js.map +0 -1
  434. package/src/__tests__/adhoc-query-helpers.test.ts +0 -50
  435. package/src/resolvers/adhoc-query-helpers.ts +0 -67
@@ -0,0 +1,243 @@
1
+ /**
2
+ * @fileoverview Pure functional core of mid-session identity verification — no DB, no email, no clock
3
+ * of its own. Everything here is deterministic given its inputs (modulo crypto randomness) and is
4
+ * unit-testable with plain assertions.
5
+ *
6
+ * ## What is stored, and where
7
+ *
8
+ * The verification state of a session lives in `AIAgentSession.Config` under the key
9
+ * `identityVerification` (a server-authoritative key — see `sessionConfigGuard` in
10
+ * `@memberjunction/core-entities-server`). It is an {@link IdentityVerificationState}: the policy
11
+ * snapshot taken at mint, how many emails the session has triggered, at most one *pending*
12
+ * verification, and — once done — the verified identity.
13
+ *
14
+ * ## Secrets
15
+ *
16
+ * Nothing redeemable is ever stored: only hashes.
17
+ *
18
+ * - The **link token** is `mj_rv_<session id>_<256 random bits>`. The session id is deliberately part of
19
+ * it so redemption is a primary-key lookup instead of a scan; it is not a secret. Only the SHA-256 of
20
+ * the whole token is stored, and it is compared in constant time.
21
+ * - The **typed code** is 6 digits (the fallback for opening the email on another device). Six digits
22
+ * cannot be made brute-force-proof by hashing — a million candidates is nothing — so its protection is
23
+ * structural: it expires, it is single-use, it is voided after {@link IdentityVerificationPolicy.maxCodeAttempts}
24
+ * wrong entries, only the session's own principal can submit it, and submissions are rate-limited.
25
+ * It is salted and bound to the session id so equal codes do not produce equal stored hashes.
26
+ *
27
+ * Token generation and hashing reuse the magic-link module's primitives (`HashToken`).
28
+ *
29
+ * @module @memberjunction/server/realtimeSessions
30
+ */
31
+ import type { IdentityVerificationPolicy, ResolvedIdentityVerificationPolicy } from './verificationPolicy.js';
32
+ /** Prefix of a verification link token (mirrors `mj_ml_` / `mj_sk_`). */
33
+ export declare const VERIFICATION_TOKEN_PREFIX = "mj_rv_";
34
+ /** Number of digits in the typed code. */
35
+ export declare const VERIFICATION_CODE_LENGTH = 6;
36
+ /** Longest name accepted, in characters. */
37
+ export declare const MAX_VERIFICATION_NAME_LENGTH = 100;
38
+ /** A verification that has been requested and not yet redeemed. Holds hashes only. */
39
+ export interface PendingVerification {
40
+ /** SHA-256 (base64url) of the link token. */
41
+ TokenHash: string;
42
+ /** Salted, server-keyed HMAC-SHA-256 (base64url) of the typed code. */
43
+ CodeHash: string;
44
+ /** Random per-verification salt for {@link PendingVerification.CodeHash}. */
45
+ CodeSalt: string;
46
+ /** The address the link and code were sent to (normalised). */
47
+ Email: string;
48
+ /** The name given with the request (sanitised, length-capped). */
49
+ Name: string;
50
+ /** ISO instant the verification was requested. */
51
+ RequestedAt: string;
52
+ /** ISO instant after which neither the link nor the code redeems. */
53
+ ExpiresAt: string;
54
+ /** Wrong code entries so far. */
55
+ CodeAttempts: number;
56
+ }
57
+ /** The proven identity of a verified session. */
58
+ export interface VerifiedIdentity {
59
+ Email: string;
60
+ Name: string;
61
+ /** ISO instant the verification completed. */
62
+ VerifiedAt: string;
63
+ /** How it was proven. */
64
+ Method: 'link' | 'code';
65
+ }
66
+ /** The whole verification state of one session (the value of `Config.identityVerification`). */
67
+ export interface IdentityVerificationState {
68
+ /** The session-scoped policy layer, snapshotted at mint. Absent when the cascade carried none. */
69
+ Policy?: IdentityVerificationPolicy;
70
+ /** How many verification emails this session has triggered (a send that failed to deliver does not count). */
71
+ SendCount: number;
72
+ /** The outstanding verification, if any. A new request replaces it. */
73
+ Pending?: PendingVerification;
74
+ /** Set once verified. */
75
+ Verified?: VerifiedIdentity;
76
+ }
77
+ /** A state with nothing in it. */
78
+ export declare function EmptyIdentityVerificationState(): IdentityVerificationState;
79
+ /**
80
+ * Reads the verification state out of a session's `Config` JSON. Tolerant by design: a missing,
81
+ * malformed or partial value yields an empty / partial state rather than an exception, because a
82
+ * garbled state must never be the reason a session cannot be addressed.
83
+ *
84
+ * @param configRaw - `AIAgentSession.Config` as stored
85
+ * @param readPolicy - reads a policy layer from untrusted JSON (injected to keep this module free of policy wiring)
86
+ */
87
+ export declare function ReadIdentityVerificationState(configRaw: string | null | undefined, readPolicy: (raw: unknown) => IdentityVerificationPolicy): IdentityVerificationState;
88
+ /** Parses a `Config` JSON string into a plain object; anything else is `{}`. */
89
+ export declare function ParseConfigObject(raw: string | null | undefined): Record<string, unknown>;
90
+ /**
91
+ * Returns `configRaw` with `identityVerification` (and, when given, `maxSessionDeadlineIso`) replaced,
92
+ * preserving every other key verbatim.
93
+ *
94
+ * @param configRaw - the stored Config
95
+ * @param state - the new verification state
96
+ * @param deadlineIso - a new absolute deadline to write, or undefined to leave the existing one alone
97
+ */
98
+ export declare function WriteIdentityVerificationState(configRaw: string | null | undefined, state: IdentityVerificationState, deadlineIso?: string): string;
99
+ /**
100
+ * Generates a verification link token bound (by construction) to one session.
101
+ *
102
+ * @param agentSessionId - the session the token redeems against
103
+ * @throws Error when `agentSessionId` is not a UUID — a programming error, never user input
104
+ */
105
+ export declare function GenerateVerificationToken(agentSessionId: string): string;
106
+ /** The structure of a token, once parsed. */
107
+ export interface ParsedVerificationToken {
108
+ /** The session id embedded in the token (dashed, lower-case). Not a secret and not yet trusted. */
109
+ AgentSessionID: string;
110
+ }
111
+ /**
112
+ * Parses a presented token's structure. Success means "well-formed", NOT "valid": validity is decided
113
+ * only by comparing hashes ({@link EvaluateRedemption}).
114
+ *
115
+ * @returns the embedded session id, or null for anything malformed
116
+ */
117
+ export declare function ParseVerificationToken(token: string): ParsedVerificationToken | null;
118
+ /** Generates a uniformly random numeric code of {@link VERIFICATION_CODE_LENGTH} digits. */
119
+ export declare function GenerateVerificationCode(): string;
120
+ /**
121
+ * Normalises a typed code: strips spaces and dashes (people type "123 456"). Returns null unless the
122
+ * result is exactly {@link VERIFICATION_CODE_LENGTH} digits.
123
+ */
124
+ export declare function NormalizeVerificationCode(input: string): string | null;
125
+ /** Hash stored for a link token. */
126
+ export declare function HashVerificationToken(token: string): string;
127
+ /**
128
+ * Hash stored for a code: an HMAC-SHA-256 under a SERVER-ONLY key, salted and bound to the session so
129
+ * equal codes never hash equal.
130
+ *
131
+ * The key is what makes this safe. A code is only six digits, and the session's owner — the very person
132
+ * being verified — can read their own `Session.Config`, hash and salt included. A plain (even salted)
133
+ * hash would let them recover the code offline in about a million guesses without ever opening the
134
+ * inbox, bypassing the attempt cap entirely. Without the key the stored value is useless to a reader.
135
+ *
136
+ * @param code - the normalised six-digit code
137
+ * @param salt - the per-verification salt stored beside the hash
138
+ * @param agentSessionId - the session the code is bound to
139
+ * @param key - the server-only key (`realtime.identityVerification.hmacSecret`); must be non-empty
140
+ */
141
+ export declare function HashVerificationCode(code: string, salt: string, agentSessionId: string, key: string): string;
142
+ /**
143
+ * Constant-time equality of two hash strings. Both are re-hashed to a fixed length first, so neither
144
+ * the comparison time nor an early length check reveals how much of a guess was right.
145
+ */
146
+ export declare function HashesEqual(a: string, b: string): boolean;
147
+ /**
148
+ * Sanitises a display name: collapses whitespace, strips control characters and the characters that
149
+ * could shape markup or a header (`<`, `>`, `"`), and caps the length. The result is for display
150
+ * only — it is still HTML-escaped wherever it is rendered.
151
+ *
152
+ * @returns the cleaned name, or null when nothing usable is left
153
+ */
154
+ export declare function SanitizeVerificationName(raw: string): string | null;
155
+ /** What {@link IssueVerification} produces: the state to store and the secrets to send. */
156
+ export interface IssuedVerification {
157
+ /** Store this. Contains hashes only. */
158
+ Pending: PendingVerification;
159
+ /** Send this in the link. Never store it. */
160
+ Token: string;
161
+ /** Send this as the typed code. Never store it. */
162
+ Code: string;
163
+ }
164
+ /**
165
+ * Creates a fresh pending verification for a session.
166
+ *
167
+ * @param args.AgentSessionID - the session being verified
168
+ * @param args.Email - the normalised address the secrets will be sent to
169
+ * @param args.Name - the sanitised name
170
+ * @param args.TtlMinutes - how long the secrets stay redeemable
171
+ * @param args.NowMs - the current time, epoch ms
172
+ */
173
+ export declare function IssueVerification(args: {
174
+ AgentSessionID: string;
175
+ Email: string;
176
+ Name: string;
177
+ TtlMinutes: number;
178
+ NowMs: number;
179
+ /** The server-only code-hash key (see {@link HashVerificationCode}). */
180
+ CodeHashKey: string;
181
+ }): IssuedVerification;
182
+ /** What a person presents to redeem a verification. */
183
+ export type VerificationCredential = {
184
+ Kind: 'token';
185
+ Token: string;
186
+ } | {
187
+ Kind: 'code';
188
+ Code: string;
189
+ AgentSessionID: string;
190
+ };
191
+ /** Why a redemption was refused. */
192
+ export type RedemptionRefusal = 'already_verified' | 'no_pending' | 'expired' | 'invalid' | 'attempts_exhausted';
193
+ /** Outcome of {@link EvaluateRedemption}. `Next` is the state to persist in every case. */
194
+ export type RedemptionOutcome = {
195
+ Outcome: 'verified';
196
+ Next: IdentityVerificationState;
197
+ Verified: VerifiedIdentity;
198
+ } | {
199
+ Outcome: 'rejected';
200
+ Reason: RedemptionRefusal;
201
+ Next: IdentityVerificationState;
202
+ AttemptsRemaining?: number;
203
+ };
204
+ /**
205
+ * Decides a redemption attempt and returns the state to persist. Pure: the caller supplies the time.
206
+ *
207
+ * Properties this function guarantees (and the tests pin):
208
+ *
209
+ * - **Single use.** A success removes the pending verification, so neither the link nor the code works again.
210
+ * - **Expiry.** Past `ExpiresAt` nothing redeems, and the stale pending verification is cleared.
211
+ * - **Bounded guessing.** A wrong code increments `CodeAttempts`; reaching `maxCodeAttempts` voids the
212
+ * pending verification (a new request — itself capped by `maxSendsPerSession` — is needed). A wrong
213
+ * *token* changes nothing: 256 random bits are not guessable, and counting them would let a stranger
214
+ * burn a legitimate person's pending link just by hitting the URL.
215
+ * - **Constant-time compares.** Secrets are compared via {@link HashesEqual}.
216
+ *
217
+ * @param state - the session's current verification state
218
+ * @param credential - what was presented
219
+ * @param nowMs - the current time, epoch ms
220
+ * @param policy - the resolved policy (for `maxCodeAttempts`)
221
+ * @param codeHashKey - the server-only code-hash key (see {@link HashVerificationCode})
222
+ */
223
+ export declare function EvaluateRedemption(state: IdentityVerificationState, credential: VerificationCredential, nowMs: number, policy: Pick<ResolvedIdentityVerificationPolicy, 'maxCodeAttempts'>, codeHashKey: string): RedemptionOutcome;
224
+ /**
225
+ * The session deadline after a successful verification, or `undefined` when verification should not
226
+ * change it.
227
+ *
228
+ * Verification only ever **extends** a deadline that exists: a session with no deadline stays
229
+ * uncapped, and a `verifiedMaxSeconds` shorter than what is already granted never pulls a deadline in.
230
+ * The new deadline is measured from the session's start, so `verifiedMaxSeconds` means "a verified
231
+ * session may run this long in total", the same meaning `unverifiedMaxSeconds` has.
232
+ *
233
+ * @param args.CurrentDeadlineIso - the stamped deadline, if any
234
+ * @param args.SessionStartedAtMs - when the session started, epoch ms
235
+ * @param args.VerifiedMaxSeconds - the verified cap from policy, if any
236
+ * @returns the new ISO deadline, or undefined for "leave it alone"
237
+ */
238
+ export declare function ComputeVerifiedDeadline(args: {
239
+ CurrentDeadlineIso: string | undefined;
240
+ SessionStartedAtMs: number;
241
+ VerifiedMaxSeconds: number | undefined;
242
+ }): string | undefined;
243
+ //# sourceMappingURL=verificationCore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verificationCore.d.ts","sourceRoot":"","sources":["../../src/realtimeSessions/verificationCore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,356 @@
1
+ /**
2
+ * @fileoverview Pure functional core of mid-session identity verification — no DB, no email, no clock
3
+ * of its own. Everything here is deterministic given its inputs (modulo crypto randomness) and is
4
+ * unit-testable with plain assertions.
5
+ *
6
+ * ## What is stored, and where
7
+ *
8
+ * The verification state of a session lives in `AIAgentSession.Config` under the key
9
+ * `identityVerification` (a server-authoritative key — see `sessionConfigGuard` in
10
+ * `@memberjunction/core-entities-server`). It is an {@link IdentityVerificationState}: the policy
11
+ * snapshot taken at mint, how many emails the session has triggered, at most one *pending*
12
+ * verification, and — once done — the verified identity.
13
+ *
14
+ * ## Secrets
15
+ *
16
+ * Nothing redeemable is ever stored: only hashes.
17
+ *
18
+ * - The **link token** is `mj_rv_<session id>_<256 random bits>`. The session id is deliberately part of
19
+ * it so redemption is a primary-key lookup instead of a scan; it is not a secret. Only the SHA-256 of
20
+ * the whole token is stored, and it is compared in constant time.
21
+ * - The **typed code** is 6 digits (the fallback for opening the email on another device). Six digits
22
+ * cannot be made brute-force-proof by hashing — a million candidates is nothing — so its protection is
23
+ * structural: it expires, it is single-use, it is voided after {@link IdentityVerificationPolicy.maxCodeAttempts}
24
+ * wrong entries, only the session's own principal can submit it, and submissions are rate-limited.
25
+ * It is salted and bound to the session id so equal codes do not produce equal stored hashes.
26
+ *
27
+ * Token generation and hashing reuse the magic-link module's primitives (`HashToken`).
28
+ *
29
+ * @module @memberjunction/server/realtimeSessions
30
+ */
31
+ import { createHash, createHmac, randomBytes, randomInt, timingSafeEqual } from 'node:crypto';
32
+ import { HashToken } from '../auth/magicLink/magicLinkCore.js';
33
+ /** Prefix of a verification link token (mirrors `mj_ml_` / `mj_sk_`). */
34
+ export const VERIFICATION_TOKEN_PREFIX = 'mj_rv_';
35
+ /** Number of digits in the typed code. */
36
+ export const VERIFICATION_CODE_LENGTH = 6;
37
+ /** Longest name accepted, in characters. */
38
+ export const MAX_VERIFICATION_NAME_LENGTH = 100;
39
+ /** A state with nothing in it. */
40
+ export function EmptyIdentityVerificationState() {
41
+ return { SendCount: 0 };
42
+ }
43
+ /** True for a plain object. */
44
+ function isRecord(value) {
45
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
46
+ }
47
+ /** True for a non-empty string. */
48
+ function isNonEmptyString(value) {
49
+ return typeof value === 'string' && value.length > 0;
50
+ }
51
+ /** Reads a pending verification from untrusted JSON; undefined unless every field is well-formed. */
52
+ function readPending(value) {
53
+ if (!isRecord(value)) {
54
+ return undefined;
55
+ }
56
+ const { TokenHash, CodeHash, CodeSalt, Email, Name, RequestedAt, ExpiresAt, CodeAttempts } = value;
57
+ if (!isNonEmptyString(TokenHash) || !isNonEmptyString(CodeHash) || !isNonEmptyString(CodeSalt) ||
58
+ !isNonEmptyString(Email) || typeof Name !== 'string' || !isNonEmptyString(RequestedAt) ||
59
+ !isNonEmptyString(ExpiresAt) || typeof CodeAttempts !== 'number' || !Number.isFinite(CodeAttempts)) {
60
+ return undefined;
61
+ }
62
+ return { TokenHash, CodeHash, CodeSalt, Email, Name, RequestedAt, ExpiresAt, CodeAttempts };
63
+ }
64
+ /** Reads a verified identity from untrusted JSON; undefined unless every field is well-formed. */
65
+ function readVerified(value) {
66
+ if (!isRecord(value)) {
67
+ return undefined;
68
+ }
69
+ const { Email, Name, VerifiedAt, Method } = value;
70
+ if (!isNonEmptyString(Email) || typeof Name !== 'string' || !isNonEmptyString(VerifiedAt) || (Method !== 'link' && Method !== 'code')) {
71
+ return undefined;
72
+ }
73
+ return { Email, Name, VerifiedAt, Method };
74
+ }
75
+ /**
76
+ * Reads the verification state out of a session's `Config` JSON. Tolerant by design: a missing,
77
+ * malformed or partial value yields an empty / partial state rather than an exception, because a
78
+ * garbled state must never be the reason a session cannot be addressed.
79
+ *
80
+ * @param configRaw - `AIAgentSession.Config` as stored
81
+ * @param readPolicy - reads a policy layer from untrusted JSON (injected to keep this module free of policy wiring)
82
+ */
83
+ export function ReadIdentityVerificationState(configRaw, readPolicy) {
84
+ const config = ParseConfigObject(configRaw);
85
+ const stored = config['identityVerification'];
86
+ if (!isRecord(stored)) {
87
+ return EmptyIdentityVerificationState();
88
+ }
89
+ const sends = stored['SendCount'];
90
+ const state = {
91
+ SendCount: typeof sends === 'number' && Number.isFinite(sends) && sends >= 0 ? Math.floor(sends) : 0,
92
+ };
93
+ const policy = readPolicy(stored['Policy']);
94
+ if (Object.keys(policy).length > 0) {
95
+ state.Policy = policy;
96
+ }
97
+ const pending = readPending(stored['Pending']);
98
+ if (pending) {
99
+ state.Pending = pending;
100
+ }
101
+ const verified = readVerified(stored['Verified']);
102
+ if (verified) {
103
+ state.Verified = verified;
104
+ }
105
+ return state;
106
+ }
107
+ /** Parses a `Config` JSON string into a plain object; anything else is `{}`. */
108
+ export function ParseConfigObject(raw) {
109
+ if (typeof raw !== 'string' || raw.trim().length === 0) {
110
+ return {};
111
+ }
112
+ try {
113
+ const parsed = JSON.parse(raw);
114
+ return isRecord(parsed) ? parsed : {};
115
+ }
116
+ catch {
117
+ return {};
118
+ }
119
+ }
120
+ /**
121
+ * Returns `configRaw` with `identityVerification` (and, when given, `maxSessionDeadlineIso`) replaced,
122
+ * preserving every other key verbatim.
123
+ *
124
+ * @param configRaw - the stored Config
125
+ * @param state - the new verification state
126
+ * @param deadlineIso - a new absolute deadline to write, or undefined to leave the existing one alone
127
+ */
128
+ export function WriteIdentityVerificationState(configRaw, state, deadlineIso) {
129
+ const config = ParseConfigObject(configRaw);
130
+ config['identityVerification'] = state;
131
+ if (deadlineIso !== undefined) {
132
+ config['maxSessionDeadlineIso'] = deadlineIso;
133
+ }
134
+ return JSON.stringify(config);
135
+ }
136
+ // ───────────────────────── tokens, codes, hashing ─────────────────────────
137
+ /** Lower-case 32-hex form of a UUID (the dashes dropped), or null when it is not a UUID. */
138
+ function compactUUID(uuid) {
139
+ const compact = uuid.replace(/-/g, '').toLowerCase();
140
+ return /^[0-9a-f]{32}$/.test(compact) ? compact : null;
141
+ }
142
+ /** Re-inserts the dashes of a compact UUID. */
143
+ function expandUUID(compact) {
144
+ return `${compact.slice(0, 8)}-${compact.slice(8, 12)}-${compact.slice(12, 16)}-${compact.slice(16, 20)}-${compact.slice(20)}`;
145
+ }
146
+ /**
147
+ * Generates a verification link token bound (by construction) to one session.
148
+ *
149
+ * @param agentSessionId - the session the token redeems against
150
+ * @throws Error when `agentSessionId` is not a UUID — a programming error, never user input
151
+ */
152
+ export function GenerateVerificationToken(agentSessionId) {
153
+ const compact = compactUUID(agentSessionId);
154
+ if (!compact) {
155
+ throw new Error(`GenerateVerificationToken: '${agentSessionId}' is not a session id`);
156
+ }
157
+ return `${VERIFICATION_TOKEN_PREFIX}${compact}_${randomBytes(32).toString('hex')}`;
158
+ }
159
+ /** Token shape: prefix, 32 hex of session id, `_`, 64 hex of randomness. */
160
+ const TOKEN_PATTERN = new RegExp(`^${VERIFICATION_TOKEN_PREFIX}([0-9a-f]{32})_[0-9a-f]{64}$`);
161
+ /**
162
+ * Parses a presented token's structure. Success means "well-formed", NOT "valid": validity is decided
163
+ * only by comparing hashes ({@link EvaluateRedemption}).
164
+ *
165
+ * @returns the embedded session id, or null for anything malformed
166
+ */
167
+ export function ParseVerificationToken(token) {
168
+ const match = typeof token === 'string' ? TOKEN_PATTERN.exec(token) : null;
169
+ return match ? { AgentSessionID: expandUUID(match[1]) } : null;
170
+ }
171
+ /** Generates a uniformly random numeric code of {@link VERIFICATION_CODE_LENGTH} digits. */
172
+ export function GenerateVerificationCode() {
173
+ return randomInt(0, 10 ** VERIFICATION_CODE_LENGTH).toString().padStart(VERIFICATION_CODE_LENGTH, '0');
174
+ }
175
+ /**
176
+ * Normalises a typed code: strips spaces and dashes (people type "123 456"). Returns null unless the
177
+ * result is exactly {@link VERIFICATION_CODE_LENGTH} digits.
178
+ */
179
+ export function NormalizeVerificationCode(input) {
180
+ const stripped = (input ?? '').replace(/[\s-]/g, '');
181
+ return new RegExp(`^\\d{${VERIFICATION_CODE_LENGTH}}$`).test(stripped) ? stripped : null;
182
+ }
183
+ /** Hash stored for a link token. */
184
+ export function HashVerificationToken(token) {
185
+ return HashToken(token);
186
+ }
187
+ /**
188
+ * Hash stored for a code: an HMAC-SHA-256 under a SERVER-ONLY key, salted and bound to the session so
189
+ * equal codes never hash equal.
190
+ *
191
+ * The key is what makes this safe. A code is only six digits, and the session's owner — the very person
192
+ * being verified — can read their own `Session.Config`, hash and salt included. A plain (even salted)
193
+ * hash would let them recover the code offline in about a million guesses without ever opening the
194
+ * inbox, bypassing the attempt cap entirely. Without the key the stored value is useless to a reader.
195
+ *
196
+ * @param code - the normalised six-digit code
197
+ * @param salt - the per-verification salt stored beside the hash
198
+ * @param agentSessionId - the session the code is bound to
199
+ * @param key - the server-only key (`realtime.identityVerification.hmacSecret`); must be non-empty
200
+ */
201
+ export function HashVerificationCode(code, salt, agentSessionId, key) {
202
+ if (!key) {
203
+ throw new Error('HashVerificationCode requires a non-empty server key.');
204
+ }
205
+ return createHmac('sha256', key).update(`rv-code:${agentSessionId.toLowerCase()}:${salt}:${code}`).digest('base64url');
206
+ }
207
+ /**
208
+ * Constant-time equality of two hash strings. Both are re-hashed to a fixed length first, so neither
209
+ * the comparison time nor an early length check reveals how much of a guess was right.
210
+ */
211
+ export function HashesEqual(a, b) {
212
+ const digestA = createHash('sha256').update(a).digest();
213
+ const digestB = createHash('sha256').update(b).digest();
214
+ return timingSafeEqual(digestA, digestB);
215
+ }
216
+ /**
217
+ * Sanitises a display name: collapses whitespace, strips control characters and the characters that
218
+ * could shape markup or a header (`<`, `>`, `"`), and caps the length. The result is for display
219
+ * only — it is still HTML-escaped wherever it is rendered.
220
+ *
221
+ * @returns the cleaned name, or null when nothing usable is left
222
+ */
223
+ export function SanitizeVerificationName(raw) {
224
+ const cleaned = (raw ?? '')
225
+ // eslint-disable-next-line no-control-regex -- stripping control characters is the point
226
+ .replace(/[\u0000-\u001F\u007F-\u009F<>"]/g, ' ')
227
+ .replace(/\s+/g, ' ')
228
+ .trim()
229
+ .slice(0, MAX_VERIFICATION_NAME_LENGTH)
230
+ .trim();
231
+ return cleaned.length > 0 ? cleaned : null;
232
+ }
233
+ /**
234
+ * Creates a fresh pending verification for a session.
235
+ *
236
+ * @param args.AgentSessionID - the session being verified
237
+ * @param args.Email - the normalised address the secrets will be sent to
238
+ * @param args.Name - the sanitised name
239
+ * @param args.TtlMinutes - how long the secrets stay redeemable
240
+ * @param args.NowMs - the current time, epoch ms
241
+ */
242
+ export function IssueVerification(args) {
243
+ const token = GenerateVerificationToken(args.AgentSessionID);
244
+ const code = GenerateVerificationCode();
245
+ const salt = randomBytes(16).toString('base64url');
246
+ return {
247
+ Token: token,
248
+ Code: code,
249
+ Pending: {
250
+ TokenHash: HashVerificationToken(token),
251
+ CodeHash: HashVerificationCode(code, salt, args.AgentSessionID, args.CodeHashKey),
252
+ CodeSalt: salt,
253
+ Email: args.Email,
254
+ Name: args.Name,
255
+ RequestedAt: new Date(args.NowMs).toISOString(),
256
+ ExpiresAt: new Date(args.NowMs + args.TtlMinutes * 60_000).toISOString(),
257
+ CodeAttempts: 0,
258
+ },
259
+ };
260
+ }
261
+ /** `state` with the pending verification removed. */
262
+ function withoutPending(state) {
263
+ const { Pending: _removed, ...rest } = state;
264
+ return rest;
265
+ }
266
+ /**
267
+ * Decides a redemption attempt and returns the state to persist. Pure: the caller supplies the time.
268
+ *
269
+ * Properties this function guarantees (and the tests pin):
270
+ *
271
+ * - **Single use.** A success removes the pending verification, so neither the link nor the code works again.
272
+ * - **Expiry.** Past `ExpiresAt` nothing redeems, and the stale pending verification is cleared.
273
+ * - **Bounded guessing.** A wrong code increments `CodeAttempts`; reaching `maxCodeAttempts` voids the
274
+ * pending verification (a new request — itself capped by `maxSendsPerSession` — is needed). A wrong
275
+ * *token* changes nothing: 256 random bits are not guessable, and counting them would let a stranger
276
+ * burn a legitimate person's pending link just by hitting the URL.
277
+ * - **Constant-time compares.** Secrets are compared via {@link HashesEqual}.
278
+ *
279
+ * @param state - the session's current verification state
280
+ * @param credential - what was presented
281
+ * @param nowMs - the current time, epoch ms
282
+ * @param policy - the resolved policy (for `maxCodeAttempts`)
283
+ * @param codeHashKey - the server-only code-hash key (see {@link HashVerificationCode})
284
+ */
285
+ export function EvaluateRedemption(state, credential, nowMs, policy, codeHashKey) {
286
+ if (state.Verified) {
287
+ return { Outcome: 'rejected', Reason: 'already_verified', Next: state };
288
+ }
289
+ const pending = state.Pending;
290
+ if (!pending) {
291
+ return { Outcome: 'rejected', Reason: 'no_pending', Next: state };
292
+ }
293
+ if (nowMs >= Date.parse(pending.ExpiresAt) || Number.isNaN(Date.parse(pending.ExpiresAt))) {
294
+ return { Outcome: 'rejected', Reason: 'expired', Next: withoutPending(state) };
295
+ }
296
+ if (credential.Kind === 'token') {
297
+ return HashesEqual(HashVerificationToken(credential.Token), pending.TokenHash)
298
+ ? verifiedOutcome(state, pending, 'link', nowMs)
299
+ : { Outcome: 'rejected', Reason: 'invalid', Next: state };
300
+ }
301
+ const presented = HashVerificationCode(credential.Code, pending.CodeSalt, credential.AgentSessionID, codeHashKey);
302
+ if (HashesEqual(presented, pending.CodeHash)) {
303
+ return verifiedOutcome(state, pending, 'code', nowMs);
304
+ }
305
+ return wrongCodeOutcome(state, pending, policy.maxCodeAttempts);
306
+ }
307
+ /** The success outcome: pending cleared, identity recorded. */
308
+ function verifiedOutcome(state, pending, method, nowMs) {
309
+ const verified = {
310
+ Email: pending.Email,
311
+ Name: pending.Name,
312
+ VerifiedAt: new Date(nowMs).toISOString(),
313
+ Method: method,
314
+ };
315
+ return { Outcome: 'verified', Next: { ...withoutPending(state), Verified: verified }, Verified: verified };
316
+ }
317
+ /** The wrong-code outcome: one more attempt spent, voiding the pending verification at the cap. */
318
+ function wrongCodeOutcome(state, pending, maxCodeAttempts) {
319
+ const attempts = pending.CodeAttempts + 1;
320
+ if (attempts >= maxCodeAttempts) {
321
+ return { Outcome: 'rejected', Reason: 'attempts_exhausted', Next: withoutPending(state), AttemptsRemaining: 0 };
322
+ }
323
+ return {
324
+ Outcome: 'rejected',
325
+ Reason: 'invalid',
326
+ Next: { ...state, Pending: { ...pending, CodeAttempts: attempts } },
327
+ AttemptsRemaining: maxCodeAttempts - attempts,
328
+ };
329
+ }
330
+ // ───────────────────────── deadline ─────────────────────────
331
+ /**
332
+ * The session deadline after a successful verification, or `undefined` when verification should not
333
+ * change it.
334
+ *
335
+ * Verification only ever **extends** a deadline that exists: a session with no deadline stays
336
+ * uncapped, and a `verifiedMaxSeconds` shorter than what is already granted never pulls a deadline in.
337
+ * The new deadline is measured from the session's start, so `verifiedMaxSeconds` means "a verified
338
+ * session may run this long in total", the same meaning `unverifiedMaxSeconds` has.
339
+ *
340
+ * @param args.CurrentDeadlineIso - the stamped deadline, if any
341
+ * @param args.SessionStartedAtMs - when the session started, epoch ms
342
+ * @param args.VerifiedMaxSeconds - the verified cap from policy, if any
343
+ * @returns the new ISO deadline, or undefined for "leave it alone"
344
+ */
345
+ export function ComputeVerifiedDeadline(args) {
346
+ if (!args.VerifiedMaxSeconds || args.VerifiedMaxSeconds <= 0 || !args.CurrentDeadlineIso) {
347
+ return undefined;
348
+ }
349
+ const currentMs = Date.parse(args.CurrentDeadlineIso);
350
+ const candidateMs = args.SessionStartedAtMs + args.VerifiedMaxSeconds * 1000;
351
+ if (Number.isNaN(currentMs) || Number.isNaN(candidateMs) || candidateMs <= currentMs) {
352
+ return undefined;
353
+ }
354
+ return new Date(candidateMs).toISOString();
355
+ }
356
+ //# sourceMappingURL=verificationCore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verificationCore.js","sourceRoot":"","sources":["../../src/realtimeSessions/verificationCore.ts"],"names":[],"mappings":"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"}