@hashgraphonline/standards-sdk 0.1.158 → 0.1.160

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 (336) hide show
  1. package/dist/cjs/hcs-12/validation/schemas.d.ts +4 -4
  2. package/dist/cjs/hcs-14/index.d.ts +5 -0
  3. package/dist/cjs/hcs-14/index.d.ts.map +1 -1
  4. package/dist/cjs/hcs-14/resolvers/aid-dns-web-profile.d.ts +37 -0
  5. package/dist/cjs/hcs-14/resolvers/aid-dns-web-profile.d.ts.map +1 -0
  6. package/dist/cjs/hcs-14/resolvers/dns.d.ts +3 -0
  7. package/dist/cjs/hcs-14/resolvers/dns.d.ts.map +1 -0
  8. package/dist/cjs/hcs-14/resolvers/hcs-11-profile.d.ts +8 -0
  9. package/dist/cjs/hcs-14/resolvers/hcs-11-profile.d.ts.map +1 -0
  10. package/dist/cjs/hcs-14/resolvers/profile-utils.d.ts +9 -0
  11. package/dist/cjs/hcs-14/resolvers/profile-utils.d.ts.map +1 -0
  12. package/dist/cjs/hcs-14/resolvers/registry.d.ts +21 -1
  13. package/dist/cjs/hcs-14/resolvers/registry.d.ts.map +1 -1
  14. package/dist/cjs/hcs-14/resolvers/types.d.ts +106 -5
  15. package/dist/cjs/hcs-14/resolvers/types.d.ts.map +1 -1
  16. package/dist/cjs/hcs-14/resolvers/uaid-did-resolution-profile.d.ts +10 -0
  17. package/dist/cjs/hcs-14/resolvers/uaid-did-resolution-profile.d.ts.map +1 -0
  18. package/dist/cjs/hcs-14/resolvers/uaid-dns-web-profile.d.ts +22 -0
  19. package/dist/cjs/hcs-14/resolvers/uaid-dns-web-profile.d.ts.map +1 -0
  20. package/dist/cjs/hcs-14/sdk.d.ts +16 -1
  21. package/dist/cjs/hcs-14/sdk.d.ts.map +1 -1
  22. package/dist/cjs/inscribe/inscriber.d.ts +1 -1
  23. package/dist/cjs/inscribe/inscriber.d.ts.map +1 -1
  24. package/dist/cjs/inscribe/inscription-cost.d.ts +12 -0
  25. package/dist/cjs/inscribe/inscription-cost.d.ts.map +1 -0
  26. package/dist/cjs/inscribe/types.d.ts +5 -1
  27. package/dist/cjs/inscribe/types.d.ts.map +1 -1
  28. package/dist/cjs/services/registry-broker/schemas.d.ts +1548 -0
  29. package/dist/cjs/services/registry-broker/schemas.d.ts.map +1 -1
  30. package/dist/cjs/standards-sdk.cjs +2 -2
  31. package/dist/cjs/standards-sdk.cjs.map +1 -1
  32. package/dist/es/hcs-12/validation/schemas.d.ts +4 -4
  33. package/dist/es/hcs-14/index.d.ts +5 -0
  34. package/dist/es/hcs-14/index.d.ts.map +1 -1
  35. package/dist/es/hcs-14/resolvers/aid-dns-web-profile.d.ts +37 -0
  36. package/dist/es/hcs-14/resolvers/aid-dns-web-profile.d.ts.map +1 -0
  37. package/dist/es/hcs-14/resolvers/dns.d.ts +3 -0
  38. package/dist/es/hcs-14/resolvers/dns.d.ts.map +1 -0
  39. package/dist/es/hcs-14/resolvers/hcs-11-profile.d.ts +8 -0
  40. package/dist/es/hcs-14/resolvers/hcs-11-profile.d.ts.map +1 -0
  41. package/dist/es/hcs-14/resolvers/profile-utils.d.ts +9 -0
  42. package/dist/es/hcs-14/resolvers/profile-utils.d.ts.map +1 -0
  43. package/dist/es/hcs-14/resolvers/registry.d.ts +21 -1
  44. package/dist/es/hcs-14/resolvers/registry.d.ts.map +1 -1
  45. package/dist/es/hcs-14/resolvers/types.d.ts +106 -5
  46. package/dist/es/hcs-14/resolvers/types.d.ts.map +1 -1
  47. package/dist/es/hcs-14/resolvers/uaid-did-resolution-profile.d.ts +10 -0
  48. package/dist/es/hcs-14/resolvers/uaid-did-resolution-profile.d.ts.map +1 -0
  49. package/dist/es/hcs-14/resolvers/uaid-dns-web-profile.d.ts +22 -0
  50. package/dist/es/hcs-14/resolvers/uaid-dns-web-profile.d.ts.map +1 -0
  51. package/dist/es/hcs-14/sdk.d.ts +16 -1
  52. package/dist/es/hcs-14/sdk.d.ts.map +1 -1
  53. package/dist/es/inscribe/inscriber.d.ts +1 -1
  54. package/dist/es/inscribe/inscriber.d.ts.map +1 -1
  55. package/dist/es/inscribe/inscription-cost.d.ts +12 -0
  56. package/dist/es/inscribe/inscription-cost.d.ts.map +1 -0
  57. package/dist/es/inscribe/types.d.ts +5 -1
  58. package/dist/es/inscribe/types.d.ts.map +1 -1
  59. package/dist/es/services/registry-broker/schemas.d.ts +1548 -0
  60. package/dist/es/services/registry-broker/schemas.d.ts.map +1 -1
  61. package/dist/es/standards-sdk.es.js +96 -83
  62. package/dist/es/standards-sdk.es.js.map +1 -1
  63. package/dist/es/standards-sdk.es100.js +41 -224
  64. package/dist/es/standards-sdk.es100.js.map +1 -1
  65. package/dist/es/standards-sdk.es101.js +249 -97
  66. package/dist/es/standards-sdk.es101.js.map +1 -1
  67. package/dist/es/standards-sdk.es102.js +95 -27
  68. package/dist/es/standards-sdk.es102.js.map +1 -1
  69. package/dist/es/standards-sdk.es103.js +97 -80
  70. package/dist/es/standards-sdk.es103.js.map +1 -1
  71. package/dist/es/standards-sdk.es104.js +29 -30
  72. package/dist/es/standards-sdk.es104.js.map +1 -1
  73. package/dist/es/standards-sdk.es105.js +229 -249
  74. package/dist/es/standards-sdk.es105.js.map +1 -1
  75. package/dist/es/standards-sdk.es106.js +103 -468
  76. package/dist/es/standards-sdk.es106.js.map +1 -1
  77. package/dist/es/standards-sdk.es107.js +32 -103
  78. package/dist/es/standards-sdk.es107.js.map +1 -1
  79. package/dist/es/standards-sdk.es108.js +79 -155
  80. package/dist/es/standards-sdk.es108.js.map +1 -1
  81. package/dist/es/standards-sdk.es109.js +28 -31
  82. package/dist/es/standards-sdk.es109.js.map +1 -1
  83. package/dist/es/standards-sdk.es11.js +1 -1
  84. package/dist/es/standards-sdk.es110.js +250 -10
  85. package/dist/es/standards-sdk.es110.js.map +1 -1
  86. package/dist/es/standards-sdk.es111.js +451 -115
  87. package/dist/es/standards-sdk.es111.js.map +1 -1
  88. package/dist/es/standards-sdk.es112.js +101 -25
  89. package/dist/es/standards-sdk.es112.js.map +1 -1
  90. package/dist/es/standards-sdk.es113.js +155 -17
  91. package/dist/es/standards-sdk.es113.js.map +1 -1
  92. package/dist/es/standards-sdk.es114.js +29 -155
  93. package/dist/es/standards-sdk.es114.js.map +1 -1
  94. package/dist/es/standards-sdk.es115.js +9 -200
  95. package/dist/es/standards-sdk.es115.js.map +1 -1
  96. package/dist/es/standards-sdk.es116.js +109 -757
  97. package/dist/es/standards-sdk.es116.js.map +1 -1
  98. package/dist/es/standards-sdk.es117.js +27 -11
  99. package/dist/es/standards-sdk.es117.js.map +1 -1
  100. package/dist/es/standards-sdk.es118.js +19 -564
  101. package/dist/es/standards-sdk.es118.js.map +1 -1
  102. package/dist/es/standards-sdk.es119.js +140 -582
  103. package/dist/es/standards-sdk.es119.js.map +1 -1
  104. package/dist/es/standards-sdk.es12.js +1 -1
  105. package/dist/es/standards-sdk.es120.js +202 -12
  106. package/dist/es/standards-sdk.es120.js.map +1 -1
  107. package/dist/es/standards-sdk.es121.js +790 -2
  108. package/dist/es/standards-sdk.es121.js.map +1 -1
  109. package/dist/es/standards-sdk.es122.js +10 -84
  110. package/dist/es/standards-sdk.es122.js.map +1 -1
  111. package/dist/es/standards-sdk.es123.js +567 -40
  112. package/dist/es/standards-sdk.es123.js.map +1 -1
  113. package/dist/es/standards-sdk.es124.js +602 -2
  114. package/dist/es/standards-sdk.es124.js.map +1 -1
  115. package/dist/es/standards-sdk.es125.js +12 -234
  116. package/dist/es/standards-sdk.es125.js.map +1 -1
  117. package/dist/es/standards-sdk.es126.js +2 -1140
  118. package/dist/es/standards-sdk.es126.js.map +1 -1
  119. package/dist/es/standards-sdk.es127.js +73 -292
  120. package/dist/es/standards-sdk.es127.js.map +1 -1
  121. package/dist/es/standards-sdk.es128.js +36 -418
  122. package/dist/es/standards-sdk.es128.js.map +1 -1
  123. package/dist/es/standards-sdk.es129.js +2 -355
  124. package/dist/es/standards-sdk.es129.js.map +1 -1
  125. package/dist/es/standards-sdk.es13.js +1 -1
  126. package/dist/es/standards-sdk.es130.js +197 -1090
  127. package/dist/es/standards-sdk.es130.js.map +1 -1
  128. package/dist/es/standards-sdk.es131.js +1107 -175
  129. package/dist/es/standards-sdk.es131.js.map +1 -1
  130. package/dist/es/standards-sdk.es132.js +218 -1479
  131. package/dist/es/standards-sdk.es132.js.map +1 -1
  132. package/dist/es/standards-sdk.es133.js +422 -1236
  133. package/dist/es/standards-sdk.es133.js.map +1 -1
  134. package/dist/es/standards-sdk.es134.js +351 -13
  135. package/dist/es/standards-sdk.es134.js.map +1 -1
  136. package/dist/es/standards-sdk.es135.js +1102 -73
  137. package/dist/es/standards-sdk.es135.js.map +1 -1
  138. package/dist/es/standards-sdk.es136.js +203 -76
  139. package/dist/es/standards-sdk.es136.js.map +1 -1
  140. package/dist/es/standards-sdk.es137.js +1459 -785
  141. package/dist/es/standards-sdk.es137.js.map +1 -1
  142. package/dist/es/standards-sdk.es138.js +1254 -59
  143. package/dist/es/standards-sdk.es138.js.map +1 -1
  144. package/dist/es/standards-sdk.es139.js +14 -156
  145. package/dist/es/standards-sdk.es139.js.map +1 -1
  146. package/dist/es/standards-sdk.es14.js +1 -1
  147. package/dist/es/standards-sdk.es140.js +87 -7
  148. package/dist/es/standards-sdk.es140.js.map +1 -1
  149. package/dist/es/standards-sdk.es141.js +74 -79
  150. package/dist/es/standards-sdk.es141.js.map +1 -1
  151. package/dist/es/standards-sdk.es142.js +889 -61
  152. package/dist/es/standards-sdk.es142.js.map +1 -1
  153. package/dist/es/standards-sdk.es143.js +60 -30
  154. package/dist/es/standards-sdk.es143.js.map +1 -1
  155. package/dist/es/standards-sdk.es144.js +159 -34
  156. package/dist/es/standards-sdk.es144.js.map +1 -1
  157. package/dist/es/standards-sdk.es145.js +7 -28
  158. package/dist/es/standards-sdk.es145.js.map +1 -1
  159. package/dist/es/standards-sdk.es146.js +70 -122
  160. package/dist/es/standards-sdk.es146.js.map +1 -1
  161. package/dist/es/standards-sdk.es147.js +58 -35
  162. package/dist/es/standards-sdk.es147.js.map +1 -1
  163. package/dist/es/standards-sdk.es148.js +30 -12320
  164. package/dist/es/standards-sdk.es148.js.map +1 -1
  165. package/dist/es/standards-sdk.es149.js +34 -56
  166. package/dist/es/standards-sdk.es149.js.map +1 -1
  167. package/dist/es/standards-sdk.es15.js +1 -1
  168. package/dist/es/standards-sdk.es150.js +41 -84
  169. package/dist/es/standards-sdk.es150.js.map +1 -1
  170. package/dist/es/standards-sdk.es151.js +134 -13
  171. package/dist/es/standards-sdk.es151.js.map +1 -1
  172. package/dist/es/standards-sdk.es152.js +36 -236
  173. package/dist/es/standards-sdk.es152.js.map +1 -1
  174. package/dist/es/standards-sdk.es153.js +12444 -134
  175. package/dist/es/standards-sdk.es153.js.map +1 -1
  176. package/dist/es/standards-sdk.es154.js +139 -289
  177. package/dist/es/standards-sdk.es154.js.map +1 -1
  178. package/dist/es/standards-sdk.es155.js +274 -298
  179. package/dist/es/standards-sdk.es155.js.map +1 -1
  180. package/dist/es/standards-sdk.es156.js +262 -369
  181. package/dist/es/standards-sdk.es156.js.map +1 -1
  182. package/dist/es/standards-sdk.es157.js +316 -194
  183. package/dist/es/standards-sdk.es157.js.map +1 -1
  184. package/dist/es/standards-sdk.es158.js +319 -64
  185. package/dist/es/standards-sdk.es158.js.map +1 -1
  186. package/dist/es/standards-sdk.es159.js +61 -157
  187. package/dist/es/standards-sdk.es159.js.map +1 -1
  188. package/dist/es/standards-sdk.es16.js +5 -5
  189. package/dist/es/standards-sdk.es160.js +14 -219
  190. package/dist/es/standards-sdk.es160.js.map +1 -1
  191. package/dist/es/standards-sdk.es161.js +226 -223
  192. package/dist/es/standards-sdk.es161.js.map +1 -1
  193. package/dist/es/standards-sdk.es162.js +49 -112
  194. package/dist/es/standards-sdk.es162.js.map +1 -1
  195. package/dist/es/standards-sdk.es163.js +72 -114
  196. package/dist/es/standards-sdk.es163.js.map +1 -1
  197. package/dist/es/standards-sdk.es164.js +67 -147
  198. package/dist/es/standards-sdk.es164.js.map +1 -1
  199. package/dist/es/standards-sdk.es165.js +61 -173
  200. package/dist/es/standards-sdk.es165.js.map +1 -1
  201. package/dist/es/standards-sdk.es166.js +153 -120
  202. package/dist/es/standards-sdk.es166.js.map +1 -1
  203. package/dist/es/standards-sdk.es167.js +178 -287
  204. package/dist/es/standards-sdk.es167.js.map +1 -1
  205. package/dist/es/standards-sdk.es168.js +218 -238
  206. package/dist/es/standards-sdk.es168.js.map +1 -1
  207. package/dist/es/standards-sdk.es169.js +75 -72
  208. package/dist/es/standards-sdk.es169.js.map +1 -1
  209. package/dist/es/standards-sdk.es170.js +129 -0
  210. package/dist/es/standards-sdk.es170.js.map +1 -0
  211. package/dist/es/standards-sdk.es171.js +164 -0
  212. package/dist/es/standards-sdk.es171.js.map +1 -0
  213. package/dist/es/standards-sdk.es172.js +188 -0
  214. package/dist/es/standards-sdk.es172.js.map +1 -0
  215. package/dist/es/standards-sdk.es173.js +142 -0
  216. package/dist/es/standards-sdk.es173.js.map +1 -0
  217. package/dist/es/standards-sdk.es174.js +334 -0
  218. package/dist/es/standards-sdk.es174.js.map +1 -0
  219. package/dist/es/standards-sdk.es175.js +262 -0
  220. package/dist/es/standards-sdk.es175.js.map +1 -0
  221. package/dist/es/standards-sdk.es176.js +119 -0
  222. package/dist/es/standards-sdk.es176.js.map +1 -0
  223. package/dist/es/standards-sdk.es18.js +12 -12
  224. package/dist/es/standards-sdk.es19.js +9 -9
  225. package/dist/es/standards-sdk.es2.js +2 -2
  226. package/dist/es/standards-sdk.es20.js +1 -1
  227. package/dist/es/standards-sdk.es21.js +1 -1
  228. package/dist/es/standards-sdk.es22.js +1 -1
  229. package/dist/es/standards-sdk.es23.js +1 -1
  230. package/dist/es/standards-sdk.es24.js +1 -1
  231. package/dist/es/standards-sdk.es25.js +1 -1
  232. package/dist/es/standards-sdk.es26.js +1 -1
  233. package/dist/es/standards-sdk.es27.js +12 -12
  234. package/dist/es/standards-sdk.es30.js +2 -2
  235. package/dist/es/standards-sdk.es31.js +4 -4
  236. package/dist/es/standards-sdk.es32.js +1 -1
  237. package/dist/es/standards-sdk.es35.js +6 -6
  238. package/dist/es/standards-sdk.es36.js +4 -4
  239. package/dist/es/standards-sdk.es37.js +2 -2
  240. package/dist/es/standards-sdk.es38.js +2 -2
  241. package/dist/es/standards-sdk.es39.js +1 -1
  242. package/dist/es/standards-sdk.es4.js +2 -2
  243. package/dist/es/standards-sdk.es40.js +1 -1
  244. package/dist/es/standards-sdk.es41.js +2 -2
  245. package/dist/es/standards-sdk.es46.js +1 -1
  246. package/dist/es/standards-sdk.es5.js +2 -2
  247. package/dist/es/standards-sdk.es51.js +1 -1
  248. package/dist/es/standards-sdk.es53.js +1 -1
  249. package/dist/es/standards-sdk.es56.js +2 -2
  250. package/dist/es/standards-sdk.es58.js +194 -13
  251. package/dist/es/standards-sdk.es58.js.map +1 -1
  252. package/dist/es/standards-sdk.es59.js +1 -1
  253. package/dist/es/standards-sdk.es6.js +2 -2
  254. package/dist/es/standards-sdk.es60.js +100 -192
  255. package/dist/es/standards-sdk.es60.js.map +1 -1
  256. package/dist/es/standards-sdk.es61.js +172 -24
  257. package/dist/es/standards-sdk.es61.js.map +1 -1
  258. package/dist/es/standards-sdk.es62.js +204 -77
  259. package/dist/es/standards-sdk.es62.js.map +1 -1
  260. package/dist/es/standards-sdk.es63.js +130 -3
  261. package/dist/es/standards-sdk.es63.js.map +1 -1
  262. package/dist/es/standards-sdk.es64.js +41 -95
  263. package/dist/es/standards-sdk.es64.js.map +1 -1
  264. package/dist/es/standards-sdk.es65.js +245 -88
  265. package/dist/es/standards-sdk.es65.js.map +1 -1
  266. package/dist/es/standards-sdk.es66.js +32 -17
  267. package/dist/es/standards-sdk.es66.js.map +1 -1
  268. package/dist/es/standards-sdk.es67.js +96 -77
  269. package/dist/es/standards-sdk.es67.js.map +1 -1
  270. package/dist/es/standards-sdk.es68.js +4 -458
  271. package/dist/es/standards-sdk.es68.js.map +1 -1
  272. package/dist/es/standards-sdk.es69.js +72 -295
  273. package/dist/es/standards-sdk.es69.js.map +1 -1
  274. package/dist/es/standards-sdk.es7.js +1 -1
  275. package/dist/es/standards-sdk.es70.js +86 -194
  276. package/dist/es/standards-sdk.es70.js.map +1 -1
  277. package/dist/es/standards-sdk.es71.js +16 -69
  278. package/dist/es/standards-sdk.es71.js.map +1 -1
  279. package/dist/es/standards-sdk.es72.js +69 -63
  280. package/dist/es/standards-sdk.es72.js.map +1 -1
  281. package/dist/es/standards-sdk.es73.js +458 -143
  282. package/dist/es/standards-sdk.es73.js.map +1 -1
  283. package/dist/es/standards-sdk.es74.js +298 -43
  284. package/dist/es/standards-sdk.es74.js.map +1 -1
  285. package/dist/es/standards-sdk.es75.js +174 -370
  286. package/dist/es/standards-sdk.es75.js.map +1 -1
  287. package/dist/es/standards-sdk.es76.js +71 -495
  288. package/dist/es/standards-sdk.es76.js.map +1 -1
  289. package/dist/es/standards-sdk.es77.js +71 -365
  290. package/dist/es/standards-sdk.es77.js.map +1 -1
  291. package/dist/es/standards-sdk.es78.js +137 -83
  292. package/dist/es/standards-sdk.es78.js.map +1 -1
  293. package/dist/es/standards-sdk.es79.js +69 -125
  294. package/dist/es/standards-sdk.es79.js.map +1 -1
  295. package/dist/es/standards-sdk.es80.js +402 -6
  296. package/dist/es/standards-sdk.es80.js.map +1 -1
  297. package/dist/es/standards-sdk.es81.js +492 -43
  298. package/dist/es/standards-sdk.es81.js.map +1 -1
  299. package/dist/es/standards-sdk.es82.js +350 -86
  300. package/dist/es/standards-sdk.es82.js.map +1 -1
  301. package/dist/es/standards-sdk.es83.js +88 -347
  302. package/dist/es/standards-sdk.es83.js.map +1 -1
  303. package/dist/es/standards-sdk.es84.js +125 -281
  304. package/dist/es/standards-sdk.es84.js.map +1 -1
  305. package/dist/es/standards-sdk.es85.js +6 -59
  306. package/dist/es/standards-sdk.es85.js.map +1 -1
  307. package/dist/es/standards-sdk.es86.js +43 -45
  308. package/dist/es/standards-sdk.es86.js.map +1 -1
  309. package/dist/es/standards-sdk.es87.js +86 -135
  310. package/dist/es/standards-sdk.es87.js.map +1 -1
  311. package/dist/es/standards-sdk.es88.js +333 -52
  312. package/dist/es/standards-sdk.es88.js.map +1 -1
  313. package/dist/es/standards-sdk.es89.js +277 -26
  314. package/dist/es/standards-sdk.es89.js.map +1 -1
  315. package/dist/es/standards-sdk.es9.js +2 -2
  316. package/dist/es/standards-sdk.es90.js +59 -23
  317. package/dist/es/standards-sdk.es90.js.map +1 -1
  318. package/dist/es/standards-sdk.es91.js +26 -217
  319. package/dist/es/standards-sdk.es91.js.map +1 -1
  320. package/dist/es/standards-sdk.es92.js +104 -236
  321. package/dist/es/standards-sdk.es92.js.map +1 -1
  322. package/dist/es/standards-sdk.es93.js +51 -141
  323. package/dist/es/standards-sdk.es93.js.map +1 -1
  324. package/dist/es/standards-sdk.es94.js +22 -137
  325. package/dist/es/standards-sdk.es94.js.map +1 -1
  326. package/dist/es/standards-sdk.es95.js +20 -44
  327. package/dist/es/standards-sdk.es95.js.map +1 -1
  328. package/dist/es/standards-sdk.es96.js +227 -252
  329. package/dist/es/standards-sdk.es96.js.map +1 -1
  330. package/dist/es/standards-sdk.es97.js +248 -68
  331. package/dist/es/standards-sdk.es97.js.map +1 -1
  332. package/dist/es/standards-sdk.es98.js +108 -52
  333. package/dist/es/standards-sdk.es98.js.map +1 -1
  334. package/dist/es/standards-sdk.es99.js +144 -29
  335. package/dist/es/standards-sdk.es99.js.map +1 -1
  336. package/package.json +14 -4
@@ -0,0 +1,334 @@
1
+ import { createSessionResponseSchema, chatHistoryCompactionResponseSchema, sessionEncryptionStatusResponseSchema, encryptionHandshakeResponseSchema, sendMessageResponseSchema } from "./standards-sdk.es138.js";
2
+ import { serialiseAuthConfig, toJsonObject } from "./standards-sdk.es168.js";
3
+ import { EncryptionUnavailableError } from "./standards-sdk.es175.js";
4
+ function createChatApi(client, encryptedManager) {
5
+ return {
6
+ start: (options) => client.startChat(options),
7
+ createSession: (payload) => client.createSession(payload),
8
+ sendMessage: (payload) => client.sendMessage(payload),
9
+ endSession: (sessionId) => client.endSession(sessionId),
10
+ getHistory: (sessionId, options) => client.fetchHistorySnapshot(sessionId, options),
11
+ compactHistory: (payload) => client.compactHistory(payload),
12
+ getEncryptionStatus: (sessionId) => client.fetchEncryptionStatus(sessionId),
13
+ submitEncryptionHandshake: (sessionId, payload) => client.postEncryptionHandshake(sessionId, payload),
14
+ startConversation: (options) => client.startConversation(options),
15
+ acceptConversation: (options) => client.acceptConversation(options),
16
+ createEncryptedSession: (options) => encryptedManager.startSession(options),
17
+ acceptEncryptedSession: (options) => encryptedManager.acceptSession(options)
18
+ };
19
+ }
20
+ async function createSession(client, payload, allowHistoryAutoTopUp = true) {
21
+ const body = {};
22
+ if ("uaid" in payload && payload.uaid) {
23
+ body.uaid = payload.uaid;
24
+ }
25
+ if ("agentUrl" in payload && payload.agentUrl) {
26
+ body.agentUrl = payload.agentUrl;
27
+ }
28
+ if (payload.auth) {
29
+ body.auth = serialiseAuthConfig(payload.auth);
30
+ }
31
+ if (payload.historyTtlSeconds !== void 0) {
32
+ body.historyTtlSeconds = payload.historyTtlSeconds;
33
+ }
34
+ if (payload.encryptionRequested !== void 0) {
35
+ body.encryptionRequested = payload.encryptionRequested;
36
+ }
37
+ if (payload.senderUaid) {
38
+ body.senderUaid = payload.senderUaid;
39
+ }
40
+ try {
41
+ const raw = await client.requestJson("/chat/session", {
42
+ method: "POST",
43
+ body,
44
+ headers: { "content-type": "application/json" }
45
+ });
46
+ return client.parseWithSchema(
47
+ raw,
48
+ createSessionResponseSchema,
49
+ "chat session response"
50
+ );
51
+ } catch (error) {
52
+ const maybeError = error instanceof Error ? error : null;
53
+ if (allowHistoryAutoTopUp && client.shouldAutoTopUpHistory(payload, maybeError)) {
54
+ await client.executeHistoryAutoTopUp("chat.session");
55
+ return createSession(client, payload, false);
56
+ }
57
+ throw error;
58
+ }
59
+ }
60
+ async function startChat(client, encryptedManager, options) {
61
+ if ("uaid" in options && options.uaid) {
62
+ return startConversation(client, encryptedManager, {
63
+ uaid: options.uaid,
64
+ senderUaid: options.senderUaid,
65
+ historyTtlSeconds: options.historyTtlSeconds,
66
+ auth: options.auth,
67
+ encryption: options.encryption,
68
+ onSessionCreated: options.onSessionCreated
69
+ });
70
+ }
71
+ if ("agentUrl" in options && options.agentUrl) {
72
+ const session = await createSession(client, {
73
+ agentUrl: options.agentUrl,
74
+ auth: options.auth,
75
+ historyTtlSeconds: options.historyTtlSeconds,
76
+ senderUaid: options.senderUaid
77
+ });
78
+ options.onSessionCreated?.(session.sessionId);
79
+ return createPlaintextConversationHandle(
80
+ client,
81
+ session.sessionId,
82
+ session.encryption ?? null,
83
+ options.auth,
84
+ { agentUrl: options.agentUrl, uaid: options.uaid }
85
+ );
86
+ }
87
+ throw new Error("startChat requires either uaid or agentUrl");
88
+ }
89
+ async function startConversation(client, encryptedManager, options) {
90
+ const preference = options.encryption?.preference ?? "preferred";
91
+ const requestEncryption = preference !== "disabled";
92
+ if (!requestEncryption) {
93
+ const session = await createSession(client, {
94
+ uaid: options.uaid,
95
+ auth: options.auth,
96
+ historyTtlSeconds: options.historyTtlSeconds,
97
+ senderUaid: options.senderUaid,
98
+ encryptionRequested: false
99
+ });
100
+ options.onSessionCreated?.(session.sessionId);
101
+ return createPlaintextConversationHandle(
102
+ client,
103
+ session.sessionId,
104
+ session.encryption ?? null,
105
+ options.auth,
106
+ { uaid: options.uaid }
107
+ );
108
+ }
109
+ try {
110
+ const handle = await encryptedManager.startSession({
111
+ uaid: options.uaid,
112
+ senderUaid: options.senderUaid,
113
+ historyTtlSeconds: options.historyTtlSeconds,
114
+ handshakeTimeoutMs: options.encryption?.handshakeTimeoutMs,
115
+ pollIntervalMs: options.encryption?.pollIntervalMs,
116
+ onSessionCreated: (sessionId) => {
117
+ options.onSessionCreated?.(sessionId);
118
+ },
119
+ auth: options.auth
120
+ });
121
+ return handle;
122
+ } catch (error) {
123
+ if (error instanceof EncryptionUnavailableError) {
124
+ if (preference === "required") {
125
+ throw error;
126
+ }
127
+ return createPlaintextConversationHandle(
128
+ client,
129
+ error.sessionId,
130
+ error.summary ?? null,
131
+ options.auth,
132
+ { uaid: options.uaid }
133
+ );
134
+ }
135
+ throw error;
136
+ }
137
+ }
138
+ async function acceptConversation(client, encryptedManager, options) {
139
+ const preference = options.encryption?.preference ?? "preferred";
140
+ if (preference === "disabled") {
141
+ return createPlaintextConversationHandle(client, options.sessionId, null);
142
+ }
143
+ try {
144
+ const handle = await encryptedManager.acceptSession({
145
+ sessionId: options.sessionId,
146
+ responderUaid: options.responderUaid,
147
+ handshakeTimeoutMs: options.encryption?.handshakeTimeoutMs,
148
+ pollIntervalMs: options.encryption?.pollIntervalMs
149
+ });
150
+ return handle;
151
+ } catch (error) {
152
+ if (error instanceof EncryptionUnavailableError && preference !== "required") {
153
+ return createPlaintextConversationHandle(
154
+ client,
155
+ options.sessionId,
156
+ null,
157
+ void 0,
158
+ { uaid: options.responderUaid }
159
+ );
160
+ }
161
+ throw error;
162
+ }
163
+ }
164
+ function createPlaintextConversationHandle(client, sessionId, summary, defaultAuth, context) {
165
+ const uaid = context?.uaid?.trim();
166
+ const agentUrl = context?.agentUrl?.trim();
167
+ const fetchHistory = async (options) => {
168
+ const snapshot = await client.fetchHistorySnapshot(sessionId, options);
169
+ if (snapshot.decryptedHistory) {
170
+ return snapshot.decryptedHistory;
171
+ }
172
+ return snapshot.history.map((entry) => ({
173
+ entry,
174
+ plaintext: entry.content
175
+ }));
176
+ };
177
+ return {
178
+ sessionId,
179
+ mode: "plaintext",
180
+ summary: summary ?? null,
181
+ send: async (options) => {
182
+ const plaintext = options.plaintext;
183
+ if (!plaintext || plaintext.trim().length === 0) {
184
+ throw new Error("plaintext is required for chat messages");
185
+ }
186
+ const message = options.message ?? plaintext;
187
+ return sendMessage(client, {
188
+ sessionId,
189
+ message,
190
+ streaming: options.streaming,
191
+ auth: options.auth ?? defaultAuth,
192
+ uaid,
193
+ agentUrl
194
+ });
195
+ },
196
+ decryptHistoryEntry: (entry) => entry.content,
197
+ fetchHistory
198
+ };
199
+ }
200
+ async function compactHistory(client, payload) {
201
+ if (!payload.sessionId || payload.sessionId.trim().length === 0) {
202
+ throw new Error("sessionId is required to compact chat history");
203
+ }
204
+ const body = {};
205
+ if (typeof payload.preserveEntries === "number" && Number.isFinite(payload.preserveEntries) && payload.preserveEntries >= 0) {
206
+ body.preserveEntries = Math.floor(payload.preserveEntries);
207
+ }
208
+ const raw = await client.requestJson(
209
+ `/chat/session/${encodeURIComponent(payload.sessionId)}/compact`,
210
+ {
211
+ method: "POST",
212
+ headers: { "content-type": "application/json" },
213
+ body
214
+ }
215
+ );
216
+ return client.parseWithSchema(
217
+ raw,
218
+ chatHistoryCompactionResponseSchema,
219
+ "chat history compaction response"
220
+ );
221
+ }
222
+ async function fetchEncryptionStatus(client, sessionId) {
223
+ if (!sessionId || sessionId.trim().length === 0) {
224
+ throw new Error("sessionId is required for encryption status");
225
+ }
226
+ const raw = await client.requestJson(
227
+ `/chat/session/${encodeURIComponent(sessionId)}/encryption`,
228
+ {
229
+ method: "GET"
230
+ }
231
+ );
232
+ return client.parseWithSchema(
233
+ raw,
234
+ sessionEncryptionStatusResponseSchema,
235
+ "session encryption status response"
236
+ );
237
+ }
238
+ async function postEncryptionHandshake(client, sessionId, payload) {
239
+ if (!sessionId || sessionId.trim().length === 0) {
240
+ throw new Error("sessionId is required for encryption handshake");
241
+ }
242
+ const raw = await client.requestJson(
243
+ `/chat/session/${encodeURIComponent(sessionId)}/encryption-handshake`,
244
+ {
245
+ method: "POST",
246
+ headers: { "content-type": "application/json" },
247
+ body: {
248
+ role: payload.role,
249
+ keyType: payload.keyType,
250
+ ephemeralPublicKey: payload.ephemeralPublicKey,
251
+ longTermPublicKey: payload.longTermPublicKey,
252
+ signature: payload.signature,
253
+ uaid: payload.uaid,
254
+ userId: payload.userId,
255
+ ledgerAccountId: payload.ledgerAccountId,
256
+ metadata: payload.metadata
257
+ }
258
+ }
259
+ );
260
+ const response = client.parseWithSchema(
261
+ raw,
262
+ encryptionHandshakeResponseSchema,
263
+ "encryption handshake response"
264
+ );
265
+ return response.handshake;
266
+ }
267
+ async function sendMessage(client, payload) {
268
+ const body = {
269
+ message: payload.message
270
+ };
271
+ if (payload.streaming !== void 0) {
272
+ body.streaming = payload.streaming;
273
+ }
274
+ if (payload.auth) {
275
+ body.auth = serialiseAuthConfig(payload.auth);
276
+ }
277
+ if ("uaid" in payload) {
278
+ body.uaid = payload.uaid;
279
+ }
280
+ if ("sessionId" in payload && payload.sessionId) {
281
+ body.sessionId = payload.sessionId;
282
+ }
283
+ if ("agentUrl" in payload && payload.agentUrl) {
284
+ body.agentUrl = payload.agentUrl;
285
+ }
286
+ let cipherEnvelope = payload.cipherEnvelope ?? null;
287
+ if (payload.encryption) {
288
+ const sessionIdForEncryption = payload.encryption.sessionId ?? (typeof body.sessionId === "string" ? body.sessionId : void 0);
289
+ if (!sessionIdForEncryption) {
290
+ throw new Error(
291
+ "sessionId is required when using encrypted chat payloads"
292
+ );
293
+ }
294
+ if (!payload.encryption.recipients?.length) {
295
+ throw new Error("recipients are required for encrypted chat payloads");
296
+ }
297
+ cipherEnvelope = client.encryption.encryptCipherEnvelope({
298
+ ...payload.encryption,
299
+ sessionId: sessionIdForEncryption
300
+ });
301
+ }
302
+ if (cipherEnvelope) {
303
+ body.cipherEnvelope = toJsonObject(cipherEnvelope);
304
+ }
305
+ const raw = await client.requestJson("/chat/message", {
306
+ method: "POST",
307
+ body,
308
+ headers: { "content-type": "application/json" }
309
+ });
310
+ return client.parseWithSchema(
311
+ raw,
312
+ sendMessageResponseSchema,
313
+ "chat message response"
314
+ );
315
+ }
316
+ async function endSession(client, sessionId) {
317
+ await client.request(`/chat/session/${encodeURIComponent(sessionId)}`, {
318
+ method: "DELETE"
319
+ });
320
+ }
321
+ export {
322
+ acceptConversation,
323
+ compactHistory,
324
+ createChatApi,
325
+ createPlaintextConversationHandle,
326
+ createSession,
327
+ endSession,
328
+ fetchEncryptionStatus,
329
+ postEncryptionHandshake,
330
+ sendMessage,
331
+ startChat,
332
+ startConversation
333
+ };
334
+ //# sourceMappingURL=standards-sdk.es174.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standards-sdk.es174.js","sources":["../../src/services/registry-broker/client/chat.ts"],"sourcesContent":["import type {\n AcceptConversationOptions,\n AcceptEncryptedChatSessionOptions,\n AgentAuthConfig,\n ChatConversationHandle,\n DecryptedHistoryEntry,\n ChatHistoryCompactionResponse,\n ChatHistoryFetchOptions,\n ChatHistorySnapshotWithDecryptedEntries,\n CompactHistoryRequestPayload,\n CreateSessionRequestPayload,\n CreateSessionResponse,\n EncryptionHandshakeRecord,\n EncryptionHandshakeSubmissionPayload,\n EncryptedChatSessionHandle,\n JsonObject,\n JsonValue,\n SendMessageRequestPayload,\n SendMessageResponse,\n SessionEncryptionStatusResponse,\n SessionEncryptionSummary,\n StartChatOptions,\n StartConversationOptions,\n StartEncryptedChatSessionOptions,\n} from '../types';\nimport {\n chatHistoryCompactionResponseSchema,\n createSessionResponseSchema,\n encryptionHandshakeResponseSchema,\n sendMessageResponseSchema,\n sessionEncryptionStatusResponseSchema,\n} from '../schemas';\nimport type { RegistryBrokerClient } from './base-client';\nimport { serialiseAuthConfig, toJsonObject } from './utils';\nimport {\n EncryptedChatManager,\n EncryptionUnavailableError,\n} from './encrypted-chat-manager';\n\nexport interface RegistryBrokerChatApi {\n start: (options: StartChatOptions) => Promise<ChatConversationHandle>;\n createSession: (\n payload: CreateSessionRequestPayload,\n ) => Promise<CreateSessionResponse>;\n sendMessage: (\n payload: SendMessageRequestPayload,\n ) => Promise<SendMessageResponse>;\n endSession: (sessionId: string) => Promise<void>;\n getHistory: (\n sessionId: string,\n options?: ChatHistoryFetchOptions,\n ) => Promise<ChatHistorySnapshotWithDecryptedEntries>;\n compactHistory: (\n payload: CompactHistoryRequestPayload,\n ) => Promise<ChatHistoryCompactionResponse>;\n getEncryptionStatus: (\n sessionId: string,\n ) => Promise<SessionEncryptionStatusResponse>;\n submitEncryptionHandshake: (\n sessionId: string,\n payload: EncryptionHandshakeSubmissionPayload,\n ) => Promise<EncryptionHandshakeRecord>;\n createEncryptedSession: (\n options: StartEncryptedChatSessionOptions,\n ) => Promise<EncryptedChatSessionHandle>;\n acceptEncryptedSession: (\n options: AcceptEncryptedChatSessionOptions,\n ) => Promise<EncryptedChatSessionHandle>;\n startConversation: (\n options: StartConversationOptions,\n ) => Promise<ChatConversationHandle>;\n acceptConversation: (\n options: AcceptConversationOptions,\n ) => Promise<ChatConversationHandle>;\n}\n\nexport function createChatApi(\n client: RegistryBrokerClient,\n encryptedManager: EncryptedChatManager,\n): RegistryBrokerChatApi {\n return {\n start: (options: StartChatOptions) => client.startChat(options),\n createSession: (payload: CreateSessionRequestPayload) =>\n client.createSession(payload),\n sendMessage: (payload: SendMessageRequestPayload) =>\n client.sendMessage(payload),\n endSession: (sessionId: string) => client.endSession(sessionId),\n getHistory: (sessionId: string, options?: ChatHistoryFetchOptions) =>\n client.fetchHistorySnapshot(sessionId, options),\n compactHistory: (payload: CompactHistoryRequestPayload) =>\n client.compactHistory(payload),\n getEncryptionStatus: (sessionId: string) =>\n client.fetchEncryptionStatus(sessionId),\n submitEncryptionHandshake: (\n sessionId: string,\n payload: EncryptionHandshakeSubmissionPayload,\n ) => client.postEncryptionHandshake(sessionId, payload),\n startConversation: (options: StartConversationOptions) =>\n client.startConversation(options),\n acceptConversation: (options: AcceptConversationOptions) =>\n client.acceptConversation(options),\n createEncryptedSession: (options: StartEncryptedChatSessionOptions) =>\n encryptedManager.startSession(options),\n acceptEncryptedSession: (options: AcceptEncryptedChatSessionOptions) =>\n encryptedManager.acceptSession(options),\n };\n}\n\nexport async function createSession(\n client: RegistryBrokerClient,\n payload: CreateSessionRequestPayload,\n allowHistoryAutoTopUp = true,\n): Promise<CreateSessionResponse> {\n const body: JsonObject = {};\n if ('uaid' in payload && payload.uaid) {\n body.uaid = payload.uaid;\n }\n if ('agentUrl' in payload && payload.agentUrl) {\n body.agentUrl = payload.agentUrl;\n }\n if (payload.auth) {\n body.auth = serialiseAuthConfig(payload.auth);\n }\n if (payload.historyTtlSeconds !== undefined) {\n body.historyTtlSeconds = payload.historyTtlSeconds;\n }\n if (payload.encryptionRequested !== undefined) {\n body.encryptionRequested = payload.encryptionRequested;\n }\n if (payload.senderUaid) {\n body.senderUaid = payload.senderUaid;\n }\n try {\n const raw = await client.requestJson<JsonValue>('/chat/session', {\n method: 'POST',\n body,\n headers: { 'content-type': 'application/json' },\n });\n return client.parseWithSchema(\n raw,\n createSessionResponseSchema,\n 'chat session response',\n );\n } catch (error) {\n const maybeError = error instanceof Error ? error : null;\n if (\n allowHistoryAutoTopUp &&\n client.shouldAutoTopUpHistory(payload, maybeError)\n ) {\n await client.executeHistoryAutoTopUp('chat.session');\n return createSession(client, payload, false);\n }\n throw error;\n }\n}\n\nexport async function startChat(\n client: RegistryBrokerClient,\n encryptedManager: EncryptedChatManager,\n options: StartChatOptions,\n): Promise<ChatConversationHandle> {\n if ('uaid' in options && options.uaid) {\n return startConversation(client, encryptedManager, {\n uaid: options.uaid,\n senderUaid: options.senderUaid,\n historyTtlSeconds: options.historyTtlSeconds,\n auth: options.auth,\n encryption: options.encryption,\n onSessionCreated: options.onSessionCreated,\n });\n }\n if ('agentUrl' in options && options.agentUrl) {\n const session = await createSession(client, {\n agentUrl: options.agentUrl,\n auth: options.auth,\n historyTtlSeconds: options.historyTtlSeconds,\n senderUaid: options.senderUaid,\n });\n options.onSessionCreated?.(session.sessionId);\n return createPlaintextConversationHandle(\n client,\n session.sessionId,\n session.encryption ?? null,\n options.auth,\n { agentUrl: options.agentUrl, uaid: options.uaid },\n );\n }\n throw new Error('startChat requires either uaid or agentUrl');\n}\n\nexport async function startConversation(\n client: RegistryBrokerClient,\n encryptedManager: EncryptedChatManager,\n options: StartConversationOptions,\n): Promise<ChatConversationHandle> {\n const preference = options.encryption?.preference ?? 'preferred';\n const requestEncryption = preference !== 'disabled';\n if (!requestEncryption) {\n const session = await createSession(client, {\n uaid: options.uaid,\n auth: options.auth,\n historyTtlSeconds: options.historyTtlSeconds,\n senderUaid: options.senderUaid,\n encryptionRequested: false,\n });\n options.onSessionCreated?.(session.sessionId);\n return createPlaintextConversationHandle(\n client,\n session.sessionId,\n session.encryption ?? null,\n options.auth,\n { uaid: options.uaid },\n );\n }\n try {\n const handle = await encryptedManager.startSession({\n uaid: options.uaid,\n senderUaid: options.senderUaid,\n historyTtlSeconds: options.historyTtlSeconds,\n handshakeTimeoutMs: options.encryption?.handshakeTimeoutMs,\n pollIntervalMs: options.encryption?.pollIntervalMs,\n onSessionCreated: sessionId => {\n options.onSessionCreated?.(sessionId);\n },\n auth: options.auth,\n });\n return handle;\n } catch (error) {\n if (error instanceof EncryptionUnavailableError) {\n if (preference === 'required') {\n throw error;\n }\n return createPlaintextConversationHandle(\n client,\n error.sessionId,\n error.summary ?? null,\n options.auth,\n { uaid: options.uaid },\n );\n }\n throw error;\n }\n}\n\nexport async function acceptConversation(\n client: RegistryBrokerClient,\n encryptedManager: EncryptedChatManager,\n options: AcceptConversationOptions,\n): Promise<ChatConversationHandle> {\n const preference = options.encryption?.preference ?? 'preferred';\n if (preference === 'disabled') {\n return createPlaintextConversationHandle(client, options.sessionId, null);\n }\n try {\n const handle = await encryptedManager.acceptSession({\n sessionId: options.sessionId,\n responderUaid: options.responderUaid,\n handshakeTimeoutMs: options.encryption?.handshakeTimeoutMs,\n pollIntervalMs: options.encryption?.pollIntervalMs,\n });\n return handle;\n } catch (error) {\n if (\n error instanceof EncryptionUnavailableError &&\n preference !== 'required'\n ) {\n return createPlaintextConversationHandle(\n client,\n options.sessionId,\n null,\n undefined,\n { uaid: options.responderUaid },\n );\n }\n throw error;\n }\n}\n\nexport function createPlaintextConversationHandle(\n client: RegistryBrokerClient,\n sessionId: string,\n summary: SessionEncryptionSummary | null,\n defaultAuth?: AgentAuthConfig,\n context?: { uaid?: string; agentUrl?: string },\n): ChatConversationHandle {\n const uaid = context?.uaid?.trim();\n const agentUrl = context?.agentUrl?.trim();\n const fetchHistory = async (\n options?: ChatHistoryFetchOptions,\n ): Promise<DecryptedHistoryEntry[]> => {\n const snapshot = await client.fetchHistorySnapshot(sessionId, options);\n if (snapshot.decryptedHistory) {\n return snapshot.decryptedHistory;\n }\n return snapshot.history.map(entry => ({\n entry,\n plaintext: entry.content,\n }));\n };\n return {\n sessionId,\n mode: 'plaintext',\n summary: summary ?? null,\n send: async options => {\n const plaintext = options.plaintext;\n if (!plaintext || plaintext.trim().length === 0) {\n throw new Error('plaintext is required for chat messages');\n }\n const message = options.message ?? plaintext;\n return sendMessage(client, {\n sessionId,\n message,\n streaming: options.streaming,\n auth: options.auth ?? defaultAuth,\n uaid,\n agentUrl,\n });\n },\n decryptHistoryEntry: entry => entry.content,\n fetchHistory,\n };\n}\n\nexport async function compactHistory(\n client: RegistryBrokerClient,\n payload: CompactHistoryRequestPayload,\n): Promise<ChatHistoryCompactionResponse> {\n if (!payload.sessionId || payload.sessionId.trim().length === 0) {\n throw new Error('sessionId is required to compact chat history');\n }\n const body: JsonObject = {};\n if (\n typeof payload.preserveEntries === 'number' &&\n Number.isFinite(payload.preserveEntries) &&\n payload.preserveEntries >= 0\n ) {\n body.preserveEntries = Math.floor(payload.preserveEntries);\n }\n const raw = await client.requestJson<JsonValue>(\n `/chat/session/${encodeURIComponent(payload.sessionId)}/compact`,\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body,\n },\n );\n return client.parseWithSchema(\n raw,\n chatHistoryCompactionResponseSchema,\n 'chat history compaction response',\n );\n}\n\nexport async function fetchEncryptionStatus(\n client: RegistryBrokerClient,\n sessionId: string,\n): Promise<SessionEncryptionStatusResponse> {\n if (!sessionId || sessionId.trim().length === 0) {\n throw new Error('sessionId is required for encryption status');\n }\n const raw = await client.requestJson<JsonValue>(\n `/chat/session/${encodeURIComponent(sessionId)}/encryption`,\n {\n method: 'GET',\n },\n );\n return client.parseWithSchema(\n raw,\n sessionEncryptionStatusResponseSchema,\n 'session encryption status response',\n );\n}\n\nexport async function postEncryptionHandshake(\n client: RegistryBrokerClient,\n sessionId: string,\n payload: EncryptionHandshakeSubmissionPayload,\n): Promise<EncryptionHandshakeRecord> {\n if (!sessionId || sessionId.trim().length === 0) {\n throw new Error('sessionId is required for encryption handshake');\n }\n const raw = await client.requestJson<JsonValue>(\n `/chat/session/${encodeURIComponent(sessionId)}/encryption-handshake`,\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: {\n role: payload.role,\n keyType: payload.keyType,\n ephemeralPublicKey: payload.ephemeralPublicKey,\n longTermPublicKey: payload.longTermPublicKey,\n signature: payload.signature,\n uaid: payload.uaid,\n userId: payload.userId,\n ledgerAccountId: payload.ledgerAccountId,\n metadata: payload.metadata,\n },\n },\n );\n const response = client.parseWithSchema(\n raw,\n encryptionHandshakeResponseSchema,\n 'encryption handshake response',\n );\n return response.handshake;\n}\n\nexport async function sendMessage(\n client: RegistryBrokerClient,\n payload: SendMessageRequestPayload,\n): Promise<SendMessageResponse> {\n const body: JsonObject = {\n message: payload.message,\n };\n if (payload.streaming !== undefined) {\n body.streaming = payload.streaming;\n }\n if (payload.auth) {\n body.auth = serialiseAuthConfig(payload.auth);\n }\n if ('uaid' in payload) {\n body.uaid = payload.uaid;\n }\n if ('sessionId' in payload && payload.sessionId) {\n body.sessionId = payload.sessionId;\n }\n if ('agentUrl' in payload && payload.agentUrl) {\n body.agentUrl = payload.agentUrl;\n }\n let cipherEnvelope = payload.cipherEnvelope ?? null;\n if (payload.encryption) {\n const sessionIdForEncryption =\n payload.encryption.sessionId ??\n (typeof body.sessionId === 'string' ? body.sessionId : undefined);\n if (!sessionIdForEncryption) {\n throw new Error(\n 'sessionId is required when using encrypted chat payloads',\n );\n }\n if (!payload.encryption.recipients?.length) {\n throw new Error('recipients are required for encrypted chat payloads');\n }\n cipherEnvelope = client.encryption.encryptCipherEnvelope({\n ...payload.encryption,\n sessionId: sessionIdForEncryption,\n });\n }\n if (cipherEnvelope) {\n body.cipherEnvelope = toJsonObject(cipherEnvelope);\n }\n const raw = await client.requestJson<JsonValue>('/chat/message', {\n method: 'POST',\n body,\n headers: { 'content-type': 'application/json' },\n });\n return client.parseWithSchema(\n raw,\n sendMessageResponseSchema,\n 'chat message response',\n );\n}\n\nexport async function endSession(\n client: RegistryBrokerClient,\n sessionId: string,\n): Promise<void> {\n await client.request(`/chat/session/${encodeURIComponent(sessionId)}`, {\n method: 'DELETE',\n });\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,262 @@
1
+ class EncryptionUnavailableError extends Error {
2
+ constructor(sessionId, summary) {
3
+ super("Encryption is not enabled for this session");
4
+ this.sessionId = sessionId;
5
+ this.summary = summary;
6
+ }
7
+ }
8
+ class EncryptedChatManager {
9
+ constructor(client) {
10
+ this.client = client;
11
+ }
12
+ registerConversationContext(context) {
13
+ this.client.registerConversationContextForEncryption(context);
14
+ }
15
+ async startSession(options) {
16
+ await this.client.encryptionReady();
17
+ const session = await this.client.chat.createSession({
18
+ uaid: options.uaid,
19
+ senderUaid: options.senderUaid,
20
+ encryptionRequested: true,
21
+ historyTtlSeconds: options.historyTtlSeconds,
22
+ auth: options.auth
23
+ });
24
+ options.onSessionCreated?.(session.sessionId);
25
+ const summary = session.encryption;
26
+ if (!summary?.enabled) {
27
+ throw new EncryptionUnavailableError(
28
+ session.sessionId,
29
+ session.encryption ?? null
30
+ );
31
+ }
32
+ const handle = await this.establishRequesterContext({
33
+ sessionId: session.sessionId,
34
+ summary,
35
+ senderUaid: options.senderUaid,
36
+ handshakeTimeoutMs: options.handshakeTimeoutMs,
37
+ pollIntervalMs: options.pollIntervalMs
38
+ });
39
+ return handle;
40
+ }
41
+ async acceptSession(options) {
42
+ await this.client.encryptionReady();
43
+ const summary = await this.waitForEncryptionSummary(
44
+ options.sessionId,
45
+ options.handshakeTimeoutMs,
46
+ options.pollIntervalMs
47
+ );
48
+ const handle = await this.establishResponderContext({
49
+ sessionId: options.sessionId,
50
+ summary,
51
+ responderUaid: options.responderUaid,
52
+ handshakeTimeoutMs: options.handshakeTimeoutMs,
53
+ pollIntervalMs: options.pollIntervalMs
54
+ });
55
+ return handle;
56
+ }
57
+ async establishRequesterContext(params) {
58
+ const keyPair = this.client.encryption.generateEphemeralKeyPair();
59
+ await this.client.chat.submitEncryptionHandshake(params.sessionId, {
60
+ role: "requester",
61
+ keyType: "secp256k1",
62
+ ephemeralPublicKey: keyPair.publicKey,
63
+ uaid: params.senderUaid ?? params.summary.requester?.uaid ?? void 0
64
+ });
65
+ const { summary, record } = await this.waitForHandshakeCompletion(
66
+ params.sessionId,
67
+ params.handshakeTimeoutMs,
68
+ params.pollIntervalMs
69
+ );
70
+ const responderKey = record.responder?.ephemeralPublicKey;
71
+ if (!responderKey) {
72
+ throw new Error("Responder handshake was not completed in time");
73
+ }
74
+ const sharedSecret = this.client.encryption.deriveSharedSecret({
75
+ privateKey: keyPair.privateKey,
76
+ peerPublicKey: responderKey
77
+ }).subarray();
78
+ const recipients = this.buildRecipients(summary);
79
+ return this.createHandle({
80
+ sessionId: params.sessionId,
81
+ sharedSecret,
82
+ summary,
83
+ recipients,
84
+ identity: summary.requester ?? void 0
85
+ });
86
+ }
87
+ async establishResponderContext(params) {
88
+ const keyPair = this.client.encryption.generateEphemeralKeyPair();
89
+ await this.client.chat.submitEncryptionHandshake(params.sessionId, {
90
+ role: "responder",
91
+ keyType: "secp256k1",
92
+ ephemeralPublicKey: keyPair.publicKey,
93
+ uaid: params.responderUaid ?? params.summary.responder?.uaid ?? void 0
94
+ });
95
+ const { summary, record } = await this.waitForHandshakeCompletion(
96
+ params.sessionId,
97
+ params.handshakeTimeoutMs,
98
+ params.pollIntervalMs
99
+ );
100
+ const requesterKey = record.requester?.ephemeralPublicKey;
101
+ if (!requesterKey) {
102
+ throw new Error("Requester handshake was not detected in time");
103
+ }
104
+ const sharedSecret = this.client.encryption.deriveSharedSecret({
105
+ privateKey: keyPair.privateKey,
106
+ peerPublicKey: requesterKey
107
+ }).subarray();
108
+ const recipients = this.buildRecipients(summary);
109
+ return this.createHandle({
110
+ sessionId: params.sessionId,
111
+ sharedSecret,
112
+ summary,
113
+ recipients,
114
+ identity: summary.responder ?? void 0
115
+ });
116
+ }
117
+ async waitForHandshakeCompletion(sessionId, timeoutMs = 3e4, pollIntervalMs = 1e3) {
118
+ const deadline = Date.now() + timeoutMs;
119
+ while (true) {
120
+ const status = await this.client.chat.getEncryptionStatus(sessionId);
121
+ const summary = status.encryption;
122
+ const record = summary?.handshake;
123
+ if (summary && record && record.status === "complete") {
124
+ return { summary, record };
125
+ }
126
+ if (Date.now() >= deadline) {
127
+ throw new Error("Timed out waiting for encrypted handshake completion");
128
+ }
129
+ await this.delay(pollIntervalMs);
130
+ }
131
+ }
132
+ async waitForEncryptionSummary(sessionId, _timeoutMs = 3e4, _pollIntervalMs = 1e3) {
133
+ const status = await this.client.chat.getEncryptionStatus(sessionId);
134
+ if (!status.encryption?.enabled) {
135
+ throw new EncryptionUnavailableError(
136
+ sessionId,
137
+ status.encryption ?? null
138
+ );
139
+ }
140
+ return status.encryption;
141
+ }
142
+ buildRecipients(summary) {
143
+ const candidates = [summary.requester, summary.responder].filter(Boolean);
144
+ const normalized = candidates.map((candidate) => {
145
+ if (!candidate) {
146
+ return null;
147
+ }
148
+ const recipient = {};
149
+ if (candidate.uaid) {
150
+ recipient.uaid = candidate.uaid;
151
+ }
152
+ if (candidate.ledgerAccountId) {
153
+ recipient.ledgerAccountId = candidate.ledgerAccountId;
154
+ }
155
+ if (candidate.userId) {
156
+ recipient.userId = candidate.userId;
157
+ }
158
+ if (candidate.email) {
159
+ recipient.email = candidate.email;
160
+ }
161
+ return recipient;
162
+ }).filter(
163
+ (entry) => Boolean(
164
+ entry?.uaid || entry?.ledgerAccountId || entry?.userId || entry?.email
165
+ )
166
+ );
167
+ if (normalized.length > 0) {
168
+ return normalized;
169
+ }
170
+ if (summary.responder?.uaid) {
171
+ return [{ uaid: summary.responder.uaid }];
172
+ }
173
+ return [];
174
+ }
175
+ createHandle(context) {
176
+ const sharedSecret = context.sharedSecret;
177
+ const uaid = context.summary.requester?.uaid ?? context.summary.responder?.uaid ?? context.identity?.uaid;
178
+ const decryptHistoryEntry = (entry) => this.decryptEntry(entry, context.identity, sharedSecret);
179
+ const fetchHistory = async (options) => {
180
+ const snapshot = await this.client.fetchHistorySnapshot(
181
+ context.sessionId,
182
+ options
183
+ );
184
+ if (snapshot.decryptedHistory) {
185
+ return snapshot.decryptedHistory;
186
+ }
187
+ return snapshot.history.map((entry) => ({
188
+ entry,
189
+ plaintext: decryptHistoryEntry(entry)
190
+ }));
191
+ };
192
+ const handle = {
193
+ sessionId: context.sessionId,
194
+ mode: "encrypted",
195
+ summary: context.summary,
196
+ send: async (options) => {
197
+ const recipients = options.recipients ?? context.recipients;
198
+ return this.client.chat.sendMessage({
199
+ sessionId: context.sessionId,
200
+ message: options.message ?? "[ciphertext omitted]",
201
+ streaming: options.streaming,
202
+ auth: options.auth,
203
+ uaid,
204
+ encryption: {
205
+ plaintext: options.plaintext,
206
+ sharedSecret: Buffer.from(sharedSecret),
207
+ recipients
208
+ }
209
+ });
210
+ },
211
+ decryptHistoryEntry,
212
+ fetchHistory
213
+ };
214
+ this.registerConversationContext({
215
+ sessionId: context.sessionId,
216
+ sharedSecret,
217
+ identity: context.identity
218
+ });
219
+ return handle;
220
+ }
221
+ decryptEntry(entry, identity, fallbackSecret) {
222
+ const envelope = entry.cipherEnvelope;
223
+ if (!envelope) {
224
+ return null;
225
+ }
226
+ const secret = Buffer.from(fallbackSecret);
227
+ try {
228
+ return this.client.encryption.decryptCipherEnvelope({
229
+ envelope,
230
+ sharedSecret: secret
231
+ });
232
+ } catch (_error) {
233
+ return null;
234
+ }
235
+ }
236
+ recipientMatches(candidate, target) {
237
+ if (target.uaid && candidate.uaid?.toLowerCase() === target.uaid.toLowerCase()) {
238
+ return true;
239
+ }
240
+ if (target.ledgerAccountId && candidate.ledgerAccountId?.toLowerCase() === target.ledgerAccountId.toLowerCase()) {
241
+ return true;
242
+ }
243
+ if (target.userId && candidate.userId === target.userId) {
244
+ return true;
245
+ }
246
+ if (target.email && candidate.email?.toLowerCase() === target.email.toLowerCase()) {
247
+ return true;
248
+ }
249
+ return false;
250
+ }
251
+ async delay(ms) {
252
+ if (ms <= 0) {
253
+ return;
254
+ }
255
+ await new Promise((resolve) => setTimeout(resolve, ms));
256
+ }
257
+ }
258
+ export {
259
+ EncryptedChatManager,
260
+ EncryptionUnavailableError
261
+ };
262
+ //# sourceMappingURL=standards-sdk.es175.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standards-sdk.es175.js","sources":["../../src/services/registry-broker/client/encrypted-chat-manager.ts"],"sourcesContent":["import type {\n AcceptEncryptedChatSessionOptions,\n ChatHistoryEntry,\n ChatHistoryFetchOptions,\n CipherEnvelopeRecipient,\n DecryptedHistoryEntry,\n EncryptedChatSessionHandle,\n EncryptionHandshakeRecord,\n RecipientIdentity,\n SessionEncryptionSummary,\n SharedSecretInput,\n StartEncryptedChatSessionOptions,\n} from '../types';\nimport type { RegistryBrokerClient } from './base-client';\n\ninterface EncryptedSessionContext {\n sessionId: string;\n sharedSecret: Uint8Array;\n summary: SessionEncryptionSummary;\n recipients: RecipientIdentity[];\n identity?: RecipientIdentity;\n}\n\ninterface ConversationContextInput {\n sessionId: string;\n sharedSecret: Uint8Array | Buffer;\n identity?: RecipientIdentity;\n}\n\nexport class EncryptionUnavailableError extends Error {\n constructor(\n readonly sessionId: string,\n readonly summary?: SessionEncryptionSummary | null,\n ) {\n super('Encryption is not enabled for this session');\n }\n}\n\nexport class EncryptedChatManager {\n constructor(private readonly client: RegistryBrokerClient) {}\n\n registerConversationContext(context: ConversationContextInput): void {\n this.client.registerConversationContextForEncryption(context);\n }\n\n async startSession(\n options: StartEncryptedChatSessionOptions,\n ): Promise<EncryptedChatSessionHandle> {\n await this.client.encryptionReady();\n const session = await this.client.chat.createSession({\n uaid: options.uaid,\n senderUaid: options.senderUaid,\n encryptionRequested: true,\n historyTtlSeconds: options.historyTtlSeconds,\n auth: options.auth,\n });\n options.onSessionCreated?.(session.sessionId);\n const summary = session.encryption;\n if (!summary?.enabled) {\n throw new EncryptionUnavailableError(\n session.sessionId,\n session.encryption ?? null,\n );\n }\n const handle = await this.establishRequesterContext({\n sessionId: session.sessionId,\n summary,\n senderUaid: options.senderUaid,\n handshakeTimeoutMs: options.handshakeTimeoutMs,\n pollIntervalMs: options.pollIntervalMs,\n });\n return handle;\n }\n\n async acceptSession(\n options: AcceptEncryptedChatSessionOptions,\n ): Promise<EncryptedChatSessionHandle> {\n await this.client.encryptionReady();\n const summary = await this.waitForEncryptionSummary(\n options.sessionId,\n options.handshakeTimeoutMs,\n options.pollIntervalMs,\n );\n const handle = await this.establishResponderContext({\n sessionId: options.sessionId,\n summary,\n responderUaid: options.responderUaid,\n handshakeTimeoutMs: options.handshakeTimeoutMs,\n pollIntervalMs: options.pollIntervalMs,\n });\n return handle;\n }\n\n private async establishRequesterContext(params: {\n sessionId: string;\n summary: SessionEncryptionSummary;\n senderUaid?: string;\n handshakeTimeoutMs?: number;\n pollIntervalMs?: number;\n }): Promise<EncryptedChatSessionHandle> {\n const keyPair = this.client.encryption.generateEphemeralKeyPair();\n await this.client.chat.submitEncryptionHandshake(params.sessionId, {\n role: 'requester',\n keyType: 'secp256k1',\n ephemeralPublicKey: keyPair.publicKey,\n uaid: params.senderUaid ?? params.summary.requester?.uaid ?? undefined,\n });\n const { summary, record } = await this.waitForHandshakeCompletion(\n params.sessionId,\n params.handshakeTimeoutMs,\n params.pollIntervalMs,\n );\n const responderKey = record.responder?.ephemeralPublicKey;\n if (!responderKey) {\n throw new Error('Responder handshake was not completed in time');\n }\n const sharedSecret = this.client.encryption\n .deriveSharedSecret({\n privateKey: keyPair.privateKey,\n peerPublicKey: responderKey,\n })\n .subarray();\n const recipients = this.buildRecipients(summary);\n return this.createHandle({\n sessionId: params.sessionId,\n sharedSecret,\n summary,\n recipients,\n identity: summary.requester ?? undefined,\n });\n }\n\n private async establishResponderContext(params: {\n sessionId: string;\n summary: SessionEncryptionSummary;\n responderUaid?: string;\n handshakeTimeoutMs?: number;\n pollIntervalMs?: number;\n }): Promise<EncryptedChatSessionHandle> {\n const keyPair = this.client.encryption.generateEphemeralKeyPair();\n await this.client.chat.submitEncryptionHandshake(params.sessionId, {\n role: 'responder',\n keyType: 'secp256k1',\n ephemeralPublicKey: keyPair.publicKey,\n uaid: params.responderUaid ?? params.summary.responder?.uaid ?? undefined,\n });\n const { summary, record } = await this.waitForHandshakeCompletion(\n params.sessionId,\n params.handshakeTimeoutMs,\n params.pollIntervalMs,\n );\n const requesterKey = record.requester?.ephemeralPublicKey;\n if (!requesterKey) {\n throw new Error('Requester handshake was not detected in time');\n }\n const sharedSecret = this.client.encryption\n .deriveSharedSecret({\n privateKey: keyPair.privateKey,\n peerPublicKey: requesterKey,\n })\n .subarray();\n const recipients = this.buildRecipients(summary);\n return this.createHandle({\n sessionId: params.sessionId,\n sharedSecret,\n summary,\n recipients,\n identity: summary.responder ?? undefined,\n });\n }\n\n private async waitForHandshakeCompletion(\n sessionId: string,\n timeoutMs = 30_000,\n pollIntervalMs = 1_000,\n ): Promise<{\n summary: SessionEncryptionSummary;\n record: EncryptionHandshakeRecord;\n }> {\n const deadline = Date.now() + timeoutMs;\n while (true) {\n const status = await this.client.chat.getEncryptionStatus(sessionId);\n const summary = status.encryption;\n const record = summary?.handshake;\n if (summary && record && record.status === 'complete') {\n return { summary, record };\n }\n if (Date.now() >= deadline) {\n throw new Error('Timed out waiting for encrypted handshake completion');\n }\n await this.delay(pollIntervalMs);\n }\n }\n\n private async waitForEncryptionSummary(\n sessionId: string,\n _timeoutMs = 30_000,\n _pollIntervalMs = 1_000,\n ): Promise<SessionEncryptionSummary> {\n const status = await this.client.chat.getEncryptionStatus(sessionId);\n if (!status.encryption?.enabled) {\n throw new EncryptionUnavailableError(\n sessionId,\n status.encryption ?? null,\n );\n }\n return status.encryption;\n }\n\n private buildRecipients(\n summary: SessionEncryptionSummary,\n ): RecipientIdentity[] {\n const candidates = [summary.requester, summary.responder].filter(Boolean);\n const normalized = candidates\n .map(candidate => {\n if (!candidate) {\n return null;\n }\n const recipient: RecipientIdentity = {};\n if (candidate.uaid) {\n recipient.uaid = candidate.uaid;\n }\n if (candidate.ledgerAccountId) {\n recipient.ledgerAccountId = candidate.ledgerAccountId;\n }\n if (candidate.userId) {\n recipient.userId = candidate.userId;\n }\n if (candidate.email) {\n recipient.email = candidate.email;\n }\n return recipient;\n })\n .filter((entry): entry is RecipientIdentity =>\n Boolean(\n entry?.uaid ||\n entry?.ledgerAccountId ||\n entry?.userId ||\n entry?.email,\n ),\n );\n if (normalized.length > 0) {\n return normalized;\n }\n if (summary.responder?.uaid) {\n return [{ uaid: summary.responder.uaid }];\n }\n return [];\n }\n\n private createHandle(\n context: EncryptedSessionContext,\n ): EncryptedChatSessionHandle {\n const sharedSecret = context.sharedSecret;\n const uaid =\n context.summary.requester?.uaid ??\n context.summary.responder?.uaid ??\n context.identity?.uaid;\n const decryptHistoryEntry = (entry: ChatHistoryEntry): string | null =>\n this.decryptEntry(entry, context.identity, sharedSecret);\n const fetchHistory = async (\n options?: ChatHistoryFetchOptions,\n ): Promise<DecryptedHistoryEntry[]> => {\n const snapshot = await this.client.fetchHistorySnapshot(\n context.sessionId,\n options,\n );\n if (snapshot.decryptedHistory) {\n return snapshot.decryptedHistory;\n }\n return snapshot.history.map(entry => ({\n entry,\n plaintext: decryptHistoryEntry(entry),\n }));\n };\n const handle: EncryptedChatSessionHandle = {\n sessionId: context.sessionId,\n mode: 'encrypted',\n summary: context.summary,\n send: async options => {\n const recipients = options.recipients ?? context.recipients;\n return this.client.chat.sendMessage({\n sessionId: context.sessionId,\n message: options.message ?? '[ciphertext omitted]',\n streaming: options.streaming,\n auth: options.auth,\n uaid,\n encryption: {\n plaintext: options.plaintext,\n sharedSecret: Buffer.from(sharedSecret),\n recipients,\n },\n });\n },\n decryptHistoryEntry,\n fetchHistory,\n };\n this.registerConversationContext({\n sessionId: context.sessionId,\n sharedSecret,\n identity: context.identity,\n });\n return handle;\n }\n\n private decryptEntry(\n entry: ChatHistoryEntry,\n identity: RecipientIdentity | undefined,\n fallbackSecret: Uint8Array,\n ): string | null {\n const envelope = entry.cipherEnvelope;\n if (!envelope) {\n return null;\n }\n const secret: SharedSecretInput = Buffer.from(fallbackSecret);\n try {\n return this.client.encryption.decryptCipherEnvelope({\n envelope,\n sharedSecret: secret,\n });\n } catch (_error) {\n return null;\n }\n }\n\n private recipientMatches(\n candidate: CipherEnvelopeRecipient,\n target: RecipientIdentity,\n ): boolean {\n if (\n target.uaid &&\n candidate.uaid?.toLowerCase() === target.uaid.toLowerCase()\n ) {\n return true;\n }\n if (\n target.ledgerAccountId &&\n candidate.ledgerAccountId?.toLowerCase() ===\n target.ledgerAccountId.toLowerCase()\n ) {\n return true;\n }\n if (target.userId && candidate.userId === target.userId) {\n return true;\n }\n if (\n target.email &&\n candidate.email?.toLowerCase() === target.email.toLowerCase()\n ) {\n return true;\n }\n return false;\n }\n\n private async delay(ms: number): Promise<void> {\n if (ms <= 0) {\n return;\n }\n await new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n"],"names":[],"mappings":"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"}