@hashgraphonline/standards-sdk 0.1.141-canary.9 → 0.1.141-feat-hcs-21-flora-adapter.canary.cff94ea.45

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 (249) hide show
  1. package/README.md +13 -1
  2. package/dist/cjs/hcs-16/base-client.d.ts.map +1 -1
  3. package/dist/cjs/hcs-17/types.d.ts.map +1 -1
  4. package/dist/cjs/hcs-20/sdk.d.ts.map +1 -1
  5. package/dist/cjs/hcs-20/types.d.ts +9 -8
  6. package/dist/cjs/hcs-20/types.d.ts.map +1 -1
  7. package/dist/cjs/hcs-21/base-client.d.ts +4 -3
  8. package/dist/cjs/hcs-21/base-client.d.ts.map +1 -1
  9. package/dist/cjs/hcs-21/index.d.ts +1 -0
  10. package/dist/cjs/hcs-21/index.d.ts.map +1 -1
  11. package/dist/cjs/hcs-21/sdk.d.ts.map +1 -1
  12. package/dist/cjs/hcs-21/tx.d.ts.map +1 -1
  13. package/dist/cjs/hcs-21/types.d.ts +135 -64
  14. package/dist/cjs/hcs-21/types.d.ts.map +1 -1
  15. package/dist/cjs/hcs-21/verify.d.ts +6 -0
  16. package/dist/cjs/hcs-21/verify.d.ts.map +1 -0
  17. package/dist/cjs/inscribe/inscriber.d.ts +1 -0
  18. package/dist/cjs/inscribe/inscriber.d.ts.map +1 -1
  19. package/dist/cjs/inscribe/quote-cache.d.ts.map +1 -1
  20. package/dist/cjs/services/registry-broker/client.d.ts +4 -3
  21. package/dist/cjs/services/registry-broker/client.d.ts.map +1 -1
  22. package/dist/cjs/services/registry-broker/private-key-signer.d.ts.map +1 -1
  23. package/dist/cjs/services/registry-broker/schemas.d.ts +16 -16
  24. package/dist/cjs/standards-sdk.cjs +2 -2
  25. package/dist/cjs/standards-sdk.cjs.map +1 -1
  26. package/dist/cjs/utils/dynamic-import.d.ts +1 -0
  27. package/dist/cjs/utils/dynamic-import.d.ts.map +1 -1
  28. package/dist/es/hcs-16/base-client.d.ts.map +1 -1
  29. package/dist/es/hcs-17/types.d.ts.map +1 -1
  30. package/dist/es/hcs-20/sdk.d.ts.map +1 -1
  31. package/dist/es/hcs-20/types.d.ts +9 -8
  32. package/dist/es/hcs-20/types.d.ts.map +1 -1
  33. package/dist/es/hcs-21/base-client.d.ts +4 -3
  34. package/dist/es/hcs-21/base-client.d.ts.map +1 -1
  35. package/dist/es/hcs-21/index.d.ts +1 -0
  36. package/dist/es/hcs-21/index.d.ts.map +1 -1
  37. package/dist/es/hcs-21/sdk.d.ts.map +1 -1
  38. package/dist/es/hcs-21/tx.d.ts.map +1 -1
  39. package/dist/es/hcs-21/types.d.ts +135 -64
  40. package/dist/es/hcs-21/types.d.ts.map +1 -1
  41. package/dist/es/hcs-21/verify.d.ts +6 -0
  42. package/dist/es/hcs-21/verify.d.ts.map +1 -0
  43. package/dist/es/inscribe/inscriber.d.ts +1 -0
  44. package/dist/es/inscribe/inscriber.d.ts.map +1 -1
  45. package/dist/es/inscribe/quote-cache.d.ts.map +1 -1
  46. package/dist/es/services/registry-broker/client.d.ts +4 -3
  47. package/dist/es/services/registry-broker/client.d.ts.map +1 -1
  48. package/dist/es/services/registry-broker/private-key-signer.d.ts.map +1 -1
  49. package/dist/es/services/registry-broker/schemas.d.ts +16 -16
  50. package/dist/es/standards-sdk.es.js +58 -50
  51. package/dist/es/standards-sdk.es.js.map +1 -1
  52. package/dist/es/standards-sdk.es10.js +2 -2
  53. package/dist/es/standards-sdk.es100.js +26 -229
  54. package/dist/es/standards-sdk.es100.js.map +1 -1
  55. package/dist/es/standards-sdk.es101.js +228 -109
  56. package/dist/es/standards-sdk.es101.js.map +1 -1
  57. package/dist/es/standards-sdk.es102.js +94 -15
  58. package/dist/es/standards-sdk.es102.js.map +1 -1
  59. package/dist/es/standards-sdk.es103.js +30 -80
  60. package/dist/es/standards-sdk.es103.js.map +1 -1
  61. package/dist/es/standards-sdk.es104.js +80 -27
  62. package/dist/es/standards-sdk.es104.js.map +1 -1
  63. package/dist/es/standards-sdk.es105.js +25 -136
  64. package/dist/es/standards-sdk.es105.js.map +1 -1
  65. package/dist/es/standards-sdk.es106.js +140 -27
  66. package/dist/es/standards-sdk.es106.js.map +1 -1
  67. package/dist/es/standards-sdk.es107.js +27 -20
  68. package/dist/es/standards-sdk.es107.js.map +1 -1
  69. package/dist/es/standards-sdk.es108.js +18 -156
  70. package/dist/es/standards-sdk.es108.js.map +1 -1
  71. package/dist/es/standards-sdk.es109.js +148 -196
  72. package/dist/es/standards-sdk.es109.js.map +1 -1
  73. package/dist/es/standards-sdk.es110.js +160 -747
  74. package/dist/es/standards-sdk.es110.js.map +1 -1
  75. package/dist/es/standards-sdk.es111.js +786 -9
  76. package/dist/es/standards-sdk.es111.js.map +1 -1
  77. package/dist/es/standards-sdk.es112.js +13 -567
  78. package/dist/es/standards-sdk.es112.js.map +1 -1
  79. package/dist/es/standards-sdk.es113.js +541 -576
  80. package/dist/es/standards-sdk.es113.js.map +1 -1
  81. package/dist/es/standards-sdk.es114.js +601 -12
  82. package/dist/es/standards-sdk.es114.js.map +1 -1
  83. package/dist/es/standards-sdk.es115.js +13 -2
  84. package/dist/es/standards-sdk.es115.js.map +1 -1
  85. package/dist/es/standards-sdk.es116.js +2 -83
  86. package/dist/es/standards-sdk.es116.js.map +1 -1
  87. package/dist/es/standards-sdk.es117.js +80 -36
  88. package/dist/es/standards-sdk.es117.js.map +1 -1
  89. package/dist/es/standards-sdk.es118.js +39 -2
  90. package/dist/es/standards-sdk.es118.js.map +1 -1
  91. package/dist/es/standards-sdk.es119.js +2 -223
  92. package/dist/es/standards-sdk.es119.js.map +1 -1
  93. package/dist/es/standards-sdk.es12.js +1 -1
  94. package/dist/es/standards-sdk.es120.js +193 -1110
  95. package/dist/es/standards-sdk.es120.js.map +1 -1
  96. package/dist/es/standards-sdk.es121.js +1059 -225
  97. package/dist/es/standards-sdk.es121.js.map +1 -1
  98. package/dist/es/standards-sdk.es122.js +303 -419
  99. package/dist/es/standards-sdk.es122.js.map +1 -1
  100. package/dist/es/standards-sdk.es123.js +418 -351
  101. package/dist/es/standards-sdk.es123.js.map +1 -1
  102. package/dist/es/standards-sdk.es124.js +348 -785
  103. package/dist/es/standards-sdk.es124.js.map +1 -1
  104. package/dist/es/standards-sdk.es125.js +767 -183
  105. package/dist/es/standards-sdk.es125.js.map +1 -1
  106. package/dist/es/standards-sdk.es126.js +153 -1512
  107. package/dist/es/standards-sdk.es126.js.map +1 -1
  108. package/dist/es/standards-sdk.es127.js +1373 -1987
  109. package/dist/es/standards-sdk.es127.js.map +1 -1
  110. package/dist/es/standards-sdk.es128.js +2208 -67
  111. package/dist/es/standards-sdk.es128.js.map +1 -1
  112. package/dist/es/standards-sdk.es129.js +59 -79
  113. package/dist/es/standards-sdk.es129.js.map +1 -1
  114. package/dist/es/standards-sdk.es13.js +1 -1
  115. package/dist/es/standards-sdk.es130.js +80 -152
  116. package/dist/es/standards-sdk.es130.js.map +1 -1
  117. package/dist/es/standards-sdk.es131.js +159 -7
  118. package/dist/es/standards-sdk.es131.js.map +1 -1
  119. package/dist/es/standards-sdk.es132.js +7 -86
  120. package/dist/es/standards-sdk.es132.js.map +1 -1
  121. package/dist/es/standards-sdk.es133.js +65 -44
  122. package/dist/es/standards-sdk.es133.js.map +1 -1
  123. package/dist/es/standards-sdk.es134.js +65 -28
  124. package/dist/es/standards-sdk.es134.js.map +1 -1
  125. package/dist/es/standards-sdk.es135.js +69 -125
  126. package/dist/es/standards-sdk.es135.js.map +1 -1
  127. package/dist/es/standards-sdk.es136.js +28 -42
  128. package/dist/es/standards-sdk.es136.js.map +1 -1
  129. package/dist/es/standards-sdk.es137.js +132 -50
  130. package/dist/es/standards-sdk.es137.js.map +1 -1
  131. package/dist/es/standards-sdk.es138.js +36 -58
  132. package/dist/es/standards-sdk.es138.js.map +1 -1
  133. package/dist/es/standards-sdk.es139.js +56 -766
  134. package/dist/es/standards-sdk.es139.js.map +1 -1
  135. package/dist/es/standards-sdk.es14.js +1 -1
  136. package/dist/es/standards-sdk.es140.js +746 -12254
  137. package/dist/es/standards-sdk.es140.js.map +1 -1
  138. package/dist/es/standards-sdk.es141.js +12235 -133
  139. package/dist/es/standards-sdk.es141.js.map +1 -1
  140. package/dist/es/standards-sdk.es142.js +13 -318
  141. package/dist/es/standards-sdk.es142.js.map +1 -1
  142. package/dist/es/standards-sdk.es143.js +120 -294
  143. package/dist/es/standards-sdk.es143.js.map +1 -1
  144. package/dist/es/standards-sdk.es144.js +191 -322
  145. package/dist/es/standards-sdk.es144.js.map +1 -1
  146. package/dist/es/standards-sdk.es145.js +294 -279
  147. package/dist/es/standards-sdk.es145.js.map +1 -1
  148. package/dist/es/standards-sdk.es146.js +440 -63
  149. package/dist/es/standards-sdk.es146.js.map +1 -1
  150. package/dist/es/standards-sdk.es147.js +327 -13
  151. package/dist/es/standards-sdk.es147.js.map +1 -1
  152. package/dist/es/standards-sdk.es148.js +79 -0
  153. package/dist/es/standards-sdk.es148.js.map +1 -0
  154. package/dist/es/standards-sdk.es15.js +1 -1
  155. package/dist/es/standards-sdk.es16.js +1 -1
  156. package/dist/es/standards-sdk.es17.js +5 -11
  157. package/dist/es/standards-sdk.es17.js.map +1 -1
  158. package/dist/es/standards-sdk.es19.js +12 -17
  159. package/dist/es/standards-sdk.es19.js.map +1 -1
  160. package/dist/es/standards-sdk.es2.js +26 -72
  161. package/dist/es/standards-sdk.es2.js.map +1 -1
  162. package/dist/es/standards-sdk.es20.js +9 -14
  163. package/dist/es/standards-sdk.es20.js.map +1 -1
  164. package/dist/es/standards-sdk.es21.js +1 -1
  165. package/dist/es/standards-sdk.es22.js +1 -1
  166. package/dist/es/standards-sdk.es23.js +1 -1
  167. package/dist/es/standards-sdk.es24.js +1 -1
  168. package/dist/es/standards-sdk.es25.js +1 -1
  169. package/dist/es/standards-sdk.es26.js +1 -1
  170. package/dist/es/standards-sdk.es27.js +1 -1
  171. package/dist/es/standards-sdk.es28.js +12 -17
  172. package/dist/es/standards-sdk.es28.js.map +1 -1
  173. package/dist/es/standards-sdk.es3.js +2 -2
  174. package/dist/es/standards-sdk.es31.js +2 -2
  175. package/dist/es/standards-sdk.es32.js +4 -4
  176. package/dist/es/standards-sdk.es33.js +1 -1
  177. package/dist/es/standards-sdk.es36.js +6 -12
  178. package/dist/es/standards-sdk.es36.js.map +1 -1
  179. package/dist/es/standards-sdk.es37.js +4 -4
  180. package/dist/es/standards-sdk.es38.js +2 -2
  181. package/dist/es/standards-sdk.es39.js +2 -2
  182. package/dist/es/standards-sdk.es40.js +1 -1
  183. package/dist/es/standards-sdk.es41.js +1 -1
  184. package/dist/es/standards-sdk.es42.js +2 -2
  185. package/dist/es/standards-sdk.es47.js +1 -1
  186. package/dist/es/standards-sdk.es5.js +2 -2
  187. package/dist/es/standards-sdk.es52.js +1 -1
  188. package/dist/es/standards-sdk.es54.js +1 -1
  189. package/dist/es/standards-sdk.es57.js +2 -2
  190. package/dist/es/standards-sdk.es59.js +1 -1
  191. package/dist/es/standards-sdk.es6.js +2 -2
  192. package/dist/es/standards-sdk.es60.js +1 -1
  193. package/dist/es/standards-sdk.es61.js +7 -12
  194. package/dist/es/standards-sdk.es61.js.map +1 -1
  195. package/dist/es/standards-sdk.es63.js +1 -1
  196. package/dist/es/standards-sdk.es65.js +2 -2
  197. package/dist/es/standards-sdk.es66.js +3 -3
  198. package/dist/es/standards-sdk.es69.js +2 -2
  199. package/dist/es/standards-sdk.es7.js +2 -2
  200. package/dist/es/standards-sdk.es70.js +3 -3
  201. package/dist/es/standards-sdk.es71.js +2 -2
  202. package/dist/es/standards-sdk.es72.js +1 -1
  203. package/dist/es/standards-sdk.es73.js.map +1 -1
  204. package/dist/es/standards-sdk.es75.js +2 -2
  205. package/dist/es/standards-sdk.es77.js +5 -3
  206. package/dist/es/standards-sdk.es77.js.map +1 -1
  207. package/dist/es/standards-sdk.es78.js +4 -10
  208. package/dist/es/standards-sdk.es78.js.map +1 -1
  209. package/dist/es/standards-sdk.es79.js +1 -1
  210. package/dist/es/standards-sdk.es8.js +1 -1
  211. package/dist/es/standards-sdk.es80.js +26 -15
  212. package/dist/es/standards-sdk.es80.js.map +1 -1
  213. package/dist/es/standards-sdk.es82.js +12 -4
  214. package/dist/es/standards-sdk.es82.js.map +1 -1
  215. package/dist/es/standards-sdk.es83.js +7 -6
  216. package/dist/es/standards-sdk.es83.js.map +1 -1
  217. package/dist/es/standards-sdk.es84.js +7 -5
  218. package/dist/es/standards-sdk.es84.js.map +1 -1
  219. package/dist/es/standards-sdk.es86.js +55 -21
  220. package/dist/es/standards-sdk.es86.js.map +1 -1
  221. package/dist/es/standards-sdk.es87.js +22 -75
  222. package/dist/es/standards-sdk.es87.js.map +1 -1
  223. package/dist/es/standards-sdk.es88.js +45 -30
  224. package/dist/es/standards-sdk.es88.js.map +1 -1
  225. package/dist/es/standards-sdk.es89.js +57 -22
  226. package/dist/es/standards-sdk.es89.js.map +1 -1
  227. package/dist/es/standards-sdk.es90.js +28 -23
  228. package/dist/es/standards-sdk.es90.js.map +1 -1
  229. package/dist/es/standards-sdk.es91.js +23 -167
  230. package/dist/es/standards-sdk.es91.js.map +1 -1
  231. package/dist/es/standards-sdk.es92.js +158 -119
  232. package/dist/es/standards-sdk.es92.js.map +1 -1
  233. package/dist/es/standards-sdk.es93.js +68 -95
  234. package/dist/es/standards-sdk.es93.js.map +1 -1
  235. package/dist/es/standards-sdk.es94.js +136 -119
  236. package/dist/es/standards-sdk.es94.js.map +1 -1
  237. package/dist/es/standards-sdk.es95.js +139 -39
  238. package/dist/es/standards-sdk.es95.js.map +1 -1
  239. package/dist/es/standards-sdk.es96.js +42 -257
  240. package/dist/es/standards-sdk.es96.js.map +1 -1
  241. package/dist/es/standards-sdk.es97.js +243 -80
  242. package/dist/es/standards-sdk.es97.js.map +1 -1
  243. package/dist/es/standards-sdk.es98.js +47 -48
  244. package/dist/es/standards-sdk.es98.js.map +1 -1
  245. package/dist/es/standards-sdk.es99.js +100 -28
  246. package/dist/es/standards-sdk.es99.js.map +1 -1
  247. package/dist/es/utils/dynamic-import.d.ts +1 -0
  248. package/dist/es/utils/dynamic-import.d.ts.map +1 -1
  249. package/package.json +63 -65
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es128.js","sources":["../../src/services/registry-broker/private-key-signer.ts"],"sourcesContent":["import { createRequire } from 'node:module';\nimport type {\n Signer,\n AccountBalance,\n AccountInfo,\n Transaction,\n TransactionRecord,\n SignerSignature,\n} from '@hashgraph/sdk';\n\nconst unsupported = (method: string): Error =>\n new Error(`${method} is not supported by the in-memory signer`);\n\nexport interface PrivateKeySignerOptions {\n accountId: string;\n privateKey: string;\n network: 'mainnet' | 'testnet';\n}\n\nexport const createPrivateKeySigner = (\n options: PrivateKeySignerOptions,\n): Signer => {\n const sdk = loadHashgraphSdk();\n const { AccountId, LedgerId, PrivateKey, SignerSignature } = sdk;\n if (!options.privateKey) {\n throw new Error('privateKey is required to create a ledger signer.');\n }\n if (!options.accountId) {\n throw new Error('accountId is required to create a ledger signer.');\n }\n const accountId = AccountId.fromString(options.accountId);\n const privateKey = PrivateKey.fromString(options.privateKey);\n const ledgerId = LedgerId.fromString(options.network);\n\n return {\n getLedgerId: () => ledgerId,\n getAccountId: () => accountId,\n getAccountKey: () => privateKey.publicKey,\n getNetwork: () => ({}),\n getMirrorNetwork: () => [],\n sign: async (messages: Uint8Array[]): Promise<SignerSignature[]> =>\n Promise.all(\n messages.map(async message => {\n const signature = await privateKey.sign(message);\n return new SignerSignature({\n publicKey: privateKey.publicKey,\n signature,\n accountId,\n });\n }),\n ),\n getAccountBalance: async (): Promise<AccountBalance> => {\n throw unsupported('getAccountBalance');\n },\n getAccountInfo: async (): Promise<AccountInfo> => {\n throw unsupported('getAccountInfo');\n },\n getAccountRecords: async (): Promise<TransactionRecord[]> => {\n throw unsupported('getAccountRecords');\n },\n signTransaction: async <T extends Transaction>(_: T): Promise<T> => {\n throw unsupported('signTransaction');\n },\n checkTransaction: async <T extends Transaction>(_: T): Promise<T> => {\n throw unsupported('checkTransaction');\n },\n populateTransaction: async <T extends Transaction>(_: T): Promise<T> => {\n throw unsupported('populateTransaction');\n },\n call: async <RequestT, ResponseT, OutputT>(\n _request: unknown,\n ): Promise<OutputT> => {\n throw unsupported('call');\n },\n };\n};\n\ntype HashgraphSdk = typeof import('@hashgraph/sdk');\n\nlet cachedSdk: HashgraphSdk | null = null;\n\nconst loadHashgraphSdk = (): HashgraphSdk => {\n if (cachedSdk) {\n return cachedSdk;\n }\n const metaUrl =\n typeof import.meta !== 'undefined' &&\n typeof (import.meta as { url?: string }).url === 'string'\n ? (import.meta as { url: string }).url\n : undefined;\n const loader = createRequire(metaUrl ?? `${process.cwd()}/.hol-rb-client.cjs`);\n try {\n const resolved = loader('@hashgraph/sdk') as HashgraphSdk;\n cachedSdk = resolved;\n return resolved;\n } catch (error) {\n const message =\n '@hashgraph/sdk is required for ledger signing. Install it as a dependency to enable createPrivateKeySigner.';\n const err = new Error(message);\n (err as { cause?: unknown }).cause = error;\n throw err;\n }\n};\n"],"names":[],"mappings":";AAUA,MAAM,cAAc,CAAC,WACnB,IAAI,MAAM,GAAG,MAAM,2CAA2C;AAQzD,MAAM,yBAAyB,CACpC,YACW;AACX,QAAM,MAAM,iBAAA;AACZ,QAAM,EAAE,WAAW,UAAU,YAAY,oBAAoB;AAC7D,MAAI,CAAC,QAAQ,YAAY;AACvB,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AACA,MAAI,CAAC,QAAQ,WAAW;AACtB,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AACA,QAAM,YAAY,UAAU,WAAW,QAAQ,SAAS;AACxD,QAAM,aAAa,WAAW,WAAW,QAAQ,UAAU;AAC3D,QAAM,WAAW,SAAS,WAAW,QAAQ,OAAO;AAEpD,SAAO;AAAA,IACL,aAAa,MAAM;AAAA,IACnB,cAAc,MAAM;AAAA,IACpB,eAAe,MAAM,WAAW;AAAA,IAChC,YAAY,OAAO,CAAA;AAAA,IACnB,kBAAkB,MAAM,CAAA;AAAA,IACxB,MAAM,OAAO,aACX,QAAQ;AAAA,MACN,SAAS,IAAI,OAAM,YAAW;AAC5B,cAAM,YAAY,MAAM,WAAW,KAAK,OAAO;AAC/C,eAAO,IAAI,gBAAgB;AAAA,UACzB,WAAW,WAAW;AAAA,UACtB;AAAA,UACA;AAAA,QAAA,CACD;AAAA,MACH,CAAC;AAAA,IAAA;AAAA,IAEL,mBAAmB,YAAqC;AACtD,YAAM,YAAY,mBAAmB;AAAA,IACvC;AAAA,IACA,gBAAgB,YAAkC;AAChD,YAAM,YAAY,gBAAgB;AAAA,IACpC;AAAA,IACA,mBAAmB,YAA0C;AAC3D,YAAM,YAAY,mBAAmB;AAAA,IACvC;AAAA,IACA,iBAAiB,OAA8B,MAAqB;AAClE,YAAM,YAAY,iBAAiB;AAAA,IACrC;AAAA,IACA,kBAAkB,OAA8B,MAAqB;AACnE,YAAM,YAAY,kBAAkB;AAAA,IACtC;AAAA,IACA,qBAAqB,OAA8B,MAAqB;AACtE,YAAM,YAAY,qBAAqB;AAAA,IACzC;AAAA,IACA,MAAM,OACJ,aACqB;AACrB,YAAM,YAAY,MAAM;AAAA,IAC1B;AAAA,EAAA;AAEJ;AAIA,IAAI,YAAiC;AAErC,MAAM,mBAAmB,MAAoB;AAC3C,MAAI,WAAW;AACb,WAAO;AAAA,EACT;AACA,QAAM,UACJ,OAAO,gBAAgB,eACvB,OAAQ,YAAiC,QAAQ,WAC5C,YAAgC,MACjC;AACN,QAAM,SAAS,cAAc,WAAW,GAAG,QAAQ,IAAA,CAAK,qBAAqB;AAC7E,MAAI;AACF,UAAM,WAAW,OAAO,gBAAgB;AACxC,gBAAY;AACZ,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM,UACJ;AACF,UAAM,MAAM,IAAI,MAAM,OAAO;AAC5B,QAA4B,QAAQ;AACrC,UAAM;AAAA,EACR;AACF;"}
1
+ {"version":3,"file":"standards-sdk.es128.js","sources":["../../src/services/registry-broker/client.ts"],"sourcesContent":["import {\n AdaptersResponse,\n CreateSessionRequestPayload,\n CreateSessionResponse,\n AgentRegistrationRequest,\n RegisterAgentResponse,\n RegisterAgentQuoteResponse,\n RegisterAgentPendingResponse,\n RegisterAgentPartialResponse,\n RegisterAgentSuccessResponse,\n CreditPurchaseResponse,\n PopularSearchesResponse,\n RegistriesResponse,\n RegistryStatsResponse,\n ResolvedAgentResponse,\n SearchFacetsResponse,\n SearchParams,\n SearchResult,\n SendMessageRequestPayload,\n SendMessageResponse,\n ProtocolsResponse,\n DetectProtocolResponse,\n ProtocolDetectionMessage,\n RegistrySearchByNamespaceResponse,\n WebsocketStatsResponse,\n MetricsSummaryResponse,\n UaidValidationResponse,\n UaidConnectionStatus,\n DashboardStatsResponse,\n JsonValue,\n JsonObject,\n VectorSearchRequest,\n VectorSearchResponse,\n AgentAuthConfig,\n LedgerChallengeRequest,\n LedgerChallengeResponse,\n LedgerVerifyRequest,\n LedgerVerifyResponse,\n LedgerAuthenticationOptions,\n LedgerCredentialAuthOptions,\n RegisterAgentOptions,\n AutoTopUpOptions,\n HistoryAutoTopUpOptions,\n RegistrationProgressRecord,\n RegistrationProgressWaitOptions,\n ChatHistorySnapshotResponse,\n ChatHistoryCompactionResponse,\n CompactHistoryRequestPayload,\n AdapterDetailsResponse,\n AdditionalRegistryCatalogResponse,\n X402CreditPurchaseResponse,\n X402MinimumsResponse,\n SessionEncryptionStatusResponse,\n EncryptionHandshakeRecord,\n EncryptionHandshakeSubmissionPayload,\n RegisterEncryptionKeyPayload,\n RegisterEncryptionKeyResponse,\n EphemeralKeyPair,\n DeriveSharedSecretOptions,\n EncryptCipherEnvelopeOptions,\n DecryptCipherEnvelopeOptions,\n SharedSecretInput,\n CipherEnvelope,\n CipherEnvelopeRecipient,\n ChatConversationHandle,\n StartChatOptions,\n StartConversationOptions,\n AcceptConversationOptions,\n ChatHistoryEntry,\n ClientEncryptionOptions,\n AutoRegisterEncryptionKeyOptions,\n EnsureAgentKeyOptions,\n RegistryBrokerClientOptions,\n InitializeAgentClientOptions,\n ChatHistoryFetchOptions,\n ChatHistorySnapshotWithDecryptedEntries,\n RecipientIdentity,\n EncryptedChatSessionHandle,\n SessionEncryptionSummary,\n LedgerAuthenticationSignerResult,\n StartEncryptedChatSessionOptions,\n AcceptEncryptedChatSessionOptions,\n SearchStatusResponse,\n} from './types';\ntype PaymentHeaders = Record<string, string | string[] | undefined>;\ntype PaymentClient = {\n post: (\n url: string,\n body: JsonObject,\n ) => Promise<{ data: JsonValue; headers?: PaymentHeaders }>;\n};\nimport * as path from 'node:path';\nimport { Buffer } from 'node:buffer';\nimport {\n randomBytes,\n createCipheriv,\n createDecipheriv,\n createHash,\n} from 'node:crypto';\nimport { secp256k1 } from '@noble/curves/secp256k1.js';\nimport { canonicalizeLedgerNetwork } from './ledger-network';\nimport type { SignerSignature } from '@hashgraph/sdk';\nimport {\n adaptersResponseSchema,\n createSessionResponseSchema,\n encryptionHandshakeResponseSchema,\n detectProtocolResponseSchema,\n dashboardStatsResponseSchema,\n metricsSummaryResponseSchema,\n popularResponseSchema,\n protocolsResponseSchema,\n registerAgentResponseSchema,\n registrationQuoteResponseSchema,\n creditPurchaseResponseSchema,\n x402CreditPurchaseResponseSchema,\n x402MinimumsResponseSchema,\n registriesResponseSchema,\n registrySearchByNamespaceSchema,\n searchFacetsResponseSchema,\n vectorSearchResponseSchema,\n searchStatusResponseSchema,\n resolveResponseSchema,\n searchResponseSchema,\n sendMessageResponseSchema,\n chatHistorySnapshotResponseSchema,\n chatHistoryCompactionResponseSchema,\n sessionEncryptionStatusResponseSchema,\n registerEncryptionKeyResponseSchema,\n statsResponseSchema,\n uaidConnectionStatusSchema,\n uaidValidationResponseSchema,\n websocketStatsResponseSchema,\n ledgerChallengeResponseSchema,\n ledgerVerifyResponseSchema,\n adapterDetailsResponseSchema,\n additionalRegistryCatalogResponseSchema,\n registrationProgressResponseSchema,\n} from './schemas';\nimport { ZodError, z } from 'zod';\nimport { createPrivateKeySigner } from './private-key-signer';\nimport { optionalImport } from '../../utils/dynamic-import';\n\ntype FsModule = {\n existsSync: (path: string) => boolean;\n readFileSync: (path: string, encoding: BufferEncoding) => string;\n writeFileSync: (path: string, data: string) => void;\n appendFileSync: (path: string, data: string) => void;\n};\n\nconst getFs = async (): Promise<FsModule | null> => {\n const fsModule = await optionalImport<Partial<FsModule>>('node:fs');\n\n if (\n fsModule &&\n typeof fsModule.existsSync === 'function' &&\n typeof fsModule.readFileSync === 'function' &&\n typeof fsModule.writeFileSync === 'function' &&\n typeof fsModule.appendFileSync === 'function'\n ) {\n return fsModule as FsModule;\n }\n\n return null;\n};\n\nconst DEFAULT_USER_AGENT = '@hol-org/rb-client';\n\nconst DEFAULT_PROGRESS_INTERVAL_MS = 1_500;\nconst DEFAULT_PROGRESS_TIMEOUT_MS = 5 * 60 * 1_000;\n\nexport interface InitializedAgentClient {\n client: RegistryBrokerClient;\n encryption?: { publicKey: string; privateKey?: string } | null;\n}\n\nconst createAbortError = (): Error =>\n typeof DOMException === 'function'\n ? new DOMException('Aborted', 'AbortError')\n : new Error('The operation was aborted');\n\nconst normaliseHeaderName = (name: string): string => name.trim().toLowerCase();\n\nconst isBrowserRuntime = (): boolean =>\n typeof window !== 'undefined' && typeof window.fetch === 'function';\n\nconst DEFAULT_BASE_URL = 'https://hol.org/registry/api/v1';\nconst JSON_CONTENT_TYPE = /application\\/json/i;\nconst DEFAULT_HISTORY_TOP_UP_HBAR = 0.25;\nconst MINIMUM_REGISTRATION_AUTO_TOP_UP_CREDITS = 1;\n\nconst toJsonValue = (value: unknown): JsonValue => {\n if (value === null) {\n return null;\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(item => (item === undefined ? null : toJsonValue(item)));\n }\n if (typeof value === 'object') {\n const result: JsonObject = {};\n Object.entries(value as Record<string, unknown>).forEach(\n ([key, entryValue]) => {\n if (entryValue !== undefined) {\n result[key] = toJsonValue(entryValue);\n }\n },\n );\n return result;\n }\n throw new TypeError('Only JSON-compatible values are supported');\n};\n\nconst isJsonObject = (value: JsonValue): value is JsonObject =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst toJsonObject = (value: unknown): JsonObject => {\n const normalised = toJsonValue(value);\n if (isJsonObject(normalised)) {\n return normalised;\n }\n throw new TypeError('Expected JSON object value');\n};\n\nconst serialiseAuthConfig = (auth: AgentAuthConfig): JsonObject => {\n const authPayload: JsonObject = {};\n if (auth.type) {\n authPayload.type = auth.type;\n }\n if (auth.token) {\n authPayload.token = auth.token;\n }\n if (auth.username) {\n authPayload.username = auth.username;\n }\n if (auth.password) {\n authPayload.password = auth.password;\n }\n if (auth.headerName) {\n authPayload.headerName = auth.headerName;\n }\n if (auth.headerValue) {\n authPayload.headerValue = auth.headerValue;\n }\n if (auth.headers) {\n authPayload.headers = { ...auth.headers };\n }\n return authPayload;\n};\n\nconst serialiseAgentRegistrationRequest = (\n payload: AgentRegistrationRequest,\n): JsonObject => {\n const body: JsonObject = {\n profile: toJsonObject(payload.profile),\n };\n if (payload.endpoint !== undefined) {\n body.endpoint = payload.endpoint;\n }\n if (payload.protocol !== undefined) {\n body.protocol = payload.protocol;\n }\n if (payload.communicationProtocol !== undefined) {\n body.communicationProtocol = payload.communicationProtocol;\n }\n if (payload.registry !== undefined) {\n body.registry = payload.registry;\n }\n if (payload.additionalRegistries !== undefined) {\n body.additionalRegistries = payload.additionalRegistries;\n }\n if (payload.metadata !== undefined) {\n body.metadata = toJsonObject(payload.metadata);\n }\n return body;\n};\n\nexport interface GenerateEncryptionKeyPairOptions {\n keyType?: 'secp256k1';\n envVar?: string;\n envPath?: string;\n overwrite?: boolean;\n}\n\ninterface RequestConfig {\n method?: string;\n body?: unknown;\n headers?: Record<string, string>;\n}\n\ninterface PurchaseCreditsWithX402Params {\n accountId: string;\n credits: number;\n usdAmount?: number;\n description?: string;\n metadata?: JsonObject;\n walletClient: object;\n}\n\ntype X402NetworkId = 'base' | 'base-sepolia';\n\ninterface BuyCreditsWithX402Params {\n accountId: string;\n credits: number;\n usdAmount?: number;\n description?: string;\n metadata?: JsonObject;\n evmPrivateKey: string;\n network?: X402NetworkId;\n rpcUrl?: string;\n}\n\nconst normalizeHexPrivateKey = (value: string): `0x${string}` => {\n const trimmed = value.trim();\n if (!trimmed) {\n throw new Error('evmPrivateKey is required');\n }\n return trimmed.startsWith('0x')\n ? (trimmed as `0x${string}`)\n : (`0x${trimmed}` as `0x${string}`);\n};\n\ntype X402PurchaseResult = X402CreditPurchaseResponse & {\n paymentResponseHeader?: string;\n paymentResponse?: unknown;\n};\n\ninterface ErrorDetails {\n status: number;\n statusText: string;\n body: JsonValue;\n}\n\nexport class RegistryBrokerError extends Error {\n readonly status: number;\n readonly statusText: string;\n readonly body: JsonValue;\n\n constructor(message: string, details: ErrorDetails) {\n super(message);\n this.status = details.status;\n this.statusText = details.statusText;\n this.body = details.body;\n }\n}\n\nexport class RegistryBrokerParseError extends Error {\n readonly cause: ZodError | Error | string;\n readonly rawValue?: JsonValue;\n\n constructor(\n message: string,\n cause: ZodError | Error | string,\n rawValue?: JsonValue,\n ) {\n super(message);\n this.cause = cause;\n this.rawValue = rawValue;\n }\n}\n\nfunction normaliseBaseUrl(input?: string): string {\n const trimmed = input?.trim();\n let baseCandidate =\n trimmed && trimmed.length > 0 ? trimmed : DEFAULT_BASE_URL;\n\n try {\n const url = new URL(baseCandidate.replace(/\\/+$/, ''));\n const hostname = url.hostname.toLowerCase();\n const ensureRegistryPrefix = (): void => {\n if (!url.pathname.startsWith('/registry')) {\n url.pathname =\n url.pathname === '/' ? '/registry' : `/registry${url.pathname}`;\n }\n };\n\n if (hostname === 'hol.org') {\n ensureRegistryPrefix();\n baseCandidate = url.toString();\n } else if (\n hostname === 'registry.hashgraphonline.com' ||\n hostname === 'hashgraphonline.com'\n ) {\n // Avoid 301s that downgrade POST->GET by normalizing directly to hol.org/registry.\n ensureRegistryPrefix();\n url.hostname = 'hol.org';\n baseCandidate = url.toString();\n }\n } catch {\n // If parsing fails, fall back to string handling below.\n }\n\n const withoutTrailing = baseCandidate.replace(/\\/+$/, '');\n if (/\\/api\\/v\\d+$/i.test(withoutTrailing)) {\n return withoutTrailing;\n }\n if (/\\/api$/i.test(withoutTrailing)) {\n return `${withoutTrailing}/v1`;\n }\n return `${withoutTrailing}/api/v1`;\n}\n\nfunction buildSearchQuery(params: SearchParams): string {\n const query = new URLSearchParams();\n const appendList = (key: string, values?: string[]) => {\n if (!values) {\n return;\n }\n values.forEach(value => {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed.length > 0) {\n query.append(key, trimmed);\n }\n }\n });\n };\n\n if (params.q) {\n const trimmed = params.q.trim();\n if (trimmed.length > 0) {\n query.set('q', trimmed);\n }\n }\n if (typeof params.page === 'number') {\n query.set('page', params.page.toString());\n }\n if (typeof params.limit === 'number') {\n query.set('limit', params.limit.toString());\n }\n if (params.registry) {\n const trimmed = params.registry.trim();\n if (trimmed.length > 0) {\n query.set('registry', trimmed);\n }\n }\n appendList('registries', params.registries);\n if (typeof params.minTrust === 'number') {\n query.set('minTrust', params.minTrust.toString());\n }\n appendList('capabilities', params.capabilities);\n appendList('protocols', params.protocols);\n appendList('adapters', params.adapters);\n\n if (params.metadata) {\n Object.entries(params.metadata).forEach(([key, values]) => {\n if (!key || !Array.isArray(values) || values.length === 0) {\n return;\n }\n const trimmedKey = key.trim();\n if (trimmedKey.length === 0) {\n return;\n }\n values.forEach(value => {\n if (value === undefined || value === null) {\n return;\n }\n query.append(`metadata.${trimmedKey}`, String(value));\n });\n });\n }\n\n if (params.type) {\n const trimmedType = params.type.trim();\n if (trimmedType.length > 0 && trimmedType.toLowerCase() !== 'all') {\n query.set('type', trimmedType);\n }\n }\n\n if (params.verified === true) {\n query.set('verified', 'true');\n }\n\n if (params.online === true) {\n query.set('online', 'true');\n }\n\n if (params.sortBy) {\n const trimmedSort = params.sortBy.trim();\n if (trimmedSort.length > 0) {\n query.set('sortBy', trimmedSort);\n }\n }\n\n if (params.sortOrder) {\n const lowered = params.sortOrder.toLowerCase();\n if (lowered === 'asc' || lowered === 'desc') {\n query.set('sortOrder', lowered);\n }\n }\n const queryString = query.toString();\n return queryString.length > 0 ? `?${queryString}` : '';\n}\n\nexport class RegistryBrokerClient {\n static async initializeAgent(\n options: InitializeAgentClientOptions,\n ): Promise<InitializedAgentClient> {\n const { uaid, ensureEncryptionKey = true, ...clientOptions } = options;\n const client = new RegistryBrokerClient(clientOptions);\n let encryption: { publicKey: string; privateKey?: string } | null = null;\n if (ensureEncryptionKey) {\n const ensureOptions =\n typeof ensureEncryptionKey === 'object'\n ? ensureEncryptionKey\n : { generateIfMissing: true };\n encryption = await client.encryption.ensureAgentKey({\n uaid,\n ...ensureOptions,\n });\n }\n return { client, encryption };\n }\n readonly chat: {\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\n readonly encryption: {\n registerKey: (\n payload: RegisterEncryptionKeyPayload,\n ) => Promise<RegisterEncryptionKeyResponse>;\n generateEphemeralKeyPair: () => EphemeralKeyPair;\n deriveSharedSecret: (options: DeriveSharedSecretOptions) => Buffer;\n encryptCipherEnvelope: (\n options: EncryptCipherEnvelopeOptions,\n ) => CipherEnvelope;\n decryptCipherEnvelope: (options: DecryptCipherEnvelopeOptions) => string;\n ensureAgentKey: (\n options: EnsureAgentKeyOptions,\n ) => Promise<{ publicKey: string; privateKey?: string }>;\n };\n\n private readonly baseUrl: string;\n private readonly fetchImpl: typeof fetch;\n private readonly defaultHeaders: Record<string, string>;\n private readonly registrationAutoTopUp?: AutoTopUpOptions;\n private readonly historyAutoTopUp?: HistoryAutoTopUpOptions;\n private readonly encryptedChatManager: EncryptedChatManager;\n private readonly encryptionOptions?: ClientEncryptionOptions;\n private readonly encryptionBootstrapPromise: Promise<void> | null;\n private readonly conversationContexts = new Map<\n string,\n ConversationContextState[]\n >();\n private async loadViemAccount(\n privateKey: `0x${string}`,\n ): Promise<{\n publicKey: string;\n signMessage: (input: { message: string }) => Promise<string>;\n }> {\n try {\n const viem = await import('viem/accounts');\n return viem.privateKeyToAccount(privateKey);\n } catch (error) {\n const err = new Error(\n 'EVM ledger authentication requires the optional dependency \"viem\". Install it to use evmPrivateKey flows.',\n );\n (err as { cause?: unknown }).cause = error;\n throw err;\n }\n }\n\n private async loadX402Dependencies(): Promise<{\n createPaymentClient: (walletClient: object) => PaymentClient;\n decodePaymentResponse: (value: string) => unknown;\n createX402Signer: (\n network: X402NetworkId,\n privateKey: `0x${string}`,\n ) => Promise<object>;\n }> {\n type X402AxiosModule = {\n withPaymentInterceptor: (\n client: unknown,\n walletClient: object,\n ) => unknown;\n decodeXPaymentResponse: (value: string) => unknown;\n };\n type X402TypesModule = {\n createSigner: (\n network: X402NetworkId,\n privateKey: `0x${string}`,\n ) => Promise<object>;\n };\n\n try {\n const [{ default: axios }, x402Axios, x402Types] = await Promise.all([\n import('axios'),\n optionalImport<X402AxiosModule>('x402-axios'),\n optionalImport<X402TypesModule>('x402/types'),\n ]);\n\n if (!x402Axios || !x402Types) {\n throw new Error(\n 'x402-axios and x402/types are required for X402 flows. Install them to enable ledger payments.',\n );\n }\n\n const withPaymentInterceptor = x402Axios.withPaymentInterceptor;\n const decodePaymentResponse = x402Axios.decodeXPaymentResponse;\n const createX402Signer = x402Types.createSigner;\n\n const createPaymentClient = (walletClient: object): PaymentClient => {\n const axiosClient = axios.create({\n baseURL: this.baseUrl,\n headers: {\n ...this.getDefaultHeaders(),\n 'content-type': 'application/json',\n },\n });\n const client = withPaymentInterceptor(axiosClient, walletClient) as {\n post: (\n url: string,\n body: JsonObject,\n ) => Promise<{ data: JsonValue; headers?: PaymentHeaders }>;\n };\n return {\n post: async (url: string, body: JsonObject) => {\n const response = await client.post(url, body);\n return {\n data: response.data,\n headers: response.headers,\n };\n },\n };\n };\n\n return {\n createPaymentClient,\n decodePaymentResponse,\n createX402Signer,\n };\n } catch (error) {\n const err = new Error(\n 'X402 credit purchases require optional dependencies \"axios\", \"x402-axios\", and \"x402/types\". Install them to enable this feature.',\n );\n (err as { cause?: unknown }).cause = error;\n throw err;\n }\n }\n\n constructor(options: RegistryBrokerClientOptions = {}) {\n this.baseUrl = normaliseBaseUrl(options.baseUrl);\n const fetchCandidate = options.fetchImplementation ?? globalThis.fetch;\n if (!fetchCandidate) {\n throw new Error(\n 'A fetch implementation is required for RegistryBrokerClient',\n );\n }\n this.fetchImpl = fetchCandidate;\n this.defaultHeaders = {};\n if (options.defaultHeaders) {\n Object.entries(options.defaultHeaders).forEach(([name, value]) => {\n if (typeof value === 'string') {\n this.setDefaultHeader(name, value);\n }\n });\n }\n if (options.apiKey && options.apiKey.trim().length > 0) {\n this.setApiKey(options.apiKey);\n }\n if (options.ledgerApiKey && options.ledgerApiKey.trim().length > 0) {\n this.setLedgerApiKey(options.ledgerApiKey);\n }\n\n this.registrationAutoTopUp = options.registrationAutoTopUp;\n this.historyAutoTopUp = options.historyAutoTopUp;\n this.encryptedChatManager = new EncryptedChatManager(this);\n this.encryptionOptions = options.encryption;\n this.encryptionBootstrapPromise = this.bootstrapEncryptionOptions(\n options.encryption,\n );\n\n this.chat = {\n start: options => this.startChat(options),\n createSession: payload => this.createSession(payload),\n sendMessage: payload => this.sendMessage(payload),\n endSession: sessionId => this.endSession(sessionId),\n getHistory: (sessionId, options) =>\n this.fetchHistorySnapshot(sessionId, options),\n compactHistory: payload => this.compactHistory(payload),\n getEncryptionStatus: sessionId => this.fetchEncryptionStatus(sessionId),\n submitEncryptionHandshake: (sessionId, payload) =>\n this.postEncryptionHandshake(sessionId, payload),\n startConversation: opts => this.startConversation(opts),\n acceptConversation: opts => this.acceptConversation(opts),\n };\n\n this.encryption = {\n registerKey: payload => this.registerEncryptionKey(payload),\n generateEphemeralKeyPair: () => this.createEphemeralKeyPair(),\n deriveSharedSecret: options => this.deriveSharedSecret(options),\n encryptCipherEnvelope: options => this.buildCipherEnvelope(options),\n decryptCipherEnvelope: options => this.openCipherEnvelope(options),\n ensureAgentKey: options => this.ensureAgentEncryptionKey(options),\n };\n\n this.chat.createEncryptedSession = options =>\n this.encryptedChatManager.startSession(options);\n this.chat.acceptEncryptedSession = options =>\n this.encryptedChatManager.acceptSession(options);\n }\n\n setApiKey(apiKey?: string): void {\n this.setDefaultHeader('x-api-key', apiKey);\n }\n\n setLedgerApiKey(apiKey?: string): void {\n this.setDefaultHeader('x-ledger-api-key', apiKey);\n }\n\n setDefaultHeader(name: string, value?: string | null): void {\n if (!name || name.trim().length === 0) {\n return;\n }\n const headerName = normaliseHeaderName(name);\n if (!value || value.trim().length === 0) {\n delete this.defaultHeaders[headerName];\n return;\n }\n this.defaultHeaders[headerName] = value.trim();\n }\n\n getDefaultHeaders(): Record<string, string> {\n return { ...this.defaultHeaders };\n }\n\n async encryptionReady(): Promise<void> {\n if (!this.encryptionBootstrapPromise) {\n return;\n }\n await this.encryptionBootstrapPromise;\n }\n\n async search(params: SearchParams = {}): Promise<SearchResult> {\n const query = buildSearchQuery(params);\n const raw = await this.requestJson<JsonValue>(`/search${query}`, {\n method: 'GET',\n });\n return this.parseWithSchema(raw, searchResponseSchema, 'search response');\n }\n\n async stats(): Promise<RegistryStatsResponse> {\n const raw = await this.requestJson<JsonValue>('/stats', { method: 'GET' });\n return this.parseWithSchema(raw, statsResponseSchema, 'stats response');\n }\n\n async registries(): Promise<RegistriesResponse> {\n const raw = await this.requestJson<JsonValue>('/registries', {\n method: 'GET',\n });\n return this.parseWithSchema(\n raw,\n registriesResponseSchema,\n 'registries response',\n );\n }\n\n async getAdditionalRegistries(): Promise<AdditionalRegistryCatalogResponse> {\n const raw = await this.requestJson<JsonValue>(\n '/register/additional-registries',\n {\n method: 'GET',\n },\n );\n return this.parseWithSchema(\n raw,\n additionalRegistryCatalogResponseSchema,\n 'additional registry catalog response',\n );\n }\n\n private bootstrapEncryptionOptions(\n options?: ClientEncryptionOptions,\n ): Promise<void> | null {\n if (!options?.autoRegister || options.autoRegister.enabled === false) {\n return null;\n }\n return this.autoRegisterEncryptionKey(options.autoRegister).then(\n (): void => undefined,\n );\n }\n\n private async autoRegisterEncryptionKey(\n config: AutoRegisterEncryptionKeyOptions,\n ): Promise<{ publicKey: string; privateKey?: string }> {\n const identity = this.normalizeAutoRegisterIdentity(config);\n if (!identity) {\n throw new Error(\n 'Auto-registration requires uaid, ledgerAccountId, or email',\n );\n }\n const material = await this.resolveAutoRegisterKeyMaterial(config);\n if (!material) {\n throw new Error(\n 'Unable to resolve encryption public key for auto-registration',\n );\n }\n await this.registerEncryptionKey({\n keyType: config.keyType ?? 'secp256k1',\n publicKey: material.publicKey,\n ...identity,\n });\n return material;\n }\n\n private normalizeAutoRegisterIdentity(\n config: AutoRegisterEncryptionKeyOptions,\n ): Pick<\n RegisterEncryptionKeyPayload,\n 'uaid' | 'ledgerAccountId' | 'ledgerNetwork' | 'email'\n > | null {\n const identity: Pick<\n RegisterEncryptionKeyPayload,\n 'uaid' | 'ledgerAccountId' | 'ledgerNetwork' | 'email'\n > = {};\n if (config.uaid) {\n identity.uaid = config.uaid;\n }\n if (config.ledgerAccountId) {\n identity.ledgerAccountId = config.ledgerAccountId;\n if (config.ledgerNetwork) {\n identity.ledgerNetwork = config.ledgerNetwork;\n }\n }\n if (config.email) {\n identity.email = config.email;\n }\n if (identity.uaid || identity.ledgerAccountId || identity.email) {\n return identity;\n }\n return null;\n }\n\n private async resolveAutoRegisterKeyMaterial(\n config: AutoRegisterEncryptionKeyOptions,\n ): Promise<{ publicKey: string; privateKey?: string } | null> {\n if (config.publicKey?.trim()) {\n return { publicKey: config.publicKey.trim() };\n }\n let privateKey = config.privateKey?.trim();\n const envVar = config.envVar ?? 'RB_ENCRYPTION_PRIVATE_KEY';\n if (!privateKey && envVar && process?.env?.[envVar]?.trim()) {\n privateKey = process.env[envVar]?.trim();\n }\n if (!privateKey && config.generateIfMissing) {\n const pair = await this.generateEncryptionKeyPair({\n keyType: config.keyType ?? 'secp256k1',\n envVar,\n envPath: config.envPath,\n overwrite: config.overwriteEnv,\n });\n if (envVar) {\n process.env[envVar] = pair.privateKey;\n }\n return { publicKey: pair.publicKey, privateKey: pair.privateKey };\n }\n if (privateKey) {\n const publicKey = this.derivePublicKeyFromPrivateKey(privateKey);\n return { publicKey, privateKey };\n }\n return null;\n }\n\n private derivePublicKeyFromPrivateKey(privateKey: string): string {\n const normalized = this.hexToBuffer(privateKey);\n const publicKey = secp256k1.getPublicKey(normalized, true);\n return Buffer.from(publicKey).toString('hex');\n }\n\n private ensureAgentEncryptionKey(\n options: EnsureAgentKeyOptions,\n ): Promise<{ publicKey: string; privateKey?: string }> {\n return this.autoRegisterEncryptionKey({\n ...options,\n uaid: options.uaid,\n enabled: true,\n });\n }\n\n async popularSearches(): Promise<PopularSearchesResponse> {\n const raw = await this.requestJson<JsonValue>('/popular', {\n method: 'GET',\n });\n return this.parseWithSchema(\n raw,\n popularResponseSchema,\n 'popular searches response',\n );\n }\n\n async resolveUaid(uaid: string): Promise<ResolvedAgentResponse> {\n const raw = await this.requestJson<JsonValue>(\n `/resolve/${encodeURIComponent(uaid)}`,\n {\n method: 'GET',\n },\n );\n return this.parseWithSchema(\n raw,\n resolveResponseSchema,\n 'resolve UAID response',\n );\n }\n\n private async performRegisterAgent(\n payload: AgentRegistrationRequest,\n ): Promise<RegisterAgentResponse> {\n const raw = await this.requestJson<JsonValue>('/register', {\n method: 'POST',\n body: serialiseAgentRegistrationRequest(payload),\n headers: { 'content-type': 'application/json' },\n });\n return this.parseWithSchema(\n raw,\n registerAgentResponseSchema,\n 'register agent response',\n );\n }\n\n async registerAgent(\n payload: AgentRegistrationRequest,\n options?: RegisterAgentOptions,\n ): Promise<RegisterAgentResponse> {\n const autoTopUp = options?.autoTopUp ?? this.registrationAutoTopUp;\n\n if (!autoTopUp) {\n return this.performRegisterAgent(payload);\n }\n\n await this.ensureCreditsForRegistration(payload, autoTopUp);\n\n let retried = false;\n while (true) {\n try {\n return await this.performRegisterAgent(payload);\n } catch (error) {\n const shortfall = this.extractInsufficientCreditsDetails(error);\n if (shortfall && !retried) {\n await this.ensureCreditsForRegistration(payload, autoTopUp);\n retried = true;\n continue;\n }\n throw error;\n }\n }\n }\n\n async getRegistrationQuote(\n payload: AgentRegistrationRequest,\n ): Promise<RegisterAgentQuoteResponse> {\n const raw = await this.requestJson<JsonValue>('/register/quote', {\n method: 'POST',\n body: serialiseAgentRegistrationRequest(payload),\n headers: { 'content-type': 'application/json' },\n });\n\n return this.parseWithSchema(\n raw,\n registrationQuoteResponseSchema,\n 'registration quote response',\n );\n }\n\n async updateAgent(\n uaid: string,\n payload: AgentRegistrationRequest,\n ): Promise<RegisterAgentResponse> {\n const raw = await this.requestJson<JsonValue>(\n `/register/${encodeURIComponent(uaid)}`,\n {\n method: 'PUT',\n body: serialiseAgentRegistrationRequest(payload),\n headers: { 'content-type': 'application/json' },\n },\n );\n\n return this.parseWithSchema(\n raw,\n registerAgentResponseSchema,\n 'update agent response',\n );\n }\n\n async getRegistrationProgress(\n attemptId: string,\n ): Promise<RegistrationProgressRecord | null> {\n const normalisedAttemptId = attemptId.trim();\n if (!normalisedAttemptId) {\n throw new Error('attemptId is required');\n }\n\n try {\n const raw = await this.requestJson<JsonValue>(\n `/register/progress/${encodeURIComponent(normalisedAttemptId)}`,\n { method: 'GET' },\n );\n\n const parsed = this.parseWithSchema(\n raw,\n registrationProgressResponseSchema,\n 'registration progress response',\n );\n\n return parsed.progress;\n } catch (error) {\n if (error instanceof RegistryBrokerError && error.status === 404) {\n return null;\n }\n throw error;\n }\n }\n\n async waitForRegistrationCompletion(\n attemptId: string,\n options: RegistrationProgressWaitOptions = {},\n ): Promise<RegistrationProgressRecord> {\n const normalisedAttemptId = attemptId.trim();\n if (!normalisedAttemptId) {\n throw new Error('attemptId is required');\n }\n\n const interval = Math.max(\n 250,\n options.intervalMs ?? DEFAULT_PROGRESS_INTERVAL_MS,\n );\n const timeoutMs = options.timeoutMs ?? DEFAULT_PROGRESS_TIMEOUT_MS;\n const throwOnFailure = options.throwOnFailure ?? true;\n const signal = options.signal;\n const startedAt = Date.now();\n\n while (true) {\n if (signal?.aborted) {\n throw createAbortError();\n }\n\n const progress = await this.getRegistrationProgress(normalisedAttemptId);\n\n if (progress) {\n options.onProgress?.(progress);\n\n if (progress.status === 'completed') {\n return progress;\n }\n\n if (progress.status === 'partial' || progress.status === 'failed') {\n if (throwOnFailure) {\n throw new RegistryBrokerError(\n 'Registration did not complete successfully',\n {\n status: 409,\n statusText: progress.status,\n body: progress,\n },\n );\n }\n return progress;\n }\n }\n\n if (Date.now() - startedAt >= timeoutMs) {\n throw new Error(\n `Registration progress polling timed out after ${timeoutMs}ms`,\n );\n }\n\n await this.delay(interval, signal);\n }\n }\n\n async purchaseCreditsWithHbar(params: {\n accountId: string;\n privateKey: string;\n hbarAmount: number;\n memo?: string;\n metadata?: JsonObject;\n }): Promise<CreditPurchaseResponse> {\n const body: JsonObject = {\n accountId: params.accountId,\n payerKey: params.privateKey,\n hbarAmount: this.calculateHbarAmountParam(params.hbarAmount),\n };\n\n if (params.memo) {\n body.memo = params.memo;\n }\n\n if (params.metadata) {\n body.metadata = params.metadata;\n }\n\n const raw = await this.requestJson<JsonValue>('/credits/purchase', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body,\n });\n\n return this.parseWithSchema(\n raw,\n creditPurchaseResponseSchema,\n 'credit purchase response',\n );\n }\n\n async getX402Minimums(): Promise<X402MinimumsResponse> {\n const raw = await this.requestJson<JsonValue>(\n '/credits/purchase/x402/minimums',\n { method: 'GET' },\n );\n return this.parseWithSchema(\n raw,\n x402MinimumsResponseSchema,\n 'x402 minimums response',\n );\n }\n\n async purchaseCreditsWithX402(\n params: PurchaseCreditsWithX402Params,\n ): Promise<X402PurchaseResult> {\n const { createPaymentClient, decodePaymentResponse } =\n await this.loadX402Dependencies();\n\n if (!Number.isFinite(params.credits) || params.credits <= 0) {\n throw new Error('credits must be a positive number');\n }\n if (\n params.usdAmount !== undefined &&\n (!Number.isFinite(params.usdAmount) || params.usdAmount <= 0)\n ) {\n throw new Error('usdAmount must be a positive number when provided');\n }\n\n const body: JsonObject = {\n accountId: params.accountId,\n credits: params.credits,\n };\n\n if (params.usdAmount !== undefined) {\n body.usdAmount = params.usdAmount;\n }\n if (params.description) {\n body.description = params.description;\n }\n if (params.metadata) {\n body.metadata = params.metadata;\n }\n\n const paymentClient = createPaymentClient(params.walletClient);\n\n const response = await paymentClient.post('/credits/purchase/x402', body);\n\n const parsed = this.parseWithSchema(\n response.data,\n x402CreditPurchaseResponseSchema,\n 'x402 credit purchase response',\n );\n\n const responseHeaders = response.headers ?? {};\n const paymentHeader =\n typeof responseHeaders['x-payment-response'] === 'string'\n ? responseHeaders['x-payment-response']\n : undefined;\n const decodedPayment =\n paymentHeader !== undefined\n ? decodePaymentResponse(paymentHeader)\n : undefined;\n\n return {\n ...parsed,\n paymentResponseHeader: paymentHeader,\n paymentResponse: decodedPayment,\n };\n }\n\n async buyCreditsWithX402(\n params: BuyCreditsWithX402Params,\n ): Promise<X402PurchaseResult> {\n const network: X402NetworkId = params.network ?? 'base';\n const { createX402Signer } = await this.loadX402Dependencies();\n const normalizedKey = normalizeHexPrivateKey(params.evmPrivateKey);\n const walletClient = await createX402Signer(network, normalizedKey);\n\n return this.purchaseCreditsWithX402({\n accountId: params.accountId,\n credits: params.credits,\n usdAmount: params.usdAmount,\n description: params.description,\n metadata: params.metadata,\n walletClient,\n });\n }\n\n private calculateHbarAmount(\n creditsToPurchase: number,\n creditsPerHbar: number,\n ): number {\n if (creditsPerHbar <= 0) {\n throw new Error('creditsPerHbar must be positive');\n }\n if (creditsToPurchase <= 0) {\n throw new Error('creditsToPurchase must be positive');\n }\n const rawHbar = creditsToPurchase / creditsPerHbar;\n const tinybars = Math.ceil(rawHbar * 1e8);\n return tinybars / 1e8;\n }\n\n private resolveCreditsToPurchase(shortfallCredits: number): number {\n if (!Number.isFinite(shortfallCredits) || shortfallCredits <= 0) {\n return 0;\n }\n return Math.max(\n Math.ceil(shortfallCredits),\n MINIMUM_REGISTRATION_AUTO_TOP_UP_CREDITS,\n );\n }\n\n private calculateHbarAmountParam(hbarAmount: number): number {\n const tinybars = Math.ceil(hbarAmount * 1e8);\n if (tinybars <= 0) {\n throw new Error('Calculated purchase amount must be positive');\n }\n return tinybars / 1e8;\n }\n\n private shouldAutoTopUpHistory(\n payload: CreateSessionRequestPayload,\n error: unknown,\n ): boolean {\n if (!this.historyAutoTopUp || payload.historyTtlSeconds === undefined) {\n return false;\n }\n if (!(error instanceof RegistryBrokerError)) {\n return false;\n }\n if (error.status !== 402) {\n return false;\n }\n const message = this.extractErrorMessage(error.body);\n if (!message) {\n return true;\n }\n const normalised = message.toLowerCase();\n return (\n normalised.includes('history') || normalised.includes('chat history')\n );\n }\n\n private extractErrorMessage(body: JsonValue): string | undefined {\n if (typeof body === 'string') {\n return body;\n }\n if (isJsonObject(body) && typeof body.error === 'string') {\n return body.error;\n }\n if (isJsonObject(body) && typeof body.message === 'string') {\n return body.message;\n }\n return undefined;\n }\n\n private async executeHistoryAutoTopUp(reason: string): Promise<void> {\n if (!this.historyAutoTopUp) {\n return;\n }\n const hbarAmount =\n this.historyAutoTopUp.hbarAmount && this.historyAutoTopUp.hbarAmount > 0\n ? this.historyAutoTopUp.hbarAmount\n : DEFAULT_HISTORY_TOP_UP_HBAR;\n await this.purchaseCreditsWithHbar({\n accountId: this.historyAutoTopUp.accountId,\n privateKey: this.historyAutoTopUp.privateKey,\n hbarAmount,\n memo:\n this.historyAutoTopUp.memo ??\n 'registry-broker-client:chat-history-topup',\n metadata: {\n purpose: 'chat-history',\n reason,\n },\n });\n }\n\n private async ensureCreditsForRegistration(\n payload: AgentRegistrationRequest,\n autoTopUp: RegisterAgentOptions['autoTopUp'],\n ): Promise<void> {\n const details = autoTopUp ?? null;\n if (!details) {\n return;\n }\n\n if (!details.accountId || !details.accountId.trim()) {\n throw new Error('autoTopUp.accountId is required');\n }\n\n if (!details.privateKey || !details.privateKey.trim()) {\n throw new Error('autoTopUp.privateKey is required');\n }\n\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const quote = await this.getRegistrationQuote(payload);\n const shortfall = quote.shortfallCredits ?? 0;\n if (shortfall <= 0) {\n return;\n }\n const creditsToPurchase = this.resolveCreditsToPurchase(shortfall);\n if (creditsToPurchase <= 0) {\n return;\n }\n\n const creditsPerHbar = quote.creditsPerHbar ?? null;\n if (!creditsPerHbar || creditsPerHbar <= 0) {\n throw new Error('Unable to determine credits per HBAR for auto top-up');\n }\n\n const hbarAmount = this.calculateHbarAmount(\n creditsToPurchase,\n creditsPerHbar,\n );\n\n await this.purchaseCreditsWithHbar({\n accountId: details.accountId.trim(),\n privateKey: details.privateKey.trim(),\n hbarAmount,\n memo: details.memo ?? 'Registry Broker auto top-up',\n metadata: {\n shortfallCredits: shortfall,\n requiredCredits: quote.requiredCredits,\n purchasedCredits: creditsToPurchase,\n },\n });\n }\n\n const finalQuote = await this.getRegistrationQuote(payload);\n if ((finalQuote.shortfallCredits ?? 0) > 0) {\n throw new Error('Unable to purchase sufficient credits for registration');\n }\n }\n\n private extractInsufficientCreditsDetails(error: unknown): {\n shortfallCredits: number;\n } | null {\n if (!(error instanceof RegistryBrokerError) || error.status !== 402) {\n return null;\n }\n\n const body = error.body;\n if (!body || typeof body !== 'object' || Array.isArray(body)) {\n return null;\n }\n\n const maybeShortfall = (body as JsonObject)['shortfallCredits'];\n if (typeof maybeShortfall !== 'number' || maybeShortfall <= 0) {\n return null;\n }\n\n return { shortfallCredits: maybeShortfall };\n }\n\n async createLedgerChallenge(\n payload: LedgerChallengeRequest,\n ): Promise<LedgerChallengeResponse> {\n const resolvedNetwork = canonicalizeLedgerNetwork(payload.network);\n const network =\n resolvedNetwork.kind === 'hedera'\n ? (resolvedNetwork.hederaNetwork ?? resolvedNetwork.canonical)\n : resolvedNetwork.canonical;\n const raw = await this.requestJson<JsonValue>('/auth/ledger/challenge', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: {\n accountId: payload.accountId,\n network,\n },\n });\n\n return this.parseWithSchema(\n raw,\n ledgerChallengeResponseSchema,\n 'ledger challenge response',\n );\n }\n\n async verifyLedgerChallenge(\n payload: LedgerVerifyRequest,\n ): Promise<LedgerVerifyResponse> {\n const resolvedNetwork = canonicalizeLedgerNetwork(payload.network);\n const network =\n resolvedNetwork.kind === 'hedera'\n ? (resolvedNetwork.hederaNetwork ?? resolvedNetwork.canonical)\n : resolvedNetwork.canonical;\n const body: JsonObject = {\n challengeId: payload.challengeId,\n accountId: payload.accountId,\n network,\n signature: payload.signature,\n };\n\n if (payload.signatureKind) {\n body.signatureKind = payload.signatureKind;\n }\n if (payload.publicKey) {\n body.publicKey = payload.publicKey;\n }\n if (typeof payload.expiresInMinutes === 'number') {\n body.expiresInMinutes = payload.expiresInMinutes;\n }\n\n const raw = await this.requestJson<JsonValue>('/auth/ledger/verify', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body,\n });\n\n const result = this.parseWithSchema(\n raw,\n ledgerVerifyResponseSchema,\n 'ledger verification response',\n );\n\n this.setLedgerApiKey(result.key);\n return result;\n }\n\n async authenticateWithLedger(\n options: LedgerAuthenticationOptions,\n ): Promise<LedgerVerifyResponse> {\n const challenge = await this.createLedgerChallenge({\n accountId: options.accountId,\n network: options.network,\n });\n const signed = await this.resolveLedgerAuthSignature(\n challenge.message,\n options,\n );\n const verification = await this.verifyLedgerChallenge({\n challengeId: challenge.challengeId,\n accountId: options.accountId,\n network: options.network,\n signature: signed.signature,\n signatureKind: signed.signatureKind,\n publicKey: signed.publicKey,\n expiresInMinutes: options.expiresInMinutes,\n });\n return verification;\n }\n\n private async resolveLedgerAuthSignature(\n message: string,\n options: LedgerAuthenticationOptions,\n ): Promise<LedgerAuthenticationSignerResult> {\n if (typeof options.sign === 'function') {\n const result = await options.sign(message);\n if (\n !result ||\n typeof result.signature !== 'string' ||\n result.signature.length === 0\n ) {\n throw new Error('Custom ledger signer failed to produce a signature.');\n }\n return result;\n }\n\n if (!options.signer || typeof options.signer.sign !== 'function') {\n throw new Error(\n 'Ledger authentication requires a Hedera Signer or custom sign function.',\n );\n }\n\n const payload = Buffer.from(message, 'utf8');\n const signatures: SignerSignature[] = await options.signer.sign([payload]);\n const signatureEntry = signatures?.[0];\n if (!signatureEntry) {\n throw new Error('Signer did not return any signatures.');\n }\n\n let derivedPublicKey: string | undefined;\n if (signatureEntry.publicKey) {\n derivedPublicKey = signatureEntry.publicKey.toString();\n } else if (typeof options.signer.getAccountKey === 'function') {\n const accountKey = await options.signer.getAccountKey();\n if (accountKey && typeof accountKey.toString === 'function') {\n derivedPublicKey = accountKey.toString();\n }\n }\n\n return {\n signature: Buffer.from(signatureEntry.signature).toString('base64'),\n signatureKind: 'raw',\n publicKey: derivedPublicKey,\n };\n }\n\n async authenticateWithLedgerCredentials(\n options: LedgerCredentialAuthOptions,\n ): Promise<LedgerVerifyResponse> {\n const {\n accountId,\n network,\n signer,\n sign,\n hederaPrivateKey,\n evmPrivateKey,\n expiresInMinutes,\n setAccountHeader = true,\n label,\n logger,\n } = options;\n\n const resolvedNetwork = canonicalizeLedgerNetwork(network);\n const labelSuffix = label ? ` for ${label}` : '';\n\n const networkPayload = resolvedNetwork.canonical;\n\n const authOptions: LedgerAuthenticationOptions = {\n accountId,\n network: networkPayload,\n expiresInMinutes,\n };\n\n if (sign) {\n authOptions.sign = sign;\n } else if (signer) {\n authOptions.signer = signer;\n } else if (hederaPrivateKey) {\n if (resolvedNetwork.kind !== 'hedera' || !resolvedNetwork.hederaNetwork) {\n throw new Error(\n 'hederaPrivateKey can only be used with hedera:mainnet or hedera:testnet networks.',\n );\n }\n authOptions.signer = createPrivateKeySigner({\n accountId,\n privateKey: hederaPrivateKey,\n network: resolvedNetwork.hederaNetwork,\n });\n } else if (evmPrivateKey) {\n if (resolvedNetwork.kind !== 'evm') {\n throw new Error(\n 'evmPrivateKey can only be used with CAIP-2 EVM networks (eip155:<chainId>).',\n );\n }\n const formattedKey = evmPrivateKey.startsWith('0x')\n ? (evmPrivateKey as `0x${string}`)\n : (`0x${evmPrivateKey}` as `0x${string}`);\n const account = await this.loadViemAccount(formattedKey);\n authOptions.sign = async message => ({\n signature: await account.signMessage({ message }),\n signatureKind: 'evm',\n publicKey: account.publicKey,\n });\n } else {\n throw new Error(\n 'Provide a signer, sign function, hederaPrivateKey, or evmPrivateKey to authenticate with the ledger.',\n );\n }\n\n logger?.info?.(\n `Authenticating ledger account ${accountId} (${resolvedNetwork.canonical})${labelSuffix}...`,\n );\n const verification = await this.authenticateWithLedger(authOptions);\n if (setAccountHeader) {\n this.setDefaultHeader('x-account-id', verification.accountId);\n }\n logger?.info?.(\n `Ledger authentication complete${labelSuffix}. Issued key prefix: ${verification.apiKey.prefix}…${verification.apiKey.lastFour}`,\n );\n return verification;\n }\n\n async listProtocols(): Promise<ProtocolsResponse> {\n const raw = await this.requestJson<JsonValue>('/protocols', {\n method: 'GET',\n });\n return this.parseWithSchema(\n raw,\n protocolsResponseSchema,\n 'protocols response',\n );\n }\n\n async detectProtocol(\n message: ProtocolDetectionMessage,\n ): Promise<DetectProtocolResponse> {\n const raw = await this.requestJson<JsonValue>('/detect-protocol', {\n method: 'POST',\n body: { message },\n headers: { 'content-type': 'application/json' },\n });\n return this.parseWithSchema(\n raw,\n detectProtocolResponseSchema,\n 'detect protocol response',\n );\n }\n\n async registrySearchByNamespace(\n registry: string,\n query?: string,\n ): Promise<RegistrySearchByNamespaceResponse> {\n const params = new URLSearchParams();\n if (query) {\n params.set('q', query);\n }\n const suffix = params.size > 0 ? `?${params.toString()}` : '';\n const raw = await this.requestJson<JsonValue>(\n `/registries/${encodeURIComponent(registry)}/search${suffix}`,\n {\n method: 'GET',\n },\n );\n return this.parseWithSchema(\n raw,\n registrySearchByNamespaceSchema,\n 'registry search response',\n );\n }\n\n async vectorSearch(\n request: VectorSearchRequest,\n ): Promise<VectorSearchResponse> {\n try {\n const raw = await this.requestJson<JsonValue>('/search', {\n method: 'POST',\n body: request,\n headers: { 'content-type': 'application/json' },\n });\n return this.parseWithSchema(\n raw,\n vectorSearchResponseSchema,\n 'vector search response',\n );\n } catch (error) {\n if (error instanceof RegistryBrokerError && error.status === 501) {\n const fallback = await this.search(\n this.buildVectorFallbackSearchParams(request),\n );\n return this.convertSearchResultToVectorResponse(fallback);\n }\n throw error;\n }\n }\n\n async searchStatus(): Promise<SearchStatusResponse> {\n const raw = await this.requestJson<JsonValue>('/search/status', {\n method: 'GET',\n });\n return this.parseWithSchema(\n raw,\n searchStatusResponseSchema,\n 'search status response',\n );\n }\n\n async adaptersDetailed(): Promise<AdapterDetailsResponse> {\n const raw = await this.requestJson<JsonValue>('/adapters/details', {\n method: 'GET',\n });\n return this.parseWithSchema(\n raw,\n adapterDetailsResponseSchema,\n 'adapter details response',\n );\n }\n\n async websocketStats(): Promise<WebsocketStatsResponse> {\n const raw = await this.requestJson<JsonValue>('/websocket/stats', {\n method: 'GET',\n });\n return this.parseWithSchema(\n raw,\n websocketStatsResponseSchema,\n 'websocket stats response',\n );\n }\n\n async metricsSummary(): Promise<MetricsSummaryResponse> {\n const raw = await this.requestJson<JsonValue>('/metrics', {\n method: 'GET',\n });\n return this.parseWithSchema(\n raw,\n metricsSummaryResponseSchema,\n 'metrics summary response',\n );\n }\n\n async validateUaid(uaid: string): Promise<UaidValidationResponse> {\n const raw = await this.requestJson<JsonValue>(\n `/uaids/validate/${encodeURIComponent(uaid)}`,\n {\n method: 'GET',\n },\n );\n return this.parseWithSchema(\n raw,\n uaidValidationResponseSchema,\n 'UAID validation response',\n );\n }\n\n async getUaidConnectionStatus(uaid: string): Promise<UaidConnectionStatus> {\n const raw = await this.requestJson<JsonValue>(\n `/uaids/connections/${encodeURIComponent(uaid)}/status`,\n {\n method: 'GET',\n },\n );\n return this.parseWithSchema(\n raw,\n uaidConnectionStatusSchema,\n 'UAID connection status',\n );\n }\n\n async closeUaidConnection(uaid: string): Promise<void> {\n await this.request(`/uaids/connections/${encodeURIComponent(uaid)}`, {\n method: 'DELETE',\n });\n }\n\n async dashboardStats(): Promise<DashboardStatsResponse> {\n const raw = await this.requestJson<JsonValue>('/dashboard/stats', {\n method: 'GET',\n });\n return this.parseWithSchema(\n raw,\n dashboardStatsResponseSchema,\n 'dashboard stats response',\n );\n }\n\n async adapters(): Promise<AdaptersResponse> {\n const raw = await this.requestJson<JsonValue>('/adapters', {\n method: 'GET',\n });\n return this.parseWithSchema(\n raw,\n adaptersResponseSchema,\n 'adapters response',\n );\n }\n\n async facets(adapter?: string): Promise<SearchFacetsResponse> {\n const params = new URLSearchParams();\n if (adapter) {\n params.set('adapter', adapter);\n }\n const suffix = params.size > 0 ? `?${params.toString()}` : '';\n const raw = await this.requestJson<JsonValue>(`/search/facets${suffix}`, {\n method: 'GET',\n });\n return this.parseWithSchema(\n raw,\n searchFacetsResponseSchema,\n 'search facets response',\n );\n }\n\n private async createSession(\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 this.requestJson<JsonValue>('/chat/session', {\n method: 'POST',\n body,\n headers: { 'content-type': 'application/json' },\n });\n return this.parseWithSchema(\n raw,\n createSessionResponseSchema,\n 'chat session response',\n );\n } catch (error) {\n if (\n allowHistoryAutoTopUp &&\n this.shouldAutoTopUpHistory(payload, error)\n ) {\n await this.executeHistoryAutoTopUp('chat.session');\n return this.createSession(payload, false);\n }\n throw error;\n }\n }\n\n private async startChat(\n options: StartChatOptions,\n ): Promise<ChatConversationHandle> {\n if ('uaid' in options && options.uaid) {\n return this.startConversation({\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 this.createSession({\n agentUrl: options.agentUrl,\n auth: options.auth,\n historyTtlSeconds: options.historyTtlSeconds,\n senderUaid: options.senderUaid,\n });\n options.onSessionCreated?.(session.sessionId);\n return this.createPlaintextConversationHandle(\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\n private async startConversation(\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 this.createSession({\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 this.createPlaintextConversationHandle(\n session.sessionId,\n session.encryption ?? null,\n options.auth,\n { uaid: options.uaid },\n );\n }\n try {\n const handle = await this.encryptedChatManager.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 this.createPlaintextConversationHandle(\n error.sessionId,\n error.summary ?? null,\n options.auth,\n { uaid: options.uaid },\n );\n }\n throw error;\n }\n }\n\n private async acceptConversation(\n options: AcceptConversationOptions,\n ): Promise<ChatConversationHandle> {\n const preference = options.encryption?.preference ?? 'preferred';\n if (preference === 'disabled') {\n return this.createPlaintextConversationHandle(options.sessionId, null);\n }\n try {\n const handle = await this.encryptedChatManager.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 this.createPlaintextConversationHandle(\n options.sessionId,\n null,\n undefined,\n { uaid: options.responderUaid },\n );\n }\n throw error;\n }\n }\n\n private async fetchHistorySnapshot(\n sessionId: string,\n options?: ChatHistoryFetchOptions,\n ): Promise<ChatHistorySnapshotWithDecryptedEntries> {\n if (!sessionId || sessionId.trim().length === 0) {\n throw new Error('sessionId is required to fetch chat history');\n }\n const raw = await this.requestJson<JsonValue>(\n `/chat/session/${encodeURIComponent(sessionId)}/history`,\n {\n method: 'GET',\n },\n );\n const snapshot = this.parseWithSchema(\n raw,\n chatHistorySnapshotResponseSchema,\n 'chat history snapshot response',\n );\n return this.attachDecryptedHistory(sessionId, snapshot, options);\n }\n\n private attachDecryptedHistory(\n sessionId: string,\n snapshot: ChatHistorySnapshotResponse,\n options?: ChatHistoryFetchOptions,\n ): ChatHistorySnapshotWithDecryptedEntries {\n const shouldDecrypt =\n options?.decrypt !== undefined\n ? options.decrypt\n : this.encryptionOptions?.autoDecryptHistory === true;\n if (!shouldDecrypt) {\n return snapshot;\n }\n const context = this.resolveDecryptionContext(sessionId, options);\n if (!context) {\n throw new Error(\n 'Unable to decrypt chat history: encryption context unavailable',\n );\n }\n const decryptedHistory = snapshot.history.map(entry => ({\n entry,\n plaintext: this.decryptHistoryEntryFromContext(sessionId, entry, context),\n }));\n return { ...snapshot, decryptedHistory };\n }\n\n private registerConversationContext(context: ConversationContextInput): void {\n const normalized: ConversationContextState = {\n sessionId: context.sessionId,\n sharedSecret: Buffer.from(context.sharedSecret),\n identity: context.identity ? { ...context.identity } : undefined,\n };\n const entries = this.conversationContexts.get(context.sessionId) ?? [];\n const existingIndex = entries.findIndex(existing =>\n this.identitiesMatch(existing.identity, normalized.identity),\n );\n if (existingIndex >= 0) {\n entries[existingIndex] = normalized;\n } else {\n entries.push(normalized);\n }\n this.conversationContexts.set(context.sessionId, entries);\n }\n\n // Exposed for EncryptedChatManager to persist decryption context\n registerConversationContextForEncryption(\n context: ConversationContextInput,\n ): void {\n this.registerConversationContext(context);\n }\n\n private resolveDecryptionContext(\n sessionId: string,\n options?: ChatHistoryFetchOptions,\n ): ConversationContextState | null {\n if (options?.sharedSecret) {\n return {\n sessionId,\n sharedSecret: this.normalizeSharedSecret(options.sharedSecret),\n identity: options.identity,\n };\n }\n const contexts = this.conversationContexts.get(sessionId);\n if (!contexts || contexts.length === 0) {\n return null;\n }\n if (options?.identity) {\n const match = contexts.find(context =>\n this.identitiesMatch(context.identity, options.identity),\n );\n if (match) {\n return match;\n }\n }\n return contexts[0];\n }\n\n private decryptHistoryEntryFromContext(\n sessionId: string,\n entry: ChatHistoryEntry,\n context: ConversationContextState,\n ): string | null {\n const envelope = entry.cipherEnvelope;\n if (!envelope) {\n return entry.content;\n }\n const secret = Buffer.from(context.sharedSecret);\n try {\n return this.encryption.decryptCipherEnvelope({\n envelope,\n sharedSecret: secret,\n });\n } catch (_error) {\n return null;\n }\n }\n\n private identitiesMatch(\n a?: RecipientIdentity,\n b?: RecipientIdentity,\n ): boolean {\n if (!a && !b) {\n return true;\n }\n if (!a || !b) {\n return false;\n }\n if (a.uaid && b.uaid && a.uaid.toLowerCase() === b.uaid.toLowerCase()) {\n return true;\n }\n if (\n a.ledgerAccountId &&\n b.ledgerAccountId &&\n a.ledgerAccountId.toLowerCase() === b.ledgerAccountId.toLowerCase()\n ) {\n return true;\n }\n if (a.userId && b.userId && a.userId === b.userId) {\n return true;\n }\n if (a.email && b.email && a.email.toLowerCase() === b.email.toLowerCase()) {\n return true;\n }\n return false;\n }\n\n private identityMatchesRecipient(\n recipient: CipherEnvelopeRecipient,\n identity: RecipientIdentity,\n ): boolean {\n if (\n identity.uaid &&\n recipient.uaid?.toLowerCase() === identity.uaid.toLowerCase()\n ) {\n return true;\n }\n if (\n identity.ledgerAccountId &&\n recipient.ledgerAccountId?.toLowerCase() ===\n identity.ledgerAccountId.toLowerCase()\n ) {\n return true;\n }\n if (identity.userId && recipient.userId === identity.userId) {\n return true;\n }\n if (\n identity.email &&\n recipient.email?.toLowerCase() === identity.email.toLowerCase()\n ) {\n return true;\n }\n return false;\n }\n\n private createPlaintextConversationHandle(\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 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 this.sendMessage({\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 };\n }\n\n private async compactHistory(\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 this.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 this.parseWithSchema(\n raw,\n chatHistoryCompactionResponseSchema,\n 'chat history compaction response',\n );\n }\n\n private async fetchEncryptionStatus(\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 this.requestJson<JsonValue>(\n `/chat/session/${encodeURIComponent(sessionId)}/encryption`,\n {\n method: 'GET',\n },\n );\n return this.parseWithSchema(\n raw,\n sessionEncryptionStatusResponseSchema,\n 'session encryption status response',\n );\n }\n\n private async postEncryptionHandshake(\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 this.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 = this.parseWithSchema(\n raw,\n encryptionHandshakeResponseSchema,\n 'encryption handshake response',\n );\n return response.handshake;\n }\n\n private async registerEncryptionKey(\n payload: RegisterEncryptionKeyPayload,\n ): Promise<RegisterEncryptionKeyResponse> {\n const raw = await this.requestJson<JsonValue>('/encryption/keys', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: payload,\n });\n return this.parseWithSchema(\n raw,\n registerEncryptionKeyResponseSchema,\n 'register encryption key response',\n );\n }\n\n private async sendMessage(\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 = this.encryption.encryptCipherEnvelope({\n ...payload.encryption,\n sessionId: sessionIdForEncryption,\n });\n }\n if (cipherEnvelope) {\n body.cipherEnvelope = cipherEnvelope as JsonObject;\n }\n delete body.encryption;\n\n const raw = await this.requestJson<JsonValue>('/chat/message', {\n method: 'POST',\n body,\n headers: { 'content-type': 'application/json' },\n });\n return this.parseWithSchema(\n raw,\n sendMessageResponseSchema,\n 'chat message response',\n );\n }\n\n private async endSession(sessionId: string): Promise<void> {\n await this.request(`/chat/session/${encodeURIComponent(sessionId)}`, {\n method: 'DELETE',\n });\n }\n\n async generateEncryptionKeyPair(\n options: GenerateEncryptionKeyPairOptions = {},\n ): Promise<{\n privateKey: string;\n publicKey: string;\n envPath?: string;\n envVar: string;\n }> {\n this.assertNodeRuntime('generateEncryptionKeyPair');\n\n const keyType = options.keyType ?? 'secp256k1';\n if (keyType !== 'secp256k1') {\n throw new Error('Only secp256k1 key generation is supported currently');\n }\n\n const privateKeyBytes = randomBytes(32);\n const privateKey = Buffer.from(privateKeyBytes).toString('hex');\n const publicKeyBytes = secp256k1.getPublicKey(privateKeyBytes, true);\n const publicKey = Buffer.from(publicKeyBytes).toString('hex');\n\n const envVar = options.envVar ?? 'RB_ENCRYPTION_PRIVATE_KEY';\n const resolvedPath = options.envPath\n ? path.resolve(options.envPath)\n : undefined;\n\n if (resolvedPath) {\n const fsModule = await getFs();\n\n if (!fsModule) {\n throw new Error(\n 'File system module is not available; cannot write encryption key env file',\n );\n }\n\n const envLine = `${envVar}=${privateKey}`;\n if (fsModule.existsSync(resolvedPath)) {\n const content = fsModule.readFileSync(resolvedPath, 'utf-8');\n const lineRegex = new RegExp(`^${envVar}=.*$`, 'm');\n if (lineRegex.test(content)) {\n if (!options.overwrite) {\n throw new Error(\n `${envVar} already exists in ${resolvedPath}; set overwrite=true to replace it`,\n );\n }\n const updated = content.replace(lineRegex, envLine);\n fsModule.writeFileSync(resolvedPath, updated);\n } else {\n const needsNewline = !content.endsWith('\\n');\n fsModule.appendFileSync(\n resolvedPath,\n `${needsNewline ? '\\n' : ''}${envLine}\\n`,\n );\n }\n } else {\n fsModule.writeFileSync(resolvedPath, `${envLine}\\n`);\n }\n }\n\n return {\n privateKey,\n publicKey,\n envPath: resolvedPath,\n envVar,\n };\n }\n\n private buildUrl(path: string): string {\n const normalisedPath = path.startsWith('/') ? path : `/${path}`;\n return `${this.baseUrl}${normalisedPath}`;\n }\n\n private buildVectorFallbackSearchParams(\n request: VectorSearchRequest,\n ): SearchParams {\n const params: SearchParams = {\n q: request.query,\n };\n let effectiveLimit: number | undefined;\n if (typeof request.limit === 'number' && Number.isFinite(request.limit)) {\n effectiveLimit = request.limit;\n params.limit = request.limit;\n }\n if (\n typeof request.offset === 'number' &&\n Number.isFinite(request.offset) &&\n request.offset > 0\n ) {\n const limit = effectiveLimit && effectiveLimit > 0 ? effectiveLimit : 20;\n params.limit = limit;\n params.page = Math.floor(request.offset / limit) + 1;\n }\n if (request.filter?.registry) {\n params.registry = request.filter.registry;\n }\n if (request.filter?.protocols?.length) {\n params.protocols = [...request.filter.protocols];\n }\n if (request.filter?.adapter?.length) {\n params.adapters = [...request.filter.adapter];\n }\n if (request.filter?.capabilities?.length) {\n params.capabilities = request.filter.capabilities.map(value =>\n typeof value === 'number' ? value.toString(10) : value,\n );\n }\n if (request.filter?.type) {\n params.type = request.filter.type;\n }\n return params;\n }\n\n private convertSearchResultToVectorResponse(\n result: SearchResult,\n ): VectorSearchResponse {\n const hits = result.hits.map(agent => ({\n agent,\n score: 0,\n highlights: {},\n }));\n const total = result.total;\n const limit = result.limit;\n const page = result.page;\n const totalVisible = page * limit;\n const limited = total > totalVisible || page > 1;\n\n return {\n hits,\n total,\n took: 0,\n totalAvailable: total,\n visible: hits.length,\n limited,\n credits_used: 0,\n };\n }\n\n private request = async (\n path: string,\n config: RequestConfig,\n ): Promise<Response> => {\n const headers = new Headers();\n Object.entries(this.defaultHeaders).forEach(([key, value]) => {\n headers.set(key, value);\n });\n if (config.headers) {\n Object.entries(config.headers).forEach(([key, value]) => {\n headers.set(key, value);\n });\n }\n if (!headers.has('accept')) {\n headers.set('accept', 'application/json');\n }\n if (!headers.has('user-agent') && !isBrowserRuntime()) {\n headers.set('user-agent', DEFAULT_USER_AGENT);\n }\n\n const init: RequestInit = {\n method: config.method ?? 'GET',\n headers,\n };\n\n if (config.body !== undefined) {\n init.body = JSON.stringify(config.body);\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/json');\n }\n }\n\n const response = await this.fetchImpl(this.buildUrl(path), init);\n if (response.ok) {\n return response;\n }\n const errorBody = await this.extractErrorBody(response);\n throw new RegistryBrokerError('Registry broker request failed', {\n status: response.status,\n statusText: response.statusText,\n body: errorBody,\n });\n };\n\n private async delay(ms: number, signal?: AbortSignal): Promise<void> {\n if (ms <= 0) {\n if (signal?.aborted) {\n throw createAbortError();\n }\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n if (signal) {\n signal.removeEventListener('abort', onAbort);\n }\n resolve();\n }, ms);\n\n const onAbort = (): void => {\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n reject(createAbortError());\n };\n\n if (signal) {\n if (signal.aborted) {\n clearTimeout(timer);\n reject(createAbortError());\n return;\n }\n signal.addEventListener('abort', onAbort, { once: true });\n }\n });\n }\n\n private async requestJson<T extends JsonValue = JsonValue>(\n path: string,\n config: RequestConfig,\n ): Promise<T> {\n const response = await this.request(path, config);\n const contentType = response.headers?.get('content-type') ?? '';\n if (!JSON_CONTENT_TYPE.test(contentType)) {\n const body = await response.text();\n throw new RegistryBrokerParseError(\n 'Expected JSON response from registry broker',\n body,\n );\n }\n return (await response.json()) as T;\n }\n\n private async extractErrorBody(response: Response): Promise<JsonValue> {\n const contentType = response.headers?.get('content-type') ?? '';\n if (JSON_CONTENT_TYPE.test(contentType)) {\n try {\n return (await response.json()) as JsonValue;\n } catch (error) {\n return { parseError: String(error) };\n }\n }\n try {\n return await response.text();\n } catch (error) {\n return { parseError: String(error) };\n }\n }\n\n private parseWithSchema<T>(\n value: JsonValue,\n schema: z.ZodSchema<T>,\n context: string,\n ): T {\n try {\n return schema.parse(value);\n } catch (error) {\n throw new RegistryBrokerParseError(\n `Failed to parse ${context}`,\n error instanceof ZodError || error instanceof Error\n ? error\n : String(error),\n value,\n );\n }\n }\n\n private assertNodeRuntime(feature: string): void {\n if (typeof process === 'undefined' || !process.versions?.node) {\n throw new Error(`${feature} is only available in Node.js environments`);\n }\n }\n\n private createEphemeralKeyPair(): EphemeralKeyPair {\n this.assertNodeRuntime('generateEphemeralKeyPair');\n const privateKeyBytes = randomBytes(32);\n const publicKey = secp256k1.getPublicKey(privateKeyBytes, true);\n return {\n privateKey: Buffer.from(privateKeyBytes).toString('hex'),\n publicKey: Buffer.from(publicKey).toString('hex'),\n };\n }\n\n private deriveSharedSecret(options: DeriveSharedSecretOptions): Buffer {\n this.assertNodeRuntime('deriveSharedSecret');\n const privateKey = this.hexToBuffer(options.privateKey);\n const peerPublicKey = this.hexToBuffer(options.peerPublicKey);\n const shared = secp256k1.getSharedSecret(privateKey, peerPublicKey, true);\n return createHash('sha256').update(Buffer.from(shared)).digest();\n }\n\n private buildCipherEnvelope(\n options: EncryptCipherEnvelopeOptions,\n ): CipherEnvelope {\n this.assertNodeRuntime('encryptCipherEnvelope');\n const sharedSecret = this.normalizeSharedSecret(options.sharedSecret);\n const iv = randomBytes(12);\n const cipher = createCipheriv('aes-256-gcm', sharedSecret, iv);\n const aadSource = options.associatedData ?? options.sessionId;\n const associatedDataEncoded = aadSource\n ? Buffer.from(aadSource, 'utf8').toString('base64')\n : undefined;\n if (aadSource) {\n cipher.setAAD(Buffer.from(aadSource, 'utf8'));\n }\n const ciphertext = Buffer.concat([\n cipher.update(Buffer.from(options.plaintext, 'utf8')),\n cipher.final(),\n ]);\n const tag = cipher.getAuthTag();\n const payload = Buffer.concat([ciphertext, tag]);\n\n return {\n algorithm: 'aes-256-gcm',\n ciphertext: payload.toString('base64'),\n nonce: iv.toString('base64'),\n associatedData: associatedDataEncoded,\n keyLocator: {\n sessionId: options.sessionId,\n revision: options.revision ?? 1,\n },\n recipients: options.recipients.map(recipient => ({\n ...recipient,\n encryptedShare: '',\n })),\n };\n }\n\n private openCipherEnvelope(options: DecryptCipherEnvelopeOptions): string {\n this.assertNodeRuntime('decryptCipherEnvelope');\n const sharedSecret = this.normalizeSharedSecret(options.sharedSecret);\n const payload = Buffer.from(options.envelope.ciphertext, 'base64');\n const nonce = Buffer.from(options.envelope.nonce, 'base64');\n const ciphertext = payload.slice(0, payload.length - 16);\n const tag = payload.slice(payload.length - 16);\n const decipher = createDecipheriv('aes-256-gcm', sharedSecret, nonce);\n if (options.envelope.associatedData) {\n decipher.setAAD(Buffer.from(options.envelope.associatedData, 'base64'));\n }\n decipher.setAuthTag(tag);\n const plaintext = Buffer.concat([\n decipher.update(ciphertext),\n decipher.final(),\n ]);\n return plaintext.toString(options.encoding ?? 'utf8');\n }\n\n private normalizeSharedSecret(input: SharedSecretInput): Buffer {\n if (Buffer.isBuffer(input)) {\n return Buffer.from(input);\n }\n if (input instanceof Uint8Array) {\n return Buffer.from(input);\n }\n if (typeof input === 'string') {\n return this.bufferFromString(input);\n }\n throw new Error('Unsupported shared secret input');\n }\n\n private bufferFromString(value: string): Buffer {\n const trimmed = value.trim();\n if (!trimmed) {\n throw new Error('sharedSecret string cannot be empty');\n }\n const normalized = trimmed.startsWith('0x') ? trimmed.slice(2) : trimmed;\n if (/^[0-9a-fA-F]+$/.test(normalized) && normalized.length % 2 === 0) {\n return Buffer.from(normalized, 'hex');\n }\n return Buffer.from(trimmed, 'base64');\n }\n\n private hexToBuffer(value: string): Uint8Array {\n const normalized = value.startsWith('0x') ? value.slice(2) : value;\n if (!/^[0-9a-fA-F]+$/.test(normalized) || normalized.length % 2 !== 0) {\n throw new Error('Expected hex-encoded value');\n }\n return Buffer.from(normalized, 'hex');\n }\n}\n\nexport const isPendingRegisterAgentResponse = (\n response: RegisterAgentResponse,\n): response is RegisterAgentPendingResponse => response.status === 'pending';\n\nexport const isPartialRegisterAgentResponse = (\n response: RegisterAgentResponse,\n): response is RegisterAgentPartialResponse =>\n response.status === 'partial' && response.success === false;\n\nexport const isSuccessRegisterAgentResponse = (\n response: RegisterAgentResponse,\n): response is RegisterAgentSuccessResponse =>\n response.success === true && response.status !== 'pending';\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\ninterface ConversationContextState {\n sessionId: string;\n sharedSecret: Buffer;\n identity?: RecipientIdentity;\n}\n\nclass EncryptedChatManager {\n constructor(private readonly client: RegistryBrokerClient) {}\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 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: entry =>\n this.decryptEntry(entry, context.identity, sharedSecret),\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\nclass 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"],"names":["path","options"],"mappings":"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"}
@@ -1,90 +1,70 @@
1
- const normalise = (value) => value.trim().toLowerCase();
2
- const HEDERA_NETWORK_ALIASES = /* @__PURE__ */ new Map([
3
- ["hedera:mainnet", { canonical: "hedera:mainnet", hederaNetwork: "mainnet" }],
4
- ["mainnet", { canonical: "hedera:mainnet", hederaNetwork: "mainnet" }],
5
- ["hedera-mainnet", { canonical: "hedera:mainnet", hederaNetwork: "mainnet" }],
6
- ["hedera_mainnet", { canonical: "hedera:mainnet", hederaNetwork: "mainnet" }],
7
- ["hedera:testnet", { canonical: "hedera:testnet", hederaNetwork: "testnet" }],
8
- ["testnet", { canonical: "hedera:testnet", hederaNetwork: "testnet" }],
9
- ["hedera-testnet", { canonical: "hedera:testnet", hederaNetwork: "testnet" }],
10
- ["hedera_testnet", { canonical: "hedera:testnet", hederaNetwork: "testnet" }]
11
- ]);
12
- const EVM_NETWORK_CHAIN_IDS = {
13
- abstract: 2741,
14
- "abstract-testnet": 11124,
15
- base: 8453,
16
- "base-sepolia": 84532,
17
- avalanche: 43114,
18
- "avalanche-fuji": 43113,
19
- iotex: 4689,
20
- sei: 1329,
21
- "sei-testnet": 1328,
22
- polygon: 137,
23
- "polygon-amoy": 80002,
24
- peaq: 3338
25
- };
26
- const CHAIN_ID_TO_ALIAS = new Map(
27
- Object.entries(EVM_NETWORK_CHAIN_IDS).map(([alias, id]) => [id, alias])
28
- );
29
- const parseChainId = (value) => {
30
- if (/^eip155:\d+$/i.test(value)) {
31
- return Number.parseInt(value.split(":")[1], 10);
32
- }
33
- if (/^\d+$/.test(value)) {
34
- return Number.parseInt(value, 10);
35
- }
36
- return void 0;
37
- };
38
- const normaliseEvmNetwork = (value) => {
39
- const trimmed = normalise(value);
40
- let chainId = parseChainId(trimmed);
41
- let alias;
42
- if (chainId === void 0) {
43
- const mapped = EVM_NETWORK_CHAIN_IDS[trimmed];
44
- if (mapped !== void 0) {
45
- chainId = mapped;
46
- alias = trimmed;
47
- }
48
- } else if (CHAIN_ID_TO_ALIAS.has(chainId)) {
49
- alias = CHAIN_ID_TO_ALIAS.get(chainId);
1
+ import { optionalImportSync } from "./standards-sdk.es135.js";
2
+ const unsupported = (method) => new Error(`${method} is not supported by the in-memory signer`);
3
+ const createPrivateKeySigner = (options) => {
4
+ const sdk = loadHashgraphSdk();
5
+ const { AccountId, LedgerId, PrivateKey, SignerSignature } = sdk;
6
+ if (!options.privateKey) {
7
+ throw new Error("privateKey is required to create a ledger signer.");
50
8
  }
51
- if (chainId === void 0) {
52
- throw new Error(
53
- 'Unsupported EVM ledger network. Provide an alias like "base-sepolia" or a canonical eip155:<chainId> string.'
54
- );
9
+ if (!options.accountId) {
10
+ throw new Error("accountId is required to create a ledger signer.");
55
11
  }
12
+ const accountId = AccountId.fromString(options.accountId);
13
+ const privateKey = PrivateKey.fromString(options.privateKey);
14
+ const ledgerId = LedgerId.fromString(options.network);
56
15
  return {
57
- canonical: `eip155:${chainId}`,
58
- kind: "evm",
59
- chainId,
60
- legacyName: alias
61
- };
62
- };
63
- const normaliseHederaNetwork = (value) => {
64
- const trimmed = normalise(value);
65
- const mapping = HEDERA_NETWORK_ALIASES.get(trimmed);
66
- if (!mapping) {
67
- throw new Error(
68
- 'Unsupported Hedera network. Use hedera:mainnet or hedera:testnet (legacy "mainnet"/"testnet" also accepted).'
69
- );
70
- }
71
- return {
72
- canonical: mapping.canonical,
73
- kind: "hedera",
74
- hederaNetwork: mapping.hederaNetwork
16
+ getLedgerId: () => ledgerId,
17
+ getAccountId: () => accountId,
18
+ getAccountKey: () => privateKey.publicKey,
19
+ getNetwork: () => ({}),
20
+ getMirrorNetwork: () => [],
21
+ sign: async (messages) => Promise.all(
22
+ messages.map(async (message) => {
23
+ const signature = await privateKey.sign(message);
24
+ return new SignerSignature({
25
+ publicKey: privateKey.publicKey,
26
+ signature,
27
+ accountId
28
+ });
29
+ })
30
+ ),
31
+ getAccountBalance: async () => {
32
+ throw unsupported("getAccountBalance");
33
+ },
34
+ getAccountInfo: async () => {
35
+ throw unsupported("getAccountInfo");
36
+ },
37
+ getAccountRecords: async () => {
38
+ throw unsupported("getAccountRecords");
39
+ },
40
+ signTransaction: async (_) => {
41
+ throw unsupported("signTransaction");
42
+ },
43
+ checkTransaction: async (_) => {
44
+ throw unsupported("checkTransaction");
45
+ },
46
+ populateTransaction: async (_) => {
47
+ throw unsupported("populateTransaction");
48
+ },
49
+ call: async (_request) => {
50
+ throw unsupported("call");
51
+ }
75
52
  };
76
53
  };
77
- const canonicalizeLedgerNetwork = (network) => {
78
- if (typeof network !== "string" || network.trim().length === 0) {
79
- throw new Error("Ledger network is required.");
54
+ let cachedSdk = null;
55
+ const loadHashgraphSdk = () => {
56
+ if (cachedSdk) {
57
+ return cachedSdk;
80
58
  }
81
- const trimmed = normalise(network);
82
- if (trimmed.startsWith("hedera:") || trimmed.includes("hedera-") || trimmed.includes("hedera_") || trimmed === "mainnet" || trimmed === "testnet") {
83
- return normaliseHederaNetwork(trimmed);
59
+ const resolved = optionalImportSync("@hashgraph/sdk");
60
+ if (!resolved) {
61
+ const message = "@hashgraph/sdk is required for ledger signing. Install it as a dependency to enable createPrivateKeySigner.";
62
+ throw new Error(message);
84
63
  }
85
- return normaliseEvmNetwork(trimmed);
64
+ cachedSdk = resolved;
65
+ return resolved;
86
66
  };
87
67
  export {
88
- canonicalizeLedgerNetwork
68
+ createPrivateKeySigner
89
69
  };
90
70
  //# sourceMappingURL=standards-sdk.es129.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es129.js","sources":["../../src/services/registry-broker/ledger-network.ts"],"sourcesContent":["type HederaNetwork = 'mainnet' | 'testnet';\ntype LedgerNetworkKind = 'hedera' | 'evm';\n\nexport interface CanonicalLedgerNetwork {\n canonical: string;\n kind: LedgerNetworkKind;\n hederaNetwork?: HederaNetwork;\n chainId?: number;\n legacyName?: string;\n}\n\nconst normalise = (value: string): string => value.trim().toLowerCase();\n\nconst HEDERA_NETWORK_ALIASES = new Map<\n string,\n { canonical: `hedera:${HederaNetwork}`; hederaNetwork: HederaNetwork }\n>([\n ['hedera:mainnet', { canonical: 'hedera:mainnet', hederaNetwork: 'mainnet' }],\n ['mainnet', { canonical: 'hedera:mainnet', hederaNetwork: 'mainnet' }],\n ['hedera-mainnet', { canonical: 'hedera:mainnet', hederaNetwork: 'mainnet' }],\n ['hedera_mainnet', { canonical: 'hedera:mainnet', hederaNetwork: 'mainnet' }],\n ['hedera:testnet', { canonical: 'hedera:testnet', hederaNetwork: 'testnet' }],\n ['testnet', { canonical: 'hedera:testnet', hederaNetwork: 'testnet' }],\n ['hedera-testnet', { canonical: 'hedera:testnet', hederaNetwork: 'testnet' }],\n ['hedera_testnet', { canonical: 'hedera:testnet', hederaNetwork: 'testnet' }],\n]);\n\nconst EVM_NETWORK_CHAIN_IDS: Record<string, number> = {\n abstract: 2741,\n 'abstract-testnet': 11124,\n base: 8453,\n 'base-sepolia': 84532,\n avalanche: 43114,\n 'avalanche-fuji': 43113,\n iotex: 4689,\n sei: 1329,\n 'sei-testnet': 1328,\n polygon: 137,\n 'polygon-amoy': 80002,\n peaq: 3338,\n};\n\nconst CHAIN_ID_TO_ALIAS = new Map<number, string>(\n Object.entries(EVM_NETWORK_CHAIN_IDS).map(([alias, id]) => [id, alias]),\n);\n\nconst parseChainId = (value: string): number | undefined => {\n if (/^eip155:\\d+$/i.test(value)) {\n return Number.parseInt(value.split(':')[1]!, 10);\n }\n if (/^\\d+$/.test(value)) {\n return Number.parseInt(value, 10);\n }\n return undefined;\n};\n\nconst normaliseEvmNetwork = (value: string): CanonicalLedgerNetwork => {\n const trimmed = normalise(value);\n let chainId = parseChainId(trimmed);\n let alias: string | undefined;\n\n if (chainId === undefined) {\n const mapped = EVM_NETWORK_CHAIN_IDS[trimmed];\n if (mapped !== undefined) {\n chainId = mapped;\n alias = trimmed;\n }\n } else if (CHAIN_ID_TO_ALIAS.has(chainId)) {\n alias = CHAIN_ID_TO_ALIAS.get(chainId);\n }\n\n if (chainId === undefined) {\n throw new Error(\n 'Unsupported EVM ledger network. Provide an alias like \"base-sepolia\" or a canonical eip155:<chainId> string.',\n );\n }\n\n return {\n canonical: `eip155:${chainId}`,\n kind: 'evm',\n chainId,\n legacyName: alias,\n };\n};\n\nconst normaliseHederaNetwork = (value: string): CanonicalLedgerNetwork => {\n const trimmed = normalise(value);\n const mapping = HEDERA_NETWORK_ALIASES.get(trimmed);\n if (!mapping) {\n throw new Error(\n 'Unsupported Hedera network. Use hedera:mainnet or hedera:testnet (legacy \"mainnet\"/\"testnet\" also accepted).',\n );\n }\n return {\n canonical: mapping.canonical,\n kind: 'hedera',\n hederaNetwork: mapping.hederaNetwork,\n };\n};\n\nexport const canonicalizeLedgerNetwork = (\n network: string,\n): CanonicalLedgerNetwork => {\n if (typeof network !== 'string' || network.trim().length === 0) {\n throw new Error('Ledger network is required.');\n }\n const trimmed = normalise(network);\n if (\n trimmed.startsWith('hedera:') ||\n trimmed.includes('hedera-') ||\n trimmed.includes('hedera_') ||\n trimmed === 'mainnet' ||\n trimmed === 'testnet'\n ) {\n return normaliseHederaNetwork(trimmed);\n }\n return normaliseEvmNetwork(trimmed);\n};\n"],"names":[],"mappings":"AAWA,MAAM,YAAY,CAAC,UAA0B,MAAM,KAAA,EAAO,YAAA;AAE1D,MAAM,6CAA6B,IAGjC;AAAA,EACA,CAAC,kBAAkB,EAAE,WAAW,kBAAkB,eAAe,WAAW;AAAA,EAC5E,CAAC,WAAW,EAAE,WAAW,kBAAkB,eAAe,WAAW;AAAA,EACrE,CAAC,kBAAkB,EAAE,WAAW,kBAAkB,eAAe,WAAW;AAAA,EAC5E,CAAC,kBAAkB,EAAE,WAAW,kBAAkB,eAAe,WAAW;AAAA,EAC5E,CAAC,kBAAkB,EAAE,WAAW,kBAAkB,eAAe,WAAW;AAAA,EAC5E,CAAC,WAAW,EAAE,WAAW,kBAAkB,eAAe,WAAW;AAAA,EACrE,CAAC,kBAAkB,EAAE,WAAW,kBAAkB,eAAe,WAAW;AAAA,EAC5E,CAAC,kBAAkB,EAAE,WAAW,kBAAkB,eAAe,WAAW;AAC9E,CAAC;AAED,MAAM,wBAAgD;AAAA,EACpD,UAAU;AAAA,EACV,oBAAoB;AAAA,EACpB,MAAM;AAAA,EACN,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,OAAO;AAAA,EACP,KAAK;AAAA,EACL,eAAe;AAAA,EACf,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,MAAM;AACR;AAEA,MAAM,oBAAoB,IAAI;AAAA,EAC5B,OAAO,QAAQ,qBAAqB,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC;AACxE;AAEA,MAAM,eAAe,CAAC,UAAsC;AAC1D,MAAI,gBAAgB,KAAK,KAAK,GAAG;AAC/B,WAAO,OAAO,SAAS,MAAM,MAAM,GAAG,EAAE,CAAC,GAAI,EAAE;AAAA,EACjD;AACA,MAAI,QAAQ,KAAK,KAAK,GAAG;AACvB,WAAO,OAAO,SAAS,OAAO,EAAE;AAAA,EAClC;AACA,SAAO;AACT;AAEA,MAAM,sBAAsB,CAAC,UAA0C;AACrE,QAAM,UAAU,UAAU,KAAK;AAC/B,MAAI,UAAU,aAAa,OAAO;AAClC,MAAI;AAEJ,MAAI,YAAY,QAAW;AACzB,UAAM,SAAS,sBAAsB,OAAO;AAC5C,QAAI,WAAW,QAAW;AACxB,gBAAU;AACV,cAAQ;AAAA,IACV;AAAA,EACF,WAAW,kBAAkB,IAAI,OAAO,GAAG;AACzC,YAAQ,kBAAkB,IAAI,OAAO;AAAA,EACvC;AAEA,MAAI,YAAY,QAAW;AACzB,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAAA,EAEJ;AAEA,SAAO;AAAA,IACL,WAAW,UAAU,OAAO;AAAA,IAC5B,MAAM;AAAA,IACN;AAAA,IACA,YAAY;AAAA,EAAA;AAEhB;AAEA,MAAM,yBAAyB,CAAC,UAA0C;AACxE,QAAM,UAAU,UAAU,KAAK;AAC/B,QAAM,UAAU,uBAAuB,IAAI,OAAO;AAClD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAAA,EAEJ;AACA,SAAO;AAAA,IACL,WAAW,QAAQ;AAAA,IACnB,MAAM;AAAA,IACN,eAAe,QAAQ;AAAA,EAAA;AAE3B;AAEO,MAAM,4BAA4B,CACvC,YAC2B;AAC3B,MAAI,OAAO,YAAY,YAAY,QAAQ,KAAA,EAAO,WAAW,GAAG;AAC9D,UAAM,IAAI,MAAM,6BAA6B;AAAA,EAC/C;AACA,QAAM,UAAU,UAAU,OAAO;AACjC,MACE,QAAQ,WAAW,SAAS,KAC5B,QAAQ,SAAS,SAAS,KAC1B,QAAQ,SAAS,SAAS,KAC1B,YAAY,aACZ,YAAY,WACZ;AACA,WAAO,uBAAuB,OAAO;AAAA,EACvC;AACA,SAAO,oBAAoB,OAAO;AACpC;"}
1
+ {"version":3,"file":"standards-sdk.es129.js","sources":["../../src/services/registry-broker/private-key-signer.ts"],"sourcesContent":["import type {\n Signer,\n AccountBalance,\n AccountInfo,\n Transaction,\n TransactionRecord,\n SignerSignature,\n} from '@hashgraph/sdk';\nimport { optionalImportSync } from '../../utils/dynamic-import';\n\nconst unsupported = (method: string): Error =>\n new Error(`${method} is not supported by the in-memory signer`);\n\nexport interface PrivateKeySignerOptions {\n accountId: string;\n privateKey: string;\n network: 'mainnet' | 'testnet';\n}\n\nexport const createPrivateKeySigner = (\n options: PrivateKeySignerOptions,\n): Signer => {\n const sdk = loadHashgraphSdk();\n const { AccountId, LedgerId, PrivateKey, SignerSignature } = sdk;\n if (!options.privateKey) {\n throw new Error('privateKey is required to create a ledger signer.');\n }\n if (!options.accountId) {\n throw new Error('accountId is required to create a ledger signer.');\n }\n const accountId = AccountId.fromString(options.accountId);\n const privateKey = PrivateKey.fromString(options.privateKey);\n const ledgerId = LedgerId.fromString(options.network);\n\n return {\n getLedgerId: () => ledgerId,\n getAccountId: () => accountId,\n getAccountKey: () => privateKey.publicKey,\n getNetwork: () => ({}),\n getMirrorNetwork: () => [],\n sign: async (messages: Uint8Array[]): Promise<SignerSignature[]> =>\n Promise.all(\n messages.map(async message => {\n const signature = await privateKey.sign(message);\n return new SignerSignature({\n publicKey: privateKey.publicKey,\n signature,\n accountId,\n });\n }),\n ),\n getAccountBalance: async (): Promise<AccountBalance> => {\n throw unsupported('getAccountBalance');\n },\n getAccountInfo: async (): Promise<AccountInfo> => {\n throw unsupported('getAccountInfo');\n },\n getAccountRecords: async (): Promise<TransactionRecord[]> => {\n throw unsupported('getAccountRecords');\n },\n signTransaction: async <T extends Transaction>(_: T): Promise<T> => {\n throw unsupported('signTransaction');\n },\n checkTransaction: async <T extends Transaction>(_: T): Promise<T> => {\n throw unsupported('checkTransaction');\n },\n populateTransaction: async <T extends Transaction>(_: T): Promise<T> => {\n throw unsupported('populateTransaction');\n },\n call: async <RequestT, ResponseT, OutputT>(\n _request: unknown,\n ): Promise<OutputT> => {\n throw unsupported('call');\n },\n };\n};\n\ntype HashgraphSdk = typeof import('@hashgraph/sdk');\n\nlet cachedSdk: HashgraphSdk | null = null;\n\nconst loadHashgraphSdk = (): HashgraphSdk => {\n if (cachedSdk) {\n return cachedSdk;\n }\n const resolved = optionalImportSync<HashgraphSdk>('@hashgraph/sdk');\n if (!resolved) {\n const message =\n '@hashgraph/sdk is required for ledger signing. Install it as a dependency to enable createPrivateKeySigner.';\n throw new Error(message);\n }\n cachedSdk = resolved;\n return resolved;\n};\n"],"names":[],"mappings":";AAUA,MAAM,cAAc,CAAC,WACnB,IAAI,MAAM,GAAG,MAAM,2CAA2C;AAQzD,MAAM,yBAAyB,CACpC,YACW;AACX,QAAM,MAAM,iBAAA;AACZ,QAAM,EAAE,WAAW,UAAU,YAAY,oBAAoB;AAC7D,MAAI,CAAC,QAAQ,YAAY;AACvB,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AACA,MAAI,CAAC,QAAQ,WAAW;AACtB,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AACA,QAAM,YAAY,UAAU,WAAW,QAAQ,SAAS;AACxD,QAAM,aAAa,WAAW,WAAW,QAAQ,UAAU;AAC3D,QAAM,WAAW,SAAS,WAAW,QAAQ,OAAO;AAEpD,SAAO;AAAA,IACL,aAAa,MAAM;AAAA,IACnB,cAAc,MAAM;AAAA,IACpB,eAAe,MAAM,WAAW;AAAA,IAChC,YAAY,OAAO,CAAA;AAAA,IACnB,kBAAkB,MAAM,CAAA;AAAA,IACxB,MAAM,OAAO,aACX,QAAQ;AAAA,MACN,SAAS,IAAI,OAAM,YAAW;AAC5B,cAAM,YAAY,MAAM,WAAW,KAAK,OAAO;AAC/C,eAAO,IAAI,gBAAgB;AAAA,UACzB,WAAW,WAAW;AAAA,UACtB;AAAA,UACA;AAAA,QAAA,CACD;AAAA,MACH,CAAC;AAAA,IAAA;AAAA,IAEL,mBAAmB,YAAqC;AACtD,YAAM,YAAY,mBAAmB;AAAA,IACvC;AAAA,IACA,gBAAgB,YAAkC;AAChD,YAAM,YAAY,gBAAgB;AAAA,IACpC;AAAA,IACA,mBAAmB,YAA0C;AAC3D,YAAM,YAAY,mBAAmB;AAAA,IACvC;AAAA,IACA,iBAAiB,OAA8B,MAAqB;AAClE,YAAM,YAAY,iBAAiB;AAAA,IACrC;AAAA,IACA,kBAAkB,OAA8B,MAAqB;AACnE,YAAM,YAAY,kBAAkB;AAAA,IACtC;AAAA,IACA,qBAAqB,OAA8B,MAAqB;AACtE,YAAM,YAAY,qBAAqB;AAAA,IACzC;AAAA,IACA,MAAM,OACJ,aACqB;AACrB,YAAM,YAAY,MAAM;AAAA,IAC1B;AAAA,EAAA;AAEJ;AAIA,IAAI,YAAiC;AAErC,MAAM,mBAAmB,MAAoB;AAC3C,MAAI,WAAW;AACb,WAAO;AAAA,EACT;AACA,QAAM,WAAW,mBAAiC,gBAAgB;AAClE,MAAI,CAAC,UAAU;AACb,UAAM,UACJ;AACF,UAAM,IAAI,MAAM,OAAO;AAAA,EACzB;AACA,cAAY;AACZ,SAAO;AACT;"}
@@ -1,4 +1,4 @@
1
- import { buildTopicCreateTx, buildMessageTx } from "./standards-sdk.es136.js";
1
+ import { buildTopicCreateTx, buildMessageTx } from "./standards-sdk.es138.js";
2
2
  import { HCS7ConfigType, HCS7Operation } from "./standards-sdk.es9.js";
3
3
  function buildHcs7CreateRegistryTx(params) {
4
4
  const memo = `hcs-7:indexed:${params.ttl}`;