@hashgraphonline/standards-sdk 0.1.190 → 0.1.191

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 (350) hide show
  1. package/dist/browser/hcs-25/adapters/ans-trust-discovery.d.ts +22 -0
  2. package/dist/browser/hcs-25/adapters/ans-trust-discovery.d.ts.map +1 -0
  3. package/dist/browser/hcs-25/adapters/index.d.ts +1 -0
  4. package/dist/browser/hcs-25/adapters/index.d.ts.map +1 -1
  5. package/dist/browser/hcs-25/collectors/ans-trust-discovery.d.ts +32 -0
  6. package/dist/browser/hcs-25/collectors/ans-trust-discovery.d.ts.map +1 -0
  7. package/dist/browser/hcs-25/collectors/catalog.d.ts +9 -2
  8. package/dist/browser/hcs-25/collectors/catalog.d.ts.map +1 -1
  9. package/dist/browser/hcs-25/collectors/index.d.ts +1 -0
  10. package/dist/browser/hcs-25/collectors/index.d.ts.map +1 -1
  11. package/dist/browser/hcs-25/signals/ans-trust-discovery.d.ts +50 -0
  12. package/dist/browser/hcs-25/signals/ans-trust-discovery.d.ts.map +1 -0
  13. package/dist/browser/hcs-25/signals/index.d.ts +1 -0
  14. package/dist/browser/hcs-25/signals/index.d.ts.map +1 -1
  15. package/dist/browser-root/hcs-25/adapters/ans-trust-discovery.d.ts +22 -0
  16. package/dist/browser-root/hcs-25/adapters/ans-trust-discovery.d.ts.map +1 -0
  17. package/dist/browser-root/hcs-25/adapters/index.d.ts +1 -0
  18. package/dist/browser-root/hcs-25/adapters/index.d.ts.map +1 -1
  19. package/dist/browser-root/hcs-25/collectors/ans-trust-discovery.d.ts +32 -0
  20. package/dist/browser-root/hcs-25/collectors/ans-trust-discovery.d.ts.map +1 -0
  21. package/dist/browser-root/hcs-25/collectors/catalog.d.ts +9 -2
  22. package/dist/browser-root/hcs-25/collectors/catalog.d.ts.map +1 -1
  23. package/dist/browser-root/hcs-25/collectors/index.d.ts +1 -0
  24. package/dist/browser-root/hcs-25/collectors/index.d.ts.map +1 -1
  25. package/dist/browser-root/hcs-25/signals/ans-trust-discovery.d.ts +50 -0
  26. package/dist/browser-root/hcs-25/signals/ans-trust-discovery.d.ts.map +1 -0
  27. package/dist/browser-root/hcs-25/signals/index.d.ts +1 -0
  28. package/dist/browser-root/hcs-25/signals/index.d.ts.map +1 -1
  29. package/dist/cjs/hcs-25/adapters/ans-trust-discovery.d.ts +22 -0
  30. package/dist/cjs/hcs-25/adapters/ans-trust-discovery.d.ts.map +1 -0
  31. package/dist/cjs/hcs-25/adapters/index.d.ts +1 -0
  32. package/dist/cjs/hcs-25/adapters/index.d.ts.map +1 -1
  33. package/dist/cjs/hcs-25/collectors/ans-trust-discovery.d.ts +32 -0
  34. package/dist/cjs/hcs-25/collectors/ans-trust-discovery.d.ts.map +1 -0
  35. package/dist/cjs/hcs-25/collectors/catalog.d.ts +9 -2
  36. package/dist/cjs/hcs-25/collectors/catalog.d.ts.map +1 -1
  37. package/dist/cjs/hcs-25/collectors/index.d.ts +1 -0
  38. package/dist/cjs/hcs-25/collectors/index.d.ts.map +1 -1
  39. package/dist/cjs/hcs-25/signals/ans-trust-discovery.d.ts +50 -0
  40. package/dist/cjs/hcs-25/signals/ans-trust-discovery.d.ts.map +1 -0
  41. package/dist/cjs/hcs-25/signals/index.d.ts +1 -0
  42. package/dist/cjs/hcs-25/signals/index.d.ts.map +1 -1
  43. package/dist/cjs/standards-sdk.cjs +1 -1
  44. package/dist/cjs/standards-sdk.cjs.map +1 -1
  45. package/dist/es/hcs-25/adapters/ans-trust-discovery.d.ts +22 -0
  46. package/dist/es/hcs-25/adapters/ans-trust-discovery.d.ts.map +1 -0
  47. package/dist/es/hcs-25/adapters/index.d.ts +1 -0
  48. package/dist/es/hcs-25/adapters/index.d.ts.map +1 -1
  49. package/dist/es/hcs-25/collectors/ans-trust-discovery.d.ts +32 -0
  50. package/dist/es/hcs-25/collectors/ans-trust-discovery.d.ts.map +1 -0
  51. package/dist/es/hcs-25/collectors/catalog.d.ts +9 -2
  52. package/dist/es/hcs-25/collectors/catalog.d.ts.map +1 -1
  53. package/dist/es/hcs-25/collectors/index.d.ts +1 -0
  54. package/dist/es/hcs-25/collectors/index.d.ts.map +1 -1
  55. package/dist/es/hcs-25/signals/ans-trust-discovery.d.ts +50 -0
  56. package/dist/es/hcs-25/signals/ans-trust-discovery.d.ts.map +1 -0
  57. package/dist/es/hcs-25/signals/index.d.ts +1 -0
  58. package/dist/es/hcs-25/signals/index.d.ts.map +1 -1
  59. package/dist/es/standards-sdk.es.js +78 -71
  60. package/dist/es/standards-sdk.es.js.map +1 -1
  61. package/dist/es/standards-sdk.es101.js +2 -2
  62. package/dist/es/standards-sdk.es103.js +2 -2
  63. package/dist/es/standards-sdk.es104.js +1 -1
  64. package/dist/es/standards-sdk.es106.js +1 -1
  65. package/dist/es/standards-sdk.es108.js +2 -2
  66. package/dist/es/standards-sdk.es11.js +1 -1
  67. package/dist/es/standards-sdk.es110.js +1 -1
  68. package/dist/es/standards-sdk.es111.js +2 -2
  69. package/dist/es/standards-sdk.es115.js +3 -3
  70. package/dist/es/standards-sdk.es116.js +4 -4
  71. package/dist/es/standards-sdk.es12.js +1 -1
  72. package/dist/es/standards-sdk.es120.js +22 -4
  73. package/dist/es/standards-sdk.es120.js.map +1 -1
  74. package/dist/es/standards-sdk.es121.js +15 -12
  75. package/dist/es/standards-sdk.es121.js.map +1 -1
  76. package/dist/es/standards-sdk.es123.js +6 -5
  77. package/dist/es/standards-sdk.es123.js.map +1 -1
  78. package/dist/es/standards-sdk.es124.js +6 -5
  79. package/dist/es/standards-sdk.es124.js.map +1 -1
  80. package/dist/es/standards-sdk.es127.js +6 -5
  81. package/dist/es/standards-sdk.es127.js.map +1 -1
  82. package/dist/es/standards-sdk.es128.js +110 -136
  83. package/dist/es/standards-sdk.es128.js.map +1 -1
  84. package/dist/es/standards-sdk.es129.js +133 -141
  85. package/dist/es/standards-sdk.es129.js.map +1 -1
  86. package/dist/es/standards-sdk.es13.js +1 -1
  87. package/dist/es/standards-sdk.es130.js +135 -345
  88. package/dist/es/standards-sdk.es130.js.map +1 -1
  89. package/dist/es/standards-sdk.es131.js +332 -344
  90. package/dist/es/standards-sdk.es131.js.map +1 -1
  91. package/dist/es/standards-sdk.es132.js +338 -178
  92. package/dist/es/standards-sdk.es132.js.map +1 -1
  93. package/dist/es/standards-sdk.es133.js +200 -196
  94. package/dist/es/standards-sdk.es133.js.map +1 -1
  95. package/dist/es/standards-sdk.es134.js +216 -364
  96. package/dist/es/standards-sdk.es134.js.map +1 -1
  97. package/dist/es/standards-sdk.es135.js +358 -100
  98. package/dist/es/standards-sdk.es135.js.map +1 -1
  99. package/dist/es/standards-sdk.es136.js +91 -220
  100. package/dist/es/standards-sdk.es136.js.map +1 -1
  101. package/dist/es/standards-sdk.es137.js +173 -1250
  102. package/dist/es/standards-sdk.es137.js.map +1 -1
  103. package/dist/es/standards-sdk.es138.js +1295 -98
  104. package/dist/es/standards-sdk.es138.js.map +1 -1
  105. package/dist/es/standards-sdk.es139.js +109 -246
  106. package/dist/es/standards-sdk.es139.js.map +1 -1
  107. package/dist/es/standards-sdk.es14.js +1 -1
  108. package/dist/es/standards-sdk.es140.js +263 -97
  109. package/dist/es/standards-sdk.es140.js.map +1 -1
  110. package/dist/es/standards-sdk.es141.js +107 -248
  111. package/dist/es/standards-sdk.es141.js.map +1 -1
  112. package/dist/es/standards-sdk.es142.js +246 -472
  113. package/dist/es/standards-sdk.es142.js.map +1 -1
  114. package/dist/es/standards-sdk.es143.js +458 -85
  115. package/dist/es/standards-sdk.es143.js.map +1 -1
  116. package/dist/es/standards-sdk.es144.js +96 -151
  117. package/dist/es/standards-sdk.es144.js.map +1 -1
  118. package/dist/es/standards-sdk.es145.js +155 -29
  119. package/dist/es/standards-sdk.es145.js.map +1 -1
  120. package/dist/es/standards-sdk.es146.js +26 -4
  121. package/dist/es/standards-sdk.es146.js.map +1 -1
  122. package/dist/es/standards-sdk.es147.js +10 -180
  123. package/dist/es/standards-sdk.es147.js.map +1 -1
  124. package/dist/es/standards-sdk.es148.js +179 -26
  125. package/dist/es/standards-sdk.es148.js.map +1 -1
  126. package/dist/es/standards-sdk.es149.js +27 -20
  127. package/dist/es/standards-sdk.es149.js.map +1 -1
  128. package/dist/es/standards-sdk.es15.js +1 -1
  129. package/dist/es/standards-sdk.es150.js +18 -156
  130. package/dist/es/standards-sdk.es150.js.map +1 -1
  131. package/dist/es/standards-sdk.es151.js +148 -190
  132. package/dist/es/standards-sdk.es151.js.map +1 -1
  133. package/dist/es/standards-sdk.es152.js +159 -747
  134. package/dist/es/standards-sdk.es152.js.map +1 -1
  135. package/dist/es/standards-sdk.es153.js +786 -9
  136. package/dist/es/standards-sdk.es153.js.map +1 -1
  137. package/dist/es/standards-sdk.es154.js +13 -567
  138. package/dist/es/standards-sdk.es154.js.map +1 -1
  139. package/dist/es/standards-sdk.es155.js +541 -600
  140. package/dist/es/standards-sdk.es155.js.map +1 -1
  141. package/dist/es/standards-sdk.es156.js +625 -12
  142. package/dist/es/standards-sdk.es156.js.map +1 -1
  143. package/dist/es/standards-sdk.es157.js +13 -2
  144. package/dist/es/standards-sdk.es157.js.map +1 -1
  145. package/dist/es/standards-sdk.es158.js +2 -87
  146. package/dist/es/standards-sdk.es158.js.map +1 -1
  147. package/dist/es/standards-sdk.es159.js +84 -37
  148. package/dist/es/standards-sdk.es159.js.map +1 -1
  149. package/dist/es/standards-sdk.es16.js +6 -6
  150. package/dist/es/standards-sdk.es160.js +40 -2
  151. package/dist/es/standards-sdk.es160.js.map +1 -1
  152. package/dist/es/standards-sdk.es161.js +2 -235
  153. package/dist/es/standards-sdk.es161.js.map +1 -1
  154. package/dist/es/standards-sdk.es162.js +204 -1109
  155. package/dist/es/standards-sdk.es162.js.map +1 -1
  156. package/dist/es/standards-sdk.es163.js +1059 -225
  157. package/dist/es/standards-sdk.es163.js.map +1 -1
  158. package/dist/es/standards-sdk.es164.js +303 -419
  159. package/dist/es/standards-sdk.es164.js.map +1 -1
  160. package/dist/es/standards-sdk.es165.js +418 -351
  161. package/dist/es/standards-sdk.es165.js.map +1 -1
  162. package/dist/es/standards-sdk.es166.js +347 -1114
  163. package/dist/es/standards-sdk.es166.js.map +1 -1
  164. package/dist/es/standards-sdk.es167.js +1094 -180
  165. package/dist/es/standards-sdk.es167.js.map +1 -1
  166. package/dist/es/standards-sdk.es168.js +153 -1512
  167. package/dist/es/standards-sdk.es168.js.map +1 -1
  168. package/dist/es/standards-sdk.es169.js +1457 -1056
  169. package/dist/es/standards-sdk.es169.js.map +1 -1
  170. package/dist/es/standards-sdk.es170.js +1163 -14
  171. package/dist/es/standards-sdk.es170.js.map +1 -1
  172. package/dist/es/standards-sdk.es171.js +15 -449
  173. package/dist/es/standards-sdk.es171.js.map +1 -1
  174. package/dist/es/standards-sdk.es172.js +440 -248
  175. package/dist/es/standards-sdk.es172.js.map +1 -1
  176. package/dist/es/standards-sdk.es173.js +259 -4
  177. package/dist/es/standards-sdk.es173.js.map +1 -1
  178. package/dist/es/standards-sdk.es174.js +4 -81
  179. package/dist/es/standards-sdk.es174.js.map +1 -1
  180. package/dist/es/standards-sdk.es175.js +71 -77
  181. package/dist/es/standards-sdk.es175.js.map +1 -1
  182. package/dist/es/standards-sdk.es176.js +80 -53
  183. package/dist/es/standards-sdk.es176.js.map +1 -1
  184. package/dist/es/standards-sdk.es177.js +59 -2546
  185. package/dist/es/standards-sdk.es177.js.map +1 -1
  186. package/dist/es/standards-sdk.es178.js +2547 -159
  187. package/dist/es/standards-sdk.es178.js.map +1 -1
  188. package/dist/es/standards-sdk.es179.js +159 -7
  189. package/dist/es/standards-sdk.es179.js.map +1 -1
  190. package/dist/es/standards-sdk.es18.js +13 -13
  191. package/dist/es/standards-sdk.es180.js +7 -86
  192. package/dist/es/standards-sdk.es180.js.map +1 -1
  193. package/dist/es/standards-sdk.es181.js +65 -44
  194. package/dist/es/standards-sdk.es181.js.map +1 -1
  195. package/dist/es/standards-sdk.es182.js +57 -188
  196. package/dist/es/standards-sdk.es182.js.map +1 -1
  197. package/dist/es/standards-sdk.es183.js +27 -26
  198. package/dist/es/standards-sdk.es183.js.map +1 -1
  199. package/dist/es/standards-sdk.es184.js +191 -53
  200. package/dist/es/standards-sdk.es184.js.map +1 -1
  201. package/dist/es/standards-sdk.es185.js +21 -109
  202. package/dist/es/standards-sdk.es185.js.map +1 -1
  203. package/dist/es/standards-sdk.es186.js +49 -47
  204. package/dist/es/standards-sdk.es186.js.map +1 -1
  205. package/dist/es/standards-sdk.es187.js +89 -205
  206. package/dist/es/standards-sdk.es187.js.map +1 -1
  207. package/dist/es/standards-sdk.es188.js +35 -58
  208. package/dist/es/standards-sdk.es188.js.map +1 -1
  209. package/dist/es/standards-sdk.es189.js +48 -39
  210. package/dist/es/standards-sdk.es189.js.map +1 -1
  211. package/dist/es/standards-sdk.es19.js +10 -10
  212. package/dist/es/standards-sdk.es190.js +218 -48
  213. package/dist/es/standards-sdk.es190.js.map +1 -1
  214. package/dist/es/standards-sdk.es191.js +66 -42
  215. package/dist/es/standards-sdk.es191.js.map +1 -1
  216. package/dist/es/standards-sdk.es192.js +33 -105
  217. package/dist/es/standards-sdk.es192.js.map +1 -1
  218. package/dist/es/standards-sdk.es193.js +49 -43
  219. package/dist/es/standards-sdk.es193.js.map +1 -1
  220. package/dist/es/standards-sdk.es194.js +33 -42
  221. package/dist/es/standards-sdk.es194.js.map +1 -1
  222. package/dist/es/standards-sdk.es195.js +123 -72
  223. package/dist/es/standards-sdk.es195.js.map +1 -1
  224. package/dist/es/standards-sdk.es196.js +58 -75
  225. package/dist/es/standards-sdk.es196.js.map +1 -1
  226. package/dist/es/standards-sdk.es197.js +60 -44
  227. package/dist/es/standards-sdk.es197.js.map +1 -1
  228. package/dist/es/standards-sdk.es198.js +72 -36
  229. package/dist/es/standards-sdk.es198.js.map +1 -1
  230. package/dist/es/standards-sdk.es199.js +75 -30
  231. package/dist/es/standards-sdk.es199.js.map +1 -1
  232. package/dist/es/standards-sdk.es2.js +2 -2
  233. package/dist/es/standards-sdk.es20.js +1 -1
  234. package/dist/es/standards-sdk.es200.js +44 -34
  235. package/dist/es/standards-sdk.es200.js.map +1 -1
  236. package/dist/es/standards-sdk.es201.js +36 -48
  237. package/dist/es/standards-sdk.es201.js.map +1 -1
  238. package/dist/es/standards-sdk.es202.js +30 -138
  239. package/dist/es/standards-sdk.es202.js.map +1 -1
  240. package/dist/es/standards-sdk.es203.js +34 -42
  241. package/dist/es/standards-sdk.es203.js.map +1 -1
  242. package/dist/es/standards-sdk.es204.js +48 -12482
  243. package/dist/es/standards-sdk.es204.js.map +1 -1
  244. package/dist/es/standards-sdk.es205.js +134 -13
  245. package/dist/es/standards-sdk.es205.js.map +1 -1
  246. package/dist/es/standards-sdk.es206.js +36 -50
  247. package/dist/es/standards-sdk.es206.js.map +1 -1
  248. package/dist/es/standards-sdk.es207.js +12449 -78
  249. package/dist/es/standards-sdk.es207.js.map +1 -1
  250. package/dist/es/standards-sdk.es208.js +15 -79
  251. package/dist/es/standards-sdk.es208.js.map +1 -1
  252. package/dist/es/standards-sdk.es209.js +48 -192
  253. package/dist/es/standards-sdk.es209.js.map +1 -1
  254. package/dist/es/standards-sdk.es21.js +1 -1
  255. package/dist/es/standards-sdk.es210.js +90 -651
  256. package/dist/es/standards-sdk.es210.js.map +1 -1
  257. package/dist/es/standards-sdk.es211.js +71 -63
  258. package/dist/es/standards-sdk.es211.js.map +1 -1
  259. package/dist/es/standards-sdk.es212.js +188 -160
  260. package/dist/es/standards-sdk.es212.js.map +1 -1
  261. package/dist/es/standards-sdk.es213.js +65 -314
  262. package/dist/es/standards-sdk.es213.js.map +1 -1
  263. package/dist/es/standards-sdk.es214.js +661 -335
  264. package/dist/es/standards-sdk.es214.js.map +1 -1
  265. package/dist/es/standards-sdk.es215.js +129 -410
  266. package/dist/es/standards-sdk.es215.js.map +1 -1
  267. package/dist/es/standards-sdk.es216.js +200 -209
  268. package/dist/es/standards-sdk.es216.js.map +1 -1
  269. package/dist/es/standards-sdk.es217.js +334 -64
  270. package/dist/es/standards-sdk.es217.js.map +1 -1
  271. package/dist/es/standards-sdk.es218.js +438 -124
  272. package/dist/es/standards-sdk.es218.js.map +1 -1
  273. package/dist/es/standards-sdk.es219.js +310 -496
  274. package/dist/es/standards-sdk.es219.js.map +1 -1
  275. package/dist/es/standards-sdk.es22.js +1 -1
  276. package/dist/es/standards-sdk.es220.js +60 -243
  277. package/dist/es/standards-sdk.es220.js.map +1 -1
  278. package/dist/es/standards-sdk.es221.js +118 -175
  279. package/dist/es/standards-sdk.es221.js.map +1 -1
  280. package/dist/es/standards-sdk.es222.js +465 -67
  281. package/dist/es/standards-sdk.es222.js.map +1 -1
  282. package/dist/es/standards-sdk.es223.js +250 -143
  283. package/dist/es/standards-sdk.es223.js.map +1 -1
  284. package/dist/es/standards-sdk.es224.js +172 -160
  285. package/dist/es/standards-sdk.es224.js.map +1 -1
  286. package/dist/es/standards-sdk.es225.js +65 -630
  287. package/dist/es/standards-sdk.es225.js.map +1 -1
  288. package/dist/es/standards-sdk.es226.js +128 -161
  289. package/dist/es/standards-sdk.es226.js.map +1 -1
  290. package/dist/es/standards-sdk.es227.js +144 -195
  291. package/dist/es/standards-sdk.es227.js.map +1 -1
  292. package/dist/es/standards-sdk.es228.js +668 -223
  293. package/dist/es/standards-sdk.es228.js.map +1 -1
  294. package/dist/es/standards-sdk.es229.js +188 -0
  295. package/dist/es/standards-sdk.es229.js.map +1 -0
  296. package/dist/es/standards-sdk.es23.js +1 -1
  297. package/dist/es/standards-sdk.es230.js +238 -0
  298. package/dist/es/standards-sdk.es230.js.map +1 -0
  299. package/dist/es/standards-sdk.es231.js +242 -0
  300. package/dist/es/standards-sdk.es231.js.map +1 -0
  301. package/dist/es/standards-sdk.es24.js +1 -1
  302. package/dist/es/standards-sdk.es25.js +1 -1
  303. package/dist/es/standards-sdk.es26.js +1 -1
  304. package/dist/es/standards-sdk.es27.js +13 -13
  305. package/dist/es/standards-sdk.es30.js +2 -2
  306. package/dist/es/standards-sdk.es31.js +4 -4
  307. package/dist/es/standards-sdk.es32.js +1 -1
  308. package/dist/es/standards-sdk.es35.js +7 -7
  309. package/dist/es/standards-sdk.es36.js +4 -4
  310. package/dist/es/standards-sdk.es37.js +2 -2
  311. package/dist/es/standards-sdk.es38.js +2 -2
  312. package/dist/es/standards-sdk.es39.js +1 -1
  313. package/dist/es/standards-sdk.es4.js +2 -2
  314. package/dist/es/standards-sdk.es40.js +1 -1
  315. package/dist/es/standards-sdk.es41.js +2 -2
  316. package/dist/es/standards-sdk.es46.js +1 -1
  317. package/dist/es/standards-sdk.es5.js +2 -2
  318. package/dist/es/standards-sdk.es51.js +1 -1
  319. package/dist/es/standards-sdk.es53.js +1 -1
  320. package/dist/es/standards-sdk.es56.js +2 -2
  321. package/dist/es/standards-sdk.es59.js +1 -1
  322. package/dist/es/standards-sdk.es6.js +2 -2
  323. package/dist/es/standards-sdk.es60.js +1 -1
  324. package/dist/es/standards-sdk.es62.js +1 -1
  325. package/dist/es/standards-sdk.es63.js +2 -2
  326. package/dist/es/standards-sdk.es64.js +1 -1
  327. package/dist/es/standards-sdk.es65.js +1 -1
  328. package/dist/es/standards-sdk.es66.js +1 -1
  329. package/dist/es/standards-sdk.es67.js +8 -8
  330. package/dist/es/standards-sdk.es69.js +1 -1
  331. package/dist/es/standards-sdk.es7.js +1 -1
  332. package/dist/es/standards-sdk.es71.js +2 -2
  333. package/dist/es/standards-sdk.es72.js +3 -3
  334. package/dist/es/standards-sdk.es75.js +5 -5
  335. package/dist/es/standards-sdk.es76.js +3 -3
  336. package/dist/es/standards-sdk.es77.js +2 -2
  337. package/dist/es/standards-sdk.es78.js +1 -1
  338. package/dist/es/standards-sdk.es81.js +2 -2
  339. package/dist/es/standards-sdk.es83.js +2 -2
  340. package/dist/es/standards-sdk.es84.js +5 -5
  341. package/dist/es/standards-sdk.es85.js +1 -1
  342. package/dist/es/standards-sdk.es88.js +1 -1
  343. package/dist/es/standards-sdk.es89.js +2 -2
  344. package/dist/es/standards-sdk.es9.js +2 -2
  345. package/dist/es/standards-sdk.es90.js +4 -4
  346. package/dist/es/standards-sdk.es94.js +3 -3
  347. package/dist/es/standards-sdk.es96.js +2 -2
  348. package/dist/es/standards-sdk.es98.js +1 -1
  349. package/dist/es/standards-sdk.es99.js +3 -3
  350. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es132.js","sources":["../../src/hcs-25/collectors/erc8004.ts"],"sourcesContent":["import type { Hcs25JsonValue, Hcs25Subject } from '../types';\nimport { readString } from '../signals';\nimport { Hcs25CollectorHttpError, isTimeoutError, requestJson } from './http';\nimport type {\n Hcs25CollectContext,\n Hcs25SignalAdapter,\n Hcs25SignalAdapterResult,\n Hcs25SignalStatus,\n} from './types';\n\n/**\n * Parsed ERC-8004 feedback summary used by the scoring adapter.\n */\nexport interface Hcs25Erc8004FeedbackSummary {\n averageScore: number;\n totalFeedbacks: number;\n registry?: string;\n network?: string;\n updatedAt?: string;\n}\n\n/**\n * A feedback source: returns the summary for a subject or null when the\n * source has no data for it.\n */\nexport interface Hcs25Erc8004FeedbackSource {\n getFeedbackSummary(\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n ): Promise<Hcs25Erc8004FeedbackSummary | null>;\n}\n\nconst parsePositiveInt = (value: unknown): number | null => {\n if (typeof value === 'number' && Number.isFinite(value)) {\n const normalized = Math.floor(value);\n return normalized > 0 ? normalized : null;\n }\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n const parsed = Number.parseInt(trimmed, 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : null;\n }\n return null;\n};\n\nconst parseNonNegativeInt = (value: unknown): number | null => {\n if (typeof value === 'number' && Number.isFinite(value)) {\n const normalized = Math.floor(value);\n return normalized >= 0 ? normalized : null;\n }\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n const parsed = Number.parseInt(trimmed, 10);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : null;\n }\n return null;\n};\n\nconst parseChainIdFromNetworkKey = (networkKey: unknown): number | null => {\n if (typeof networkKey !== 'string') {\n return null;\n }\n const trimmed = networkKey.trim();\n if (!trimmed) {\n return null;\n }\n const match = /^eip155:(\\d+)(?::|$)/i.exec(trimmed);\n if (!match) {\n return null;\n }\n const parsed = Number.parseInt(match[1], 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : null;\n};\n\nconst parseIdParts = (\n value: unknown,\n): { chainId: number; agentId: string } | null => {\n if (typeof value !== 'string') {\n return null;\n }\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n const separator = trimmed.indexOf(':');\n if (separator <= 0 || separator !== trimmed.lastIndexOf(':')) {\n return null;\n }\n const chainId = Number.parseInt(trimmed.slice(0, separator), 10);\n const agentId = trimmed.slice(separator + 1);\n if (!Number.isFinite(chainId) || chainId <= 0 || !agentId) {\n return null;\n }\n return { chainId, agentId };\n};\n\n/**\n * Resolves the ERC-8004 `{chainId, agentId}` identity from subject metadata,\n * mirroring the registry-broker production adapter:\n *\n * 1. Explicit `metadata.agentId` + `metadata.chainId` (or\n * `metadata.networkKey` such as `eip155:8453`).\n * 2. `metadata.originalId` / `metadata.nativeId` / `metadata.uid` in\n * `{chainId}:{agentId}` form.\n */\nexport function parseErc8004NativeId(\n subject: Hcs25Subject,\n): { chainId: number; agentId: string } | null {\n const metadata = subject.metadata ?? {};\n\n const idParts =\n parseIdParts(readString(metadata, 'originalId')) ??\n parseIdParts(readString(metadata, 'nativeId')) ??\n parseIdParts(readString(metadata, 'uid'));\n\n const agentId =\n parseNonNegativeInt(metadata['agentId']) ??\n (idParts ? parseNonNegativeInt(idParts.agentId) : null);\n const chainId =\n parsePositiveInt(metadata['chainId']) ??\n parseChainIdFromNetworkKey(metadata['networkKey']) ??\n idParts?.chainId ??\n null;\n\n if (agentId === null || chainId === null) {\n return null;\n }\n return { chainId, agentId: String(agentId) };\n}\n\n/**\n * Options for the HTTP indexer feedback source.\n */\nexport interface Hcs25Erc8004IndexerSourceOptions {\n /**\n * Indexer endpoint template; `{nativeId}`, `{chainId}`, and `{agentId}`\n * placeholders are substituted, or provide a function returning the URL.\n */\n endpoint: string | ((subject: Hcs25Subject) => string | null);\n}\n\ninterface Erc8004IndexerResponse {\n averageScore?: number;\n totalFeedbacks?: number;\n count?: number;\n registry?: string;\n network?: string;\n updatedAt?: string;\n summary?: {\n averageScore?: number;\n totalFeedbacks?: number;\n registry?: string;\n network?: string;\n updatedAt?: string;\n };\n}\n\n/**\n * Creates a feedback source that queries an HTTP indexer exposing ERC-8004\n * reputation summaries as JSON.\n */\nexport function createHttpErc8004FeedbackSource(\n options: Hcs25Erc8004IndexerSourceOptions,\n): Hcs25Erc8004FeedbackSource {\n return {\n async getFeedbackSummary(subject, context) {\n const nativeId = parseErc8004NativeId(subject);\n if (!nativeId) {\n return null;\n }\n const url =\n typeof options.endpoint === 'function'\n ? options.endpoint(subject)\n : options.endpoint\n .replace('{nativeId}', `${nativeId.chainId}:${nativeId.agentId}`)\n .replace('{chainId}', String(nativeId.chainId))\n .replace('{agentId}', nativeId.agentId);\n if (!url) {\n return null;\n }\n const data = await requestJson<Erc8004IndexerResponse>(url, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n const summary = data.summary ?? data;\n const averageScore =\n typeof summary.averageScore === 'number' ? summary.averageScore : null;\n const totalFeedbacks =\n typeof summary.totalFeedbacks === 'number'\n ? summary.totalFeedbacks\n : typeof (data as Erc8004IndexerResponse).count === 'number'\n ? (data as Erc8004IndexerResponse).count!\n : null;\n if (averageScore === null && totalFeedbacks === null) {\n return null;\n }\n return {\n averageScore: averageScore ?? 0,\n totalFeedbacks: totalFeedbacks ?? 0,\n registry: summary.registry ?? 'erc-8004',\n network: summary.network ?? String(nativeId.chainId),\n updatedAt: summary.updatedAt,\n };\n },\n };\n}\n\nconst ERC8004_REPUTATION_ABI = [\n 'function getClients(uint256 agentId) view returns (address[])',\n 'function getSummary(uint256 agentId, address[] clientAddresses, string tag1, string tag2) view returns (uint64 count, int128 summaryValue, uint8 summaryValueDecimals)',\n] as const;\n\n/**\n * Minimal contract-call surface needed from an ethers provider/signer or a\n * duck-typed `ethers.Contract`. Callers may also pass a fully custom\n * `readContract` implementation.\n */\nexport interface Hcs25Erc8004ContractCaller {\n getClients(agentId: bigint): Promise<readonly string[]>;\n getSummary(\n agentId: bigint,\n clientAddresses: readonly string[],\n tag1: string,\n tag2: string,\n ): Promise<readonly [bigint, bigint, bigint]>;\n}\n\n/**\n * Options for the on-chain feedback source (EVM ERC-8004 networks).\n */\nexport interface Hcs25Erc8004OnchainSourceOptions {\n /**\n * Registry contract address per chainId (e.g. `{11155111: '0x…'}`).\n */\n registries: Record<number, string>;\n /**\n * Contract factory per chainId: `(registryAddress, agentId)` → caller.\n * Build it with ethers: `new ethers.Contract(addr, ERC8004_ABI, provider)`.\n */\n contractFor: (\n chainId: number,\n registry: string,\n ) => Hcs25Erc8004ContractCaller;\n /**\n * Interpretation of the raw summary value: `auto` treats values ≤5 as a\n * 0–5 scale scaled ×20, ≤100 as already 0–100.\n */\n scoreScale?: 'auto' | 'ratio5' | 'percent';\n tag1?: string;\n tag2?: string;\n}\n\n/**\n * Creates a feedback source that reads the ERC-8004 Reputation Registry\n * contract directly: `getClients(agentId)` then\n * `getSummary(agentId, clients, tag1, tag2)`.\n */\nexport function createOnchainErc8004FeedbackSource(\n options: Hcs25Erc8004OnchainSourceOptions,\n): Hcs25Erc8004FeedbackSource {\n const scoreScale = options.scoreScale ?? 'auto';\n return {\n async getFeedbackSummary(subject) {\n const nativeId = parseErc8004NativeId(subject);\n if (!nativeId) {\n return null;\n }\n const registry = options.registries[nativeId.chainId];\n if (!registry) {\n return null;\n }\n const contract = options.contractFor(nativeId.chainId, registry);\n const agentId = BigInt(nativeId.agentId);\n const clients = await contract.getClients(agentId);\n if (clients.length === 0) {\n return {\n averageScore: 0,\n totalFeedbacks: 0,\n network: String(nativeId.chainId),\n };\n }\n const [count, summaryValue, decimals] = await contract.getSummary(\n agentId,\n [...clients],\n options.tag1 ?? '',\n options.tag2 ?? '',\n );\n const raw = Number(summaryValue) / 10 ** Number(decimals);\n const averageScore =\n scoreScale === 'ratio5'\n ? raw * 20\n : scoreScale === 'percent'\n ? raw\n : raw <= 5\n ? raw * 20\n : raw;\n return {\n averageScore: Math.min(100, Math.max(0, averageScore)),\n totalFeedbacks: Number(count),\n network: String(nativeId.chainId),\n };\n },\n };\n}\n\n/**\n * Options for the ERC-8004 feedback signal adapter.\n */\nexport interface Hcs25Erc8004SignalAdapterOptions {\n /** One or more feedback sources; the first non-null summary wins. */\n sources: readonly Hcs25Erc8004FeedbackSource[];\n timeoutMs?: number;\n includeRegistries?: readonly string[];\n excludeRegistries?: readonly string[];\n appliesTo?: (subject: Hcs25Subject) => boolean;\n}\n\nconst DEFAULT_INCLUDED_REGISTRIES: readonly string[] = ['erc-8004'];\n\nfunction statusFromError(error: unknown): Hcs25SignalStatus {\n return isTimeoutError(error) ? 'timeout' : 'error';\n}\n\n/**\n * Creates the `erc8004-feedback` signal adapter: resolves the subject's\n * `chainId:agentId` identity, queries configured feedback sources (HTTP\n * indexer and/or on-chain via ethers), and writes\n * `metadata.erc8004FeedbackSummary`.\n */\nexport function createErc8004SignalAdapter(\n options: Hcs25Erc8004SignalAdapterOptions,\n): Hcs25SignalAdapter {\n const collect = async (\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n ): Promise<Hcs25SignalAdapterResult[]> => {\n const now = context.now.toISOString();\n const nativeId = parseErc8004NativeId(subject);\n if (!nativeId) {\n return [{ signalId: 'erc8004.feedback', status: 'missing' }];\n }\n\n let lastError: unknown = null;\n for (const source of options.sources) {\n try {\n const summary = await source.getFeedbackSummary(subject, context);\n if (!summary) {\n continue;\n }\n const averageScore = Math.min(\n 100,\n Math.max(0, Number(summary.averageScore) || 0),\n );\n const totalFeedbacks = Math.max(\n 0,\n Math.floor(Number(summary.totalFeedbacks) || 0),\n );\n const record: Record<string, Hcs25JsonValue> = {\n averageScore,\n totalFeedbacks,\n registry: summary.registry ?? subject.registry ?? 'erc-8004',\n network: summary.network ?? String(nativeId.chainId),\n updatedAt: summary.updatedAt ?? now,\n };\n return [\n {\n signalId: 'erc8004.feedback',\n status: 'ok',\n value: averageScore,\n fields: [{ scope: 'erc8004FeedbackSummary', values: record }],\n provenance: {\n source: 'erc8004',\n subjectId: `${nativeId.chainId}:${nativeId.agentId}`,\n fetchedAt: now,\n },\n },\n ];\n } catch (error) {\n lastError = error;\n continue;\n }\n }\n\n if (lastError) {\n if (\n lastError instanceof Hcs25CollectorHttpError &&\n lastError.status === 404\n ) {\n return [{ signalId: 'erc8004.feedback', status: 'missing' }];\n }\n return [\n {\n signalId: 'erc8004.feedback',\n status: statusFromError(lastError),\n },\n ];\n }\n return [{ signalId: 'erc8004.feedback', status: 'missing' }];\n };\n\n return {\n id: 'erc8004-feedback',\n produces: ['erc8004.feedback'],\n timeoutMs: options.timeoutMs,\n includeRegistries: options.includeRegistries ?? DEFAULT_INCLUDED_REGISTRIES,\n excludeRegistries: options.excludeRegistries,\n appliesTo: options.appliesTo,\n collect,\n };\n}\n\nexport { ERC8004_REPUTATION_ABI };\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standards-sdk.es132.js","sources":["../../src/hcs-25/collectors/oss-popularity.ts"],"sourcesContent":["import type { Hcs25JsonValue, Hcs25Subject } from '../types';\nimport { isJsonObject, readString, readSubjectAdditional } from '../signals';\nimport { resolveSubjectEndpoint } from './endpoints';\nimport {\n Hcs25CollectorHttpError,\n isTimeoutError,\n requestJson,\n requestText,\n} from './http';\nimport type {\n Hcs25CollectContext,\n Hcs25SignalAdapter,\n Hcs25SignalAdapterResult,\n Hcs25SignalStatus,\n} from './types';\n\nconst GITHUB_API_BASE = 'https://api.github.com';\nconst NPM_API_BASE = 'https://api.npmjs.org';\nconst NPM_REGISTRY_BASE = 'https://registry.npmjs.org';\nconst PYPISTATS_API_BASE = 'https://pypistats.org/api';\nconst PYPI_API_BASE = 'https://pypi.org/pypi';\nconst RAW_GITHUB_BASE = 'https://raw.githubusercontent.com';\n\nconst GITHUB_REPO_PATTERN =\n /github\\.com[:/]+([A-Za-z0-9_.-]+)\\/([A-Za-z0-9_.-]+)/;\n\n/**\n * Options for the OSS popularity signal adapter.\n */\nexport interface Hcs25OssPopularitySignalAdapterOptions {\n /** GitHub API base URL. Default `https://api.github.com`. */\n githubApiBase?: string;\n /** Optional GitHub token for higher rate limits. */\n githubToken?: string;\n /** npm downloads API base. Default `https://api.npmjs.org`. */\n npmApiBase?: string;\n /** pypistats API base. Default `https://pypistats.org/api`. */\n pypiApiBase?: string;\n /**\n * When no GitHub repo is declared, infer one from the package's\n * registry metadata (npm `repository.url`, PyPI `project_urls` /\n * `home_page`). Default true.\n */\n inferRepository?: boolean;\n /**\n * When no package identity is declared, infer one from the repo's\n * `package.json` / `pyproject.toml` / `setup.cfg` on `main`/`master`.\n * Default true.\n */\n inferPackageIdentity?: boolean;\n /**\n * When the GitHub API lookup fails or returns no star count, scrape the\n * repo page's star counter as a fallback. Default true.\n */\n githubHtmlFallback?: boolean;\n /** Per-adapter timeout in milliseconds. */\n timeoutMs?: number;\n includeRegistries?: readonly string[];\n excludeRegistries?: readonly string[];\n appliesTo?: (subject: Hcs25Subject) => boolean;\n}\n\n/**\n * Extracts an `owner/repo` pair from a free-form value (URL, git SSH form,\n * or an already-normalized `owner/repo` slug).\n */\nexport function parseGithubRepo(value: string | null): string | null {\n if (!value) {\n return null;\n }\n const direct = value.match(/^([A-Za-z0-9_.-]+)\\/([A-Za-z0-9_.-]+)$/);\n if (direct) {\n return `${direct[1]}/${direct[2]}`;\n }\n const match = value.match(GITHUB_REPO_PATTERN);\n if (!match) {\n return null;\n }\n return `${match[1]}/${match[2].replace(/\\.git$/, '')}`;\n}\n\nfunction resolveGithubRepo(subject: Hcs25Subject): string | null {\n const additional = readSubjectAdditional(subject);\n const metadata = subject.metadata ?? {};\n const mcp = isJsonObject(metadata.mcp) ? metadata.mcp : undefined;\n\n for (const value of [\n readString(additional, 'githubRepo'),\n readString(additional, 'repository'),\n readString(metadata, 'repository'),\n readString(mcp, 'repository'),\n readString(metadata, 'repoUrl'),\n readString(additional, 'repoUrl'),\n readString(metadata, 'homepage'),\n readString(additional, 'homepage'),\n resolveSubjectEndpoint(subject),\n ]) {\n const repo = parseGithubRepo(value);\n if (repo) {\n return repo;\n }\n }\n return null;\n}\n\nfunction resolvePackage(\n subject: Hcs25Subject,\n): { registry: 'npm' | 'pypi'; name: string } | null {\n const additional = readSubjectAdditional(subject);\n const registry = readString(additional, 'packageRegistry');\n const name = readString(additional, 'packageName');\n if (name && (registry === 'npm' || registry === 'pypi')) {\n return { registry, name };\n }\n if (name) {\n return { registry: 'npm', name };\n }\n return null;\n}\n\ninterface GithubRepoResponse {\n stargazers_count?: number;\n}\n\ninterface NpmDownloadsResponse {\n downloads?: number;\n}\n\ninterface PyPiRecentResponse {\n data?: { last_month?: number };\n}\n\nfunction statusFromError(error: unknown): Hcs25SignalStatus {\n if (error instanceof Hcs25CollectorHttpError && error.status === 404) {\n return 'missing';\n }\n return isTimeoutError(error) ? 'timeout' : 'error';\n}\n\nconst parseLikelyPackageName = (value: string | null): string | null => {\n if (!value) {\n return null;\n }\n const trimmed = value.trim();\n return /^[a-zA-Z0-9._~@/-]{1,214}$/.test(trimmed) ? trimmed : null;\n};\n\nconst parseNpmPackageName = (body: string): string | null => {\n try {\n const parsed = JSON.parse(body) as { name?: unknown };\n return typeof parsed.name === 'string' ? parsed.name : null;\n } catch {\n return null;\n }\n};\n\nconst parsePyProjectName = (body: string): string | null => {\n const match = body.match(/^\\s*name\\s*=\\s*[\"']([^\"']+)[\"']/m);\n return match?.[1] ?? null;\n};\n\nconst parseSetupCfgName = (body: string): string | null => {\n const match = body.match(/^\\s*name\\s*=\\s*(\\S+)\\s*$/m);\n return match?.[1] ?? null;\n};\n\n/**\n * Infers the package identity (`npm`/`pypi` + name) from the repository's\n * package manifests on `main`/`master`, per production behavior.\n */\nasync function inferPackageIdentity(\n repo: string,\n context: Hcs25CollectContext,\n): Promise<{ registry: 'npm' | 'pypi'; name: string } | null> {\n const base = `${RAW_GITHUB_BASE}/${repo\n .split('/')\n .map(encodeURIComponent)\n .join('/')}`;\n let npmName: string | null = null;\n let pypiName: string | null = null;\n\n for (const branch of ['main', 'master']) {\n if (!npmName) {\n try {\n const body = await requestText(`${base}/${branch}/package.json`, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n npmName = parseLikelyPackageName(parseNpmPackageName(body));\n } catch {\n // manifest not present on this branch\n }\n }\n if (!pypiName) {\n try {\n const body = await requestText(`${base}/${branch}/pyproject.toml`, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n pypiName = parseLikelyPackageName(parsePyProjectName(body));\n } catch {\n try {\n const body = await requestText(`${base}/${branch}/setup.cfg`, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n pypiName = parseLikelyPackageName(parseSetupCfgName(body));\n } catch {\n // no python manifest either\n }\n }\n }\n if (npmName || pypiName) {\n break;\n }\n }\n\n if (npmName && !pypiName) {\n return { registry: 'npm', name: npmName };\n }\n if (pypiName && !npmName) {\n return { registry: 'pypi', name: pypiName };\n }\n return null;\n}\n\n/**\n * Infers the GitHub repository for a package from its registry metadata\n * (PyPI `project_urls`/`home_page`; npm `repository.url`/`homepage`/\n * `bugs.url`).\n */\nasync function inferRepositoryFromPackage(\n pkg: { registry: 'npm' | 'pypi'; name: string },\n context: Hcs25CollectContext,\n): Promise<string | null> {\n const candidates: string[] = [];\n try {\n if (pkg.registry === 'pypi') {\n const payload = await requestJson<{\n info?: {\n home_page?: unknown;\n project_urls?: Record<string, unknown>;\n };\n }>(`${PYPI_API_BASE}/${encodeURIComponent(pkg.name)}/json`, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n const home = payload.info?.home_page;\n if (typeof home === 'string') {\n candidates.push(home);\n }\n const urls = payload.info?.project_urls;\n if (urls && typeof urls === 'object' && !Array.isArray(urls)) {\n for (const value of Object.values(urls)) {\n if (typeof value === 'string') {\n candidates.push(value);\n }\n }\n }\n } else {\n const payload = await requestJson<{\n repository?: { url?: unknown } | unknown;\n homepage?: unknown;\n bugs?: { url?: unknown } | unknown;\n }>(`${NPM_REGISTRY_BASE}/${encodeURIComponent(pkg.name)}`, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n const repo =\n payload.repository &&\n typeof payload.repository === 'object' &&\n !Array.isArray(payload.repository)\n ? (payload.repository as Record<string, unknown>).url\n : payload.repository;\n if (typeof repo === 'string') {\n candidates.push(repo);\n }\n if (typeof payload.homepage === 'string') {\n candidates.push(payload.homepage);\n }\n const bugs =\n payload.bugs &&\n typeof payload.bugs === 'object' &&\n !Array.isArray(payload.bugs)\n ? (payload.bugs as Record<string, unknown>).url\n : payload.bugs;\n if (typeof bugs === 'string') {\n candidates.push(bugs);\n }\n }\n } catch {\n return null;\n }\n for (const candidate of candidates) {\n const repo = parseGithubRepo(candidate);\n if (repo) {\n return repo;\n }\n }\n return null;\n}\n\n/**\n * Reads GitHub star count from the repo HTML page's counter badge\n * (production fallback when the API is rate-limited).\n */\nasync function fetchGithubStarsViaHtml(\n repo: string,\n context: Hcs25CollectContext,\n): Promise<number | null> {\n const url = `https://github.com/${repo\n .split('/')\n .map(encodeURIComponent)\n .join('/')}`;\n const body = await requestText(url, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n headers: { accept: 'text/html' },\n });\n const match =\n body.match(\n /id=\"repo-stars-counter-star\"[^>]*aria-label=\"(?<count>[0-9,]+)\\s+users?\\s+starred/i,\n ) ??\n body.match(/id=\"repo-stars-counter-star\"[^>]*title=\"(?<count>[0-9,]+)\"/i);\n const raw = match?.groups?.count;\n if (!raw) {\n return null;\n }\n const parsed = Number(raw.replace(/,/g, ''));\n return Number.isFinite(parsed) ? Math.max(0, Math.floor(parsed)) : null;\n}\n\n/**\n * Creates the `oss-popularity` signal adapter: collects GitHub repository\n * stars and npm/PyPI 30-day download counts — with package/repo identity\n * inference across `package.json`, `pyproject.toml`, `setup.cfg`, PyPI\n * metadata, and npm registry metadata — writing the catalog fields under\n * `metadata.additional`.\n */\nexport function createOssPopularitySignalAdapter(\n options: Hcs25OssPopularitySignalAdapterOptions = {},\n): Hcs25SignalAdapter {\n const collect = async (\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n ): Promise<Hcs25SignalAdapterResult[]> => {\n const now = context.now.toISOString();\n let repo = resolveGithubRepo(subject);\n let pkg = resolvePackage(subject);\n\n // Cross-inference: repo ⇄ package (production behavior).\n if (!repo && pkg && options.inferRepository !== false) {\n repo = await inferRepositoryFromPackage(pkg, context).catch(\n (): null => null,\n );\n }\n if (!pkg && repo && options.inferPackageIdentity !== false) {\n pkg = await inferPackageIdentity(repo, context).catch((): null => null);\n }\n\n const results: Hcs25SignalAdapterResult[] = [];\n const additional: Record<string, Hcs25JsonValue> = {};\n\n if (repo) {\n additional.githubRepo = repo;\n additional.packageRepositoryUpdatedAt = now;\n try {\n const headers: Record<string, string> = {\n accept: 'application/vnd.github+json',\n };\n if (options.githubToken) {\n headers.authorization = `Bearer ${options.githubToken}`;\n }\n let stars: number | null = null;\n try {\n const data = await requestJson<GithubRepoResponse>(\n `${options.githubApiBase ?? GITHUB_API_BASE}/repos/${repo}`,\n {\n fetch: context.fetch,\n headers,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n },\n );\n stars =\n typeof data.stargazers_count === 'number'\n ? Math.max(0, Math.floor(data.stargazers_count))\n : null;\n } catch (error) {\n if (options.githubHtmlFallback === false) {\n throw error;\n }\n }\n if (stars === null && options.githubHtmlFallback !== false) {\n stars = await fetchGithubStarsViaHtml(repo, context).catch(\n (): null => null,\n );\n }\n additional.githubStars = stars;\n additional.githubStarsUpdatedAt = now;\n results.push({\n signalId: 'oss.github_stars',\n status: stars === null ? 'missing' : 'ok',\n value: stars,\n provenance: {\n source: 'github',\n sourceUrl: `${options.githubApiBase ?? GITHUB_API_BASE}/repos/${repo}`,\n subjectId: repo,\n fetchedAt: now,\n },\n });\n } catch (error) {\n results.push({\n signalId: 'oss.github_stars',\n status: statusFromError(error),\n provenance: {\n source: 'github',\n subjectId: repo,\n fetchedAt: now,\n },\n });\n }\n }\n\n if (pkg) {\n additional.packageRegistry = pkg.registry;\n additional.packageName = pkg.name;\n additional.packageIdentityUpdatedAt = now;\n const signalId =\n pkg.registry === 'npm' ? 'oss.npm_downloads' : 'oss.pypi_downloads';\n try {\n if (pkg.registry === 'npm') {\n const data = await requestJson<NpmDownloadsResponse>(\n `${options.npmApiBase ?? NPM_API_BASE}/downloads/point/last-month/${encodeURIComponent(pkg.name)}`,\n {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n },\n );\n const downloads =\n typeof data.downloads === 'number'\n ? Math.max(0, Math.floor(data.downloads))\n : null;\n additional.npmDownloads30d = downloads;\n additional.npmDownloadsUpdatedAt = now;\n if (downloads !== null) {\n additional.packageDownloadCount = downloads;\n }\n results.push({\n signalId,\n status: downloads === null ? 'missing' : 'ok',\n value: downloads,\n provenance: {\n source: 'npm',\n subjectId: pkg.name,\n fetchedAt: now,\n },\n });\n } else {\n const data = await requestJson<PyPiRecentResponse>(\n `${options.pypiApiBase ?? PYPISTATS_API_BASE}/packages/${encodeURIComponent(pkg.name)}/recent`,\n {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n },\n );\n const downloads =\n typeof data.data?.last_month === 'number'\n ? Math.max(0, Math.floor(data.data.last_month))\n : null;\n additional.pypiDownloads30d = downloads;\n additional.pypiDownloadsUpdatedAt = now;\n if (downloads !== null) {\n additional.packageDownloadCount = downloads;\n }\n results.push({\n signalId,\n status: downloads === null ? 'missing' : 'ok',\n value: downloads,\n provenance: {\n source: 'pypi',\n subjectId: pkg.name,\n fetchedAt: now,\n },\n });\n }\n } catch (error) {\n results.push({\n signalId,\n status: statusFromError(error),\n provenance: {\n source: pkg.registry,\n subjectId: pkg.name,\n fetchedAt: now,\n },\n });\n }\n }\n\n if (results.length === 0) {\n return [\n {\n signalId: 'oss.github_stars',\n status: 'missing',\n },\n ];\n }\n\n const rootValues: Record<string, Hcs25JsonValue> = {};\n // Persist an inferred repository at the metadata root so downstream\n // collectors and the stored record share the canonical value.\n if (repo && !readString(subject.metadata ?? {}, 'repository')) {\n rootValues.repository = `https://github.com/${repo}`;\n }\n\n results.push({\n signalId: 'oss.popularity',\n status: 'ok',\n fields: [\n { scope: 'additional', values: additional },\n ...(Object.keys(rootValues).length > 0\n ? [{ scope: 'root' as const, values: rootValues }]\n : []),\n ],\n provenance: {\n source: 'oss-popularity',\n subjectId: subject.id,\n fetchedAt: now,\n },\n });\n return results;\n };\n\n return {\n id: 'oss-popularity',\n produces: [\n 'oss.github_stars',\n 'oss.npm_downloads',\n 'oss.pypi_downloads',\n 'oss.popularity',\n ],\n timeoutMs: options.timeoutMs,\n includeRegistries: options.includeRegistries,\n excludeRegistries: options.excludeRegistries,\n appliesTo: options.appliesTo,\n collect,\n };\n}\n"],"names":[],"mappings":"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"}
@@ -1,233 +1,237 @@
1
- import { readString, isJsonObject } from "./standards-sdk.es198.js";
2
- import "./standards-sdk.es182.js";
3
- import "./standards-sdk.es195.js";
4
- import "./standards-sdk.es196.js";
5
- import "./standards-sdk.es197.js";
6
- import { parseTimestampMs } from "./standards-sdk.es123.js";
1
+ import { readString } from "./standards-sdk.es201.js";
2
+ import "./standards-sdk.es184.js";
3
+ import "./standards-sdk.es198.js";
4
+ import "./standards-sdk.es199.js";
5
+ import "./standards-sdk.es200.js";
6
+ import "./standards-sdk.es183.js";
7
7
  import { requestJson, Hcs25CollectorHttpError, isTimeoutError } from "./standards-sdk.es122.js";
8
- import { fetchX402OnchainUsageState } from "./standards-sdk.es134.js";
9
- const summaryValues = (summary) => ({
10
- x402UsageSummary: summary ? {
11
- volume7dUsd: summary.volume7dUsd ?? 0,
12
- volume24hUsd: summary.volume24hUsd ?? 0,
13
- inboundTrades7d: summary.inboundTrades7d ?? 0,
14
- outboundTrades7d: summary.outboundTrades7d ?? 0
15
- } : null
16
- });
17
- function hasProtocol(subject, wanted) {
18
- const normalized = wanted.toLowerCase();
19
- const direct = subject.protocol?.toLowerCase();
20
- if (direct === normalized) {
21
- return true;
8
+ const parsePositiveInt = (value) => {
9
+ if (typeof value === "number" && Number.isFinite(value)) {
10
+ const normalized = Math.floor(value);
11
+ return normalized > 0 ? normalized : null;
22
12
  }
23
- const metadataProtocol = typeof subject.metadata?.protocol === "string" ? subject.metadata.protocol.toLowerCase() : null;
24
- if (metadataProtocol === normalized) {
25
- return true;
13
+ if (typeof value === "string") {
14
+ const trimmed = value.trim();
15
+ if (!trimmed) {
16
+ return null;
17
+ }
18
+ const parsed = Number.parseInt(trimmed, 10);
19
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : null;
26
20
  }
27
- const list = subject.protocols;
28
- return Array.isArray(list) && list.some(
29
- (entry) => typeof entry === "string" && entry.toLowerCase() === normalized
30
- );
31
- }
32
- function hasX402Config(subject) {
21
+ return null;
22
+ };
23
+ const parseNonNegativeInt = (value) => {
24
+ if (typeof value === "number" && Number.isFinite(value)) {
25
+ const normalized = Math.floor(value);
26
+ return normalized >= 0 ? normalized : null;
27
+ }
28
+ if (typeof value === "string") {
29
+ const trimmed = value.trim();
30
+ if (!trimmed) {
31
+ return null;
32
+ }
33
+ const parsed = Number.parseInt(trimmed, 10);
34
+ return Number.isFinite(parsed) && parsed >= 0 ? parsed : null;
35
+ }
36
+ return null;
37
+ };
38
+ const parseChainIdFromNetworkKey = (networkKey) => {
39
+ if (typeof networkKey !== "string") {
40
+ return null;
41
+ }
42
+ const trimmed = networkKey.trim();
43
+ if (!trimmed) {
44
+ return null;
45
+ }
46
+ const match = /^eip155:(\d+)(?::|$)/i.exec(trimmed);
47
+ if (!match) {
48
+ return null;
49
+ }
50
+ const parsed = Number.parseInt(match[1], 10);
51
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : null;
52
+ };
53
+ const parseIdParts = (value) => {
54
+ if (typeof value !== "string") {
55
+ return null;
56
+ }
57
+ const trimmed = value.trim();
58
+ if (!trimmed) {
59
+ return null;
60
+ }
61
+ const separator = trimmed.indexOf(":");
62
+ if (separator <= 0 || separator !== trimmed.lastIndexOf(":")) {
63
+ return null;
64
+ }
65
+ const chainId = Number.parseInt(trimmed.slice(0, separator), 10);
66
+ const agentId = trimmed.slice(separator + 1);
67
+ if (!Number.isFinite(chainId) || chainId <= 0 || !agentId) {
68
+ return null;
69
+ }
70
+ return { chainId, agentId };
71
+ };
72
+ function parseErc8004NativeId(subject) {
33
73
  const metadata = subject.metadata ?? {};
34
- const configured = readString(metadata, "payTo") !== null && readString(metadata, "asset") !== null && readString(metadata, "network") !== null;
35
- return configured || hasProtocol(subject, "x402");
74
+ const idParts = parseIdParts(readString(metadata, "originalId")) ?? parseIdParts(readString(metadata, "nativeId")) ?? parseIdParts(readString(metadata, "uid"));
75
+ const agentId = parseNonNegativeInt(metadata["agentId"]) ?? (idParts ? parseNonNegativeInt(idParts.agentId) : null);
76
+ const chainId = parsePositiveInt(metadata["chainId"]) ?? parseChainIdFromNetworkKey(metadata["networkKey"]) ?? idParts?.chainId ?? null;
77
+ if (agentId === null || chainId === null) {
78
+ return null;
79
+ }
80
+ return { chainId, agentId: String(agentId) };
36
81
  }
37
- function readCursor(subject) {
38
- const raw = subject.metadata?.x402UsageCursor;
39
- return raw === void 0 ? void 0 : raw;
82
+ function createHttpErc8004FeedbackSource(options) {
83
+ return {
84
+ async getFeedbackSummary(subject, context) {
85
+ const nativeId = parseErc8004NativeId(subject);
86
+ if (!nativeId) {
87
+ return null;
88
+ }
89
+ const url = typeof options.endpoint === "function" ? options.endpoint(subject) : options.endpoint.replace("{nativeId}", `${nativeId.chainId}:${nativeId.agentId}`).replace("{chainId}", String(nativeId.chainId)).replace("{agentId}", nativeId.agentId);
90
+ if (!url) {
91
+ return null;
92
+ }
93
+ const data = await requestJson(url, {
94
+ fetch: context.fetch,
95
+ timeoutMs: context.timeoutMs,
96
+ signal: context.signal
97
+ });
98
+ const summary = data.summary ?? data;
99
+ const averageScore = typeof summary.averageScore === "number" ? summary.averageScore : null;
100
+ const totalFeedbacks = typeof summary.totalFeedbacks === "number" ? summary.totalFeedbacks : typeof data.count === "number" ? data.count : null;
101
+ if (averageScore === null && totalFeedbacks === null) {
102
+ return null;
103
+ }
104
+ return {
105
+ averageScore: averageScore ?? 0,
106
+ totalFeedbacks: totalFeedbacks ?? 0,
107
+ registry: summary.registry ?? "erc-8004",
108
+ network: summary.network ?? String(nativeId.chainId),
109
+ updatedAt: summary.updatedAt
110
+ };
111
+ }
112
+ };
40
113
  }
41
- function createX402SignalAdapter(options = {}) {
42
- const source = options.source ?? "onchain";
43
- const ttlMs = options.ttlMs ?? 6 * 60 * 60 * 1e3;
44
- const failureTtlMs = options.failureTtlMs ?? 3 * 60 * 60 * 1e3;
45
- const fetchUsage = options.fetchUsageState ?? fetchX402OnchainUsageState;
46
- const isHttpSource = typeof source === "string" && source !== "onchain";
47
- const isUrlFn = typeof source === "function";
114
+ const ERC8004_REPUTATION_ABI = [
115
+ "function getClients(uint256 agentId) view returns (address[])",
116
+ "function getSummary(uint256 agentId, address[] clientAddresses, string tag1, string tag2) view returns (uint64 count, int128 summaryValue, uint8 summaryValueDecimals)"
117
+ ];
118
+ function createOnchainErc8004FeedbackSource(options) {
119
+ const scoreScale = options.scoreScale ?? "auto";
120
+ return {
121
+ async getFeedbackSummary(subject) {
122
+ const nativeId = parseErc8004NativeId(subject);
123
+ if (!nativeId) {
124
+ return null;
125
+ }
126
+ const registry = options.registries[nativeId.chainId];
127
+ if (!registry) {
128
+ return null;
129
+ }
130
+ const contract = options.contractFor(nativeId.chainId, registry);
131
+ const agentId = BigInt(nativeId.agentId);
132
+ const clients = await contract.getClients(agentId);
133
+ if (clients.length === 0) {
134
+ return {
135
+ averageScore: 0,
136
+ totalFeedbacks: 0,
137
+ network: String(nativeId.chainId)
138
+ };
139
+ }
140
+ const [count, summaryValue, decimals] = await contract.getSummary(
141
+ agentId,
142
+ [...clients],
143
+ options.tag1 ?? "",
144
+ options.tag2 ?? ""
145
+ );
146
+ const raw = Number(summaryValue) / 10 ** Number(decimals);
147
+ const averageScore = scoreScale === "ratio5" ? raw * 20 : scoreScale === "percent" ? raw : raw <= 5 ? raw * 20 : raw;
148
+ return {
149
+ averageScore: Math.min(100, Math.max(0, averageScore)),
150
+ totalFeedbacks: Number(count),
151
+ network: String(nativeId.chainId)
152
+ };
153
+ }
154
+ };
155
+ }
156
+ const DEFAULT_INCLUDED_REGISTRIES = ["erc-8004"];
157
+ function statusFromError(error) {
158
+ return isTimeoutError(error) ? "timeout" : "error";
159
+ }
160
+ function createErc8004SignalAdapter(options) {
48
161
  const collect = async (subject, context) => {
49
162
  const now = context.now.toISOString();
50
- const metadata = subject.metadata ?? {};
51
- const payTo = readString(metadata, "payTo");
52
- const asset = readString(metadata, "asset");
53
- const network = readString(metadata, "network");
54
- const cursor = readCursor(subject);
55
- if (!context.force) {
56
- const storedStatus = readString(metadata, "x402UsageStatus");
57
- const storedUpdatedMs = parseTimestampMs(metadata.x402UsageUpdatedAt);
58
- if (storedStatus && storedUpdatedMs !== null) {
59
- const ttl = storedStatus === "ok" ? ttlMs : failureTtlMs;
60
- if (context.now.getTime() - storedUpdatedMs < ttl) {
61
- const storedSummary = isJsonObject(metadata.x402UsageSummary) ? metadata.x402UsageSummary : null;
62
- return [
63
- {
64
- signalId: "x402.usage",
65
- status: storedStatus === "ok" ? "ok" : "missing",
66
- value: storedSummary && typeof storedSummary.volume7dUsd === "number" ? storedSummary.volume7dUsd : null,
67
- provenance: {
68
- source: "x402",
69
- subjectId: payTo ?? subject.id,
70
- fetchedAt: metadata.x402UsageUpdatedAt
71
- }
72
- }
73
- ];
74
- }
75
- }
163
+ const nativeId = parseErc8004NativeId(subject);
164
+ if (!nativeId) {
165
+ return [{ signalId: "erc8004.feedback", status: "missing" }];
76
166
  }
77
- if (!options.fetchUsageState && (isHttpSource || isUrlFn)) {
78
- const resolved = isUrlFn ? source(subject) : source.replace("{payTo}", encodeURIComponent(payTo ?? "")).replace("{asset}", encodeURIComponent(asset ?? "")).replace("{network}", encodeURIComponent(network ?? ""));
79
- const url = typeof resolved === "string" ? resolved : null;
80
- if (!url) {
81
- return [{ signalId: "x402.usage", status: "missing" }];
82
- }
83
- const urlWithCursor = cursor && isJsonObject(cursor) && typeof cursor.cursor === "string" ? `${url}${url.includes("?") ? "&" : "?"}cursor=${encodeURIComponent(cursor.cursor)}` : url;
167
+ let lastError = null;
168
+ for (const source of options.sources) {
84
169
  try {
85
- const data = await requestJson(urlWithCursor, {
86
- fetch: context.fetch,
87
- timeoutMs: context.timeoutMs,
88
- signal: context.signal
89
- });
90
- const summary = data.summary ?? data;
91
- const values = {
92
- x402UsageStatus: "ok",
93
- x402UsageUpdatedAt: now,
94
- x402UsageSource: "indexer",
95
- ...summaryValues(summary)
96
- };
97
- const nextCursor = data.cursor ?? cursor;
98
- if (nextCursor !== void 0) {
99
- values.x402UsageCursor = nextCursor;
170
+ const summary = await source.getFeedbackSummary(subject, context);
171
+ if (!summary) {
172
+ continue;
100
173
  }
174
+ const averageScore = Math.min(
175
+ 100,
176
+ Math.max(0, Number(summary.averageScore) || 0)
177
+ );
178
+ const totalFeedbacks = Math.max(
179
+ 0,
180
+ Math.floor(Number(summary.totalFeedbacks) || 0)
181
+ );
182
+ const record = {
183
+ averageScore,
184
+ totalFeedbacks,
185
+ registry: summary.registry ?? subject.registry ?? "erc-8004",
186
+ network: summary.network ?? String(nativeId.chainId),
187
+ updatedAt: summary.updatedAt ?? now
188
+ };
101
189
  return [
102
190
  {
103
- signalId: "x402.usage",
191
+ signalId: "erc8004.feedback",
104
192
  status: "ok",
105
- value: summary.volume7dUsd ?? null,
106
- fields: [{ scope: "root", values }],
193
+ value: averageScore,
194
+ fields: [{ scope: "erc8004FeedbackSummary", values: record }],
107
195
  provenance: {
108
- source: "x402",
109
- sourceUrl: url,
110
- subjectId: payTo ?? subject.id,
196
+ source: "erc8004",
197
+ subjectId: `${nativeId.chainId}:${nativeId.agentId}`,
111
198
  fetchedAt: now
112
199
  }
113
200
  }
114
201
  ];
115
202
  } catch (error) {
116
- const missing = error instanceof Hcs25CollectorHttpError && error.status === 404;
117
- const status = missing ? "missing" : isTimeoutError(error) ? "timeout" : "error";
118
- return [
119
- {
120
- signalId: "x402.usage",
121
- status,
122
- fields: [
123
- {
124
- scope: "root",
125
- values: {
126
- x402UsageStatus: missing ? "missing" : "error",
127
- x402UsageUpdatedAt: now,
128
- x402UsageSource: "indexer"
129
- }
130
- }
131
- ]
132
- }
133
- ];
203
+ lastError = error;
204
+ continue;
134
205
  }
135
206
  }
136
- if (!payTo || !asset || !network) {
137
- return [
138
- {
139
- signalId: "x402.usage",
140
- status: "missing",
141
- fields: [
142
- {
143
- scope: "root",
144
- values: {
145
- x402UsageStatus: "missing",
146
- x402UsageUpdatedAt: now,
147
- x402UsageSource: "onchain",
148
- x402UsageSummary: null
149
- }
150
- }
151
- ]
152
- }
153
- ];
154
- }
155
- try {
156
- const { summary, cursor: nextCursor } = await fetchUsage(
157
- { network, asset, payTo, cursor },
158
- {
159
- days: options.days,
160
- ttlMs: options.ttlMs,
161
- maxRetries: options.maxRetries,
162
- chunkSizeBlocks: options.chunkSizeBlocks,
163
- rpcUrls: options.rpcUrls
164
- }
165
- );
166
- const values = {
167
- x402UsageStatus: summary ? "ok" : "missing",
168
- x402UsageUpdatedAt: now,
169
- x402UsageSource: "onchain",
170
- ...summaryValues(summary)
171
- };
172
- if (nextCursor !== null) {
173
- values.x402UsageCursor = nextCursor;
174
- } else if (cursor !== void 0) {
175
- values.x402UsageCursor = cursor;
207
+ if (lastError) {
208
+ if (lastError instanceof Hcs25CollectorHttpError && lastError.status === 404) {
209
+ return [{ signalId: "erc8004.feedback", status: "missing" }];
176
210
  }
177
211
  return [
178
212
  {
179
- signalId: "x402.usage",
180
- status: summary ? "ok" : "missing",
181
- value: summary?.volume7dUsd ?? null,
182
- fields: [{ scope: "root", values }],
183
- provenance: {
184
- source: "x402",
185
- subjectId: payTo,
186
- fetchedAt: now,
187
- params: { network, asset, source: "onchain" }
188
- }
189
- }
190
- ];
191
- } catch (error) {
192
- return [
193
- {
194
- signalId: "x402.usage",
195
- status: isTimeoutError(error) ? "timeout" : "error",
196
- fields: [
197
- {
198
- scope: "root",
199
- values: {
200
- x402UsageStatus: "error",
201
- x402UsageUpdatedAt: now,
202
- x402UsageSource: "onchain",
203
- x402UsageSummary: null,
204
- ...cursor !== void 0 ? { x402UsageCursor: cursor } : {}
205
- }
206
- }
207
- ]
213
+ signalId: "erc8004.feedback",
214
+ status: statusFromError(lastError)
208
215
  }
209
216
  ];
210
217
  }
218
+ return [{ signalId: "erc8004.feedback", status: "missing" }];
211
219
  };
212
220
  return {
213
- id: "x402",
214
- produces: ["x402.usage"],
221
+ id: "erc8004-feedback",
222
+ produces: ["erc8004.feedback"],
215
223
  timeoutMs: options.timeoutMs,
216
- // On-chain scans need network+asset+payTo; HTTP/custom sources only
217
- // need a payTo (or the x402 protocol marker) to query.
218
- appliesTo: options.appliesTo ?? ((subject) => {
219
- if (hasX402Config(subject)) {
220
- return true;
221
- }
222
- if (!isHttpSource && !isUrlFn && options.fetchUsageState === void 0) {
223
- return false;
224
- }
225
- return readString(subject.metadata ?? {}, "payTo") !== null;
226
- }),
224
+ includeRegistries: options.includeRegistries ?? DEFAULT_INCLUDED_REGISTRIES,
225
+ excludeRegistries: options.excludeRegistries,
226
+ appliesTo: options.appliesTo,
227
227
  collect
228
228
  };
229
229
  }
230
230
  export {
231
- createX402SignalAdapter
231
+ ERC8004_REPUTATION_ABI,
232
+ createErc8004SignalAdapter,
233
+ createHttpErc8004FeedbackSource,
234
+ createOnchainErc8004FeedbackSource,
235
+ parseErc8004NativeId
232
236
  };
233
237
  //# sourceMappingURL=standards-sdk.es133.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es133.js","sources":["../../src/hcs-25/collectors/x402.ts"],"sourcesContent":["import type { Hcs25JsonValue, Hcs25Subject } from '../types';\nimport { isJsonObject, readString } from '../signals';\nimport { parseTimestampMs } from './freshness';\nimport { Hcs25CollectorHttpError, isTimeoutError, requestJson } from './http';\nimport type {\n Hcs25CollectContext,\n Hcs25SignalAdapter,\n Hcs25SignalAdapterResult,\n} from './types';\nimport {\n fetchX402OnchainUsageState,\n type Hcs25X402OnchainUsageOptions,\n type Hcs25X402UsageStateParams,\n type Hcs25X402UsageStateResult,\n type Hcs25X402UsageSummary,\n} from './x402-onchain';\n\n/**\n * Pluggable usage-state fetcher (the on-chain scanner by default; inject a\n * stub in tests or a custom implementation for other networks).\n */\nexport type Hcs25X402UsageStateFetcher = (\n params: Hcs25X402UsageStateParams,\n options: Hcs25X402OnchainUsageOptions,\n) => Promise<Hcs25X402UsageStateResult>;\n\n/**\n * Options for the x402 usage signal adapter.\n */\nexport interface Hcs25X402SignalAdapterOptions\n extends Hcs25X402OnchainUsageOptions {\n /**\n * Usage source:\n * - `'onchain'` (default): scans ERC-20 `Transfer` events to/from\n * `metadata.payTo` on the `metadata.network` chain via viem.\n * - a URL template with `{payTo}`/`{asset}`/`{network}` placeholders, or a\n * function returning a URL: queries an HTTP usage indexer instead.\n */\n source?: 'onchain' | string | ((subject: Hcs25Subject) => string | null);\n /**\n * Fully custom usage-state source (e.g. a hosted scanner or a test stub).\n * Overrides `source` when provided.\n */\n fetchUsageState?: Hcs25X402UsageStateFetcher;\n /**\n * Refresh interval applied when the stored `x402UsageStatus` is `ok`.\n * Default 6 hours. The scan is skipped (and the stored summary echoed)\n * while fresh.\n */\n ttlMs?: number;\n /**\n * Refresh interval applied after non-`ok` states. Default 3 hours.\n */\n failureTtlMs?: number;\n /** Per-adapter timeout in milliseconds. */\n timeoutMs?: number;\n appliesTo?: (subject: Hcs25Subject) => boolean;\n}\n\ninterface X402IndexerResponse {\n volume7dUsd?: number;\n volume24hUsd?: number;\n inboundTrades7d?: number;\n outboundTrades7d?: number;\n cursor?: Hcs25JsonValue;\n summary?: {\n volume7dUsd?: number;\n volume24hUsd?: number;\n inboundTrades7d?: number;\n outboundTrades7d?: number;\n };\n}\n\nconst summaryValues = (\n summary: Partial<Hcs25X402UsageSummary> | null,\n): Record<string, Hcs25JsonValue> => ({\n x402UsageSummary: summary\n ? {\n volume7dUsd: summary.volume7dUsd ?? 0,\n volume24hUsd: summary.volume24hUsd ?? 0,\n inboundTrades7d: summary.inboundTrades7d ?? 0,\n outboundTrades7d: summary.outboundTrades7d ?? 0,\n }\n : null,\n});\n\nfunction hasProtocol(subject: Hcs25Subject, wanted: string): boolean {\n const normalized = wanted.toLowerCase();\n const direct = subject.protocol?.toLowerCase();\n if (direct === normalized) {\n return true;\n }\n const metadataProtocol =\n typeof subject.metadata?.protocol === 'string'\n ? subject.metadata.protocol.toLowerCase()\n : null;\n if (metadataProtocol === normalized) {\n return true;\n }\n const list = (subject as { protocols?: unknown }).protocols;\n return (\n Array.isArray(list) &&\n list.some(\n entry => typeof entry === 'string' && entry.toLowerCase() === normalized,\n )\n );\n}\n\nfunction hasX402Config(subject: Hcs25Subject): boolean {\n const metadata = subject.metadata ?? {};\n const configured =\n readString(metadata, 'payTo') !== null &&\n readString(metadata, 'asset') !== null &&\n readString(metadata, 'network') !== null;\n return configured || hasProtocol(subject, 'x402');\n}\n\nfunction readCursor(subject: Hcs25Subject): Hcs25JsonValue | undefined {\n const raw = subject.metadata?.x402UsageCursor;\n return raw === undefined ? undefined : raw;\n}\n\n/**\n * Creates the `x402` signal adapter: scans on-chain x402 payment activity\n * (USD volume + trade counts, chunked `Transfer` log scans resumable via\n * `x402UsageCursor`) or queries a configured HTTP usage indexer, and stores\n * the `x402Usage*` fields per the signal catalog. Fresh `ok` refreshes are\n * skipped per `ttlMs`/`failureTtlMs` unless `context.force` is set.\n */\nexport function createX402SignalAdapter(\n options: Hcs25X402SignalAdapterOptions = {},\n): Hcs25SignalAdapter {\n const source = options.source ?? 'onchain';\n const ttlMs = options.ttlMs ?? 6 * 60 * 60 * 1000;\n const failureTtlMs = options.failureTtlMs ?? 3 * 60 * 60 * 1000;\n\n const fetchUsage: Hcs25X402UsageStateFetcher =\n options.fetchUsageState ?? fetchX402OnchainUsageState;\n const isHttpSource = typeof source === 'string' && source !== 'onchain';\n const isUrlFn = typeof source === 'function';\n\n const collect = async (\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n ): Promise<Hcs25SignalAdapterResult[]> => {\n const now = context.now.toISOString();\n const metadata = subject.metadata ?? {};\n const payTo = readString(metadata, 'payTo');\n const asset = readString(metadata, 'asset');\n const network = readString(metadata, 'network');\n const cursor = readCursor(subject);\n\n // Freshness gate: skip the scan while stored fields are still fresh and\n // echo the stored summary so provenance keeps the original fetchedAt.\n if (!context.force) {\n const storedStatus = readString(metadata, 'x402UsageStatus');\n const storedUpdatedMs = parseTimestampMs(metadata.x402UsageUpdatedAt);\n if (storedStatus && storedUpdatedMs !== null) {\n const ttl = storedStatus === 'ok' ? ttlMs : failureTtlMs;\n if (context.now.getTime() - storedUpdatedMs < ttl) {\n const storedSummary = isJsonObject(metadata.x402UsageSummary)\n ? (metadata.x402UsageSummary as Record<string, Hcs25JsonValue>)\n : null;\n return [\n {\n signalId: 'x402.usage',\n status: storedStatus === 'ok' ? 'ok' : 'missing',\n value:\n storedSummary && typeof storedSummary.volume7dUsd === 'number'\n ? storedSummary.volume7dUsd\n : null,\n provenance: {\n source: 'x402',\n subjectId: payTo ?? subject.id,\n fetchedAt: metadata.x402UsageUpdatedAt as string,\n },\n },\n ];\n }\n }\n }\n\n if (!options.fetchUsageState && (isHttpSource || isUrlFn)) {\n const resolved = isUrlFn\n ? (source as (s: Hcs25Subject) => string | null)(subject)\n : (source as string)\n .replace('{payTo}', encodeURIComponent(payTo ?? ''))\n .replace('{asset}', encodeURIComponent(asset ?? ''))\n .replace('{network}', encodeURIComponent(network ?? ''));\n const url = typeof resolved === 'string' ? resolved : null;\n\n if (!url) {\n return [{ signalId: 'x402.usage', status: 'missing' }];\n }\n const urlWithCursor =\n cursor && isJsonObject(cursor) && typeof cursor.cursor === 'string'\n ? `${url}${url.includes('?') ? '&' : '?'}cursor=${encodeURIComponent(cursor.cursor)}`\n : url;\n try {\n const data = await requestJson<X402IndexerResponse>(urlWithCursor, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n const summary = data.summary ?? data;\n const values: Record<string, Hcs25JsonValue> = {\n x402UsageStatus: 'ok',\n x402UsageUpdatedAt: now,\n x402UsageSource: 'indexer',\n ...summaryValues(summary),\n };\n const nextCursor = data.cursor ?? cursor;\n if (nextCursor !== undefined) {\n values.x402UsageCursor = nextCursor;\n }\n return [\n {\n signalId: 'x402.usage',\n status: 'ok',\n value: summary.volume7dUsd ?? null,\n fields: [{ scope: 'root', values }],\n provenance: {\n source: 'x402',\n sourceUrl: url,\n subjectId: payTo ?? subject.id,\n fetchedAt: now,\n },\n },\n ];\n } catch (error) {\n const missing =\n error instanceof Hcs25CollectorHttpError && error.status === 404;\n const status = missing\n ? 'missing'\n : isTimeoutError(error)\n ? 'timeout'\n : 'error';\n return [\n {\n signalId: 'x402.usage',\n status,\n fields: [\n {\n scope: 'root',\n values: {\n x402UsageStatus: missing ? 'missing' : 'error',\n x402UsageUpdatedAt: now,\n x402UsageSource: 'indexer',\n },\n },\n ],\n },\n ];\n }\n }\n\n // On-chain scan (default, matching the production implementation).\n if (!payTo || !asset || !network) {\n return [\n {\n signalId: 'x402.usage',\n status: 'missing',\n fields: [\n {\n scope: 'root',\n values: {\n x402UsageStatus: 'missing',\n x402UsageUpdatedAt: now,\n x402UsageSource: 'onchain',\n x402UsageSummary: null,\n },\n },\n ],\n },\n ];\n }\n\n try {\n const { summary, cursor: nextCursor } = await fetchUsage(\n { network, asset, payTo, cursor },\n {\n days: options.days,\n ttlMs: options.ttlMs,\n maxRetries: options.maxRetries,\n chunkSizeBlocks: options.chunkSizeBlocks,\n rpcUrls: options.rpcUrls,\n },\n );\n const values: Record<string, Hcs25JsonValue> = {\n x402UsageStatus: summary ? 'ok' : 'missing',\n x402UsageUpdatedAt: now,\n x402UsageSource: 'onchain',\n ...summaryValues(summary),\n };\n if (nextCursor !== null) {\n values.x402UsageCursor = nextCursor as unknown as Hcs25JsonValue;\n } else if (cursor !== undefined) {\n values.x402UsageCursor = cursor;\n }\n return [\n {\n signalId: 'x402.usage',\n status: summary ? 'ok' : 'missing',\n value: summary?.volume7dUsd ?? null,\n fields: [{ scope: 'root', values }],\n provenance: {\n source: 'x402',\n subjectId: payTo,\n fetchedAt: now,\n params: { network, asset, source: 'onchain' },\n },\n },\n ];\n } catch (error) {\n return [\n {\n signalId: 'x402.usage',\n status: isTimeoutError(error) ? 'timeout' : 'error',\n fields: [\n {\n scope: 'root',\n values: {\n x402UsageStatus: 'error',\n x402UsageUpdatedAt: now,\n x402UsageSource: 'onchain',\n x402UsageSummary: null,\n ...(cursor !== undefined ? { x402UsageCursor: cursor } : {}),\n },\n },\n ],\n },\n ];\n }\n };\n\n return {\n id: 'x402',\n produces: ['x402.usage'],\n timeoutMs: options.timeoutMs,\n // On-chain scans need network+asset+payTo; HTTP/custom sources only\n // need a payTo (or the x402 protocol marker) to query.\n appliesTo:\n options.appliesTo ??\n ((subject: Hcs25Subject): boolean => {\n if (hasX402Config(subject)) {\n return true;\n }\n if (\n !isHttpSource &&\n !isUrlFn &&\n options.fetchUsageState === undefined\n ) {\n return false;\n }\n return readString(subject.metadata ?? {}, 'payTo') !== null;\n }),\n collect,\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standards-sdk.es133.js","sources":["../../src/hcs-25/collectors/erc8004.ts"],"sourcesContent":["import type { Hcs25JsonValue, Hcs25Subject } from '../types';\nimport { readString } from '../signals';\nimport { Hcs25CollectorHttpError, isTimeoutError, requestJson } from './http';\nimport type {\n Hcs25CollectContext,\n Hcs25SignalAdapter,\n Hcs25SignalAdapterResult,\n Hcs25SignalStatus,\n} from './types';\n\n/**\n * Parsed ERC-8004 feedback summary used by the scoring adapter.\n */\nexport interface Hcs25Erc8004FeedbackSummary {\n averageScore: number;\n totalFeedbacks: number;\n registry?: string;\n network?: string;\n updatedAt?: string;\n}\n\n/**\n * A feedback source: returns the summary for a subject or null when the\n * source has no data for it.\n */\nexport interface Hcs25Erc8004FeedbackSource {\n getFeedbackSummary(\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n ): Promise<Hcs25Erc8004FeedbackSummary | null>;\n}\n\nconst parsePositiveInt = (value: unknown): number | null => {\n if (typeof value === 'number' && Number.isFinite(value)) {\n const normalized = Math.floor(value);\n return normalized > 0 ? normalized : null;\n }\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n const parsed = Number.parseInt(trimmed, 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : null;\n }\n return null;\n};\n\nconst parseNonNegativeInt = (value: unknown): number | null => {\n if (typeof value === 'number' && Number.isFinite(value)) {\n const normalized = Math.floor(value);\n return normalized >= 0 ? normalized : null;\n }\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n const parsed = Number.parseInt(trimmed, 10);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : null;\n }\n return null;\n};\n\nconst parseChainIdFromNetworkKey = (networkKey: unknown): number | null => {\n if (typeof networkKey !== 'string') {\n return null;\n }\n const trimmed = networkKey.trim();\n if (!trimmed) {\n return null;\n }\n const match = /^eip155:(\\d+)(?::|$)/i.exec(trimmed);\n if (!match) {\n return null;\n }\n const parsed = Number.parseInt(match[1], 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : null;\n};\n\nconst parseIdParts = (\n value: unknown,\n): { chainId: number; agentId: string } | null => {\n if (typeof value !== 'string') {\n return null;\n }\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n const separator = trimmed.indexOf(':');\n if (separator <= 0 || separator !== trimmed.lastIndexOf(':')) {\n return null;\n }\n const chainId = Number.parseInt(trimmed.slice(0, separator), 10);\n const agentId = trimmed.slice(separator + 1);\n if (!Number.isFinite(chainId) || chainId <= 0 || !agentId) {\n return null;\n }\n return { chainId, agentId };\n};\n\n/**\n * Resolves the ERC-8004 `{chainId, agentId}` identity from subject metadata,\n * mirroring the registry-broker production adapter:\n *\n * 1. Explicit `metadata.agentId` + `metadata.chainId` (or\n * `metadata.networkKey` such as `eip155:8453`).\n * 2. `metadata.originalId` / `metadata.nativeId` / `metadata.uid` in\n * `{chainId}:{agentId}` form.\n */\nexport function parseErc8004NativeId(\n subject: Hcs25Subject,\n): { chainId: number; agentId: string } | null {\n const metadata = subject.metadata ?? {};\n\n const idParts =\n parseIdParts(readString(metadata, 'originalId')) ??\n parseIdParts(readString(metadata, 'nativeId')) ??\n parseIdParts(readString(metadata, 'uid'));\n\n const agentId =\n parseNonNegativeInt(metadata['agentId']) ??\n (idParts ? parseNonNegativeInt(idParts.agentId) : null);\n const chainId =\n parsePositiveInt(metadata['chainId']) ??\n parseChainIdFromNetworkKey(metadata['networkKey']) ??\n idParts?.chainId ??\n null;\n\n if (agentId === null || chainId === null) {\n return null;\n }\n return { chainId, agentId: String(agentId) };\n}\n\n/**\n * Options for the HTTP indexer feedback source.\n */\nexport interface Hcs25Erc8004IndexerSourceOptions {\n /**\n * Indexer endpoint template; `{nativeId}`, `{chainId}`, and `{agentId}`\n * placeholders are substituted, or provide a function returning the URL.\n */\n endpoint: string | ((subject: Hcs25Subject) => string | null);\n}\n\ninterface Erc8004IndexerResponse {\n averageScore?: number;\n totalFeedbacks?: number;\n count?: number;\n registry?: string;\n network?: string;\n updatedAt?: string;\n summary?: {\n averageScore?: number;\n totalFeedbacks?: number;\n registry?: string;\n network?: string;\n updatedAt?: string;\n };\n}\n\n/**\n * Creates a feedback source that queries an HTTP indexer exposing ERC-8004\n * reputation summaries as JSON.\n */\nexport function createHttpErc8004FeedbackSource(\n options: Hcs25Erc8004IndexerSourceOptions,\n): Hcs25Erc8004FeedbackSource {\n return {\n async getFeedbackSummary(subject, context) {\n const nativeId = parseErc8004NativeId(subject);\n if (!nativeId) {\n return null;\n }\n const url =\n typeof options.endpoint === 'function'\n ? options.endpoint(subject)\n : options.endpoint\n .replace('{nativeId}', `${nativeId.chainId}:${nativeId.agentId}`)\n .replace('{chainId}', String(nativeId.chainId))\n .replace('{agentId}', nativeId.agentId);\n if (!url) {\n return null;\n }\n const data = await requestJson<Erc8004IndexerResponse>(url, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n const summary = data.summary ?? data;\n const averageScore =\n typeof summary.averageScore === 'number' ? summary.averageScore : null;\n const totalFeedbacks =\n typeof summary.totalFeedbacks === 'number'\n ? summary.totalFeedbacks\n : typeof (data as Erc8004IndexerResponse).count === 'number'\n ? (data as Erc8004IndexerResponse).count!\n : null;\n if (averageScore === null && totalFeedbacks === null) {\n return null;\n }\n return {\n averageScore: averageScore ?? 0,\n totalFeedbacks: totalFeedbacks ?? 0,\n registry: summary.registry ?? 'erc-8004',\n network: summary.network ?? String(nativeId.chainId),\n updatedAt: summary.updatedAt,\n };\n },\n };\n}\n\nconst ERC8004_REPUTATION_ABI = [\n 'function getClients(uint256 agentId) view returns (address[])',\n 'function getSummary(uint256 agentId, address[] clientAddresses, string tag1, string tag2) view returns (uint64 count, int128 summaryValue, uint8 summaryValueDecimals)',\n] as const;\n\n/**\n * Minimal contract-call surface needed from an ethers provider/signer or a\n * duck-typed `ethers.Contract`. Callers may also pass a fully custom\n * `readContract` implementation.\n */\nexport interface Hcs25Erc8004ContractCaller {\n getClients(agentId: bigint): Promise<readonly string[]>;\n getSummary(\n agentId: bigint,\n clientAddresses: readonly string[],\n tag1: string,\n tag2: string,\n ): Promise<readonly [bigint, bigint, bigint]>;\n}\n\n/**\n * Options for the on-chain feedback source (EVM ERC-8004 networks).\n */\nexport interface Hcs25Erc8004OnchainSourceOptions {\n /**\n * Registry contract address per chainId (e.g. `{11155111: '0x…'}`).\n */\n registries: Record<number, string>;\n /**\n * Contract factory per chainId: `(registryAddress, agentId)` → caller.\n * Build it with ethers: `new ethers.Contract(addr, ERC8004_ABI, provider)`.\n */\n contractFor: (\n chainId: number,\n registry: string,\n ) => Hcs25Erc8004ContractCaller;\n /**\n * Interpretation of the raw summary value: `auto` treats values ≤5 as a\n * 0–5 scale scaled ×20, ≤100 as already 0–100.\n */\n scoreScale?: 'auto' | 'ratio5' | 'percent';\n tag1?: string;\n tag2?: string;\n}\n\n/**\n * Creates a feedback source that reads the ERC-8004 Reputation Registry\n * contract directly: `getClients(agentId)` then\n * `getSummary(agentId, clients, tag1, tag2)`.\n */\nexport function createOnchainErc8004FeedbackSource(\n options: Hcs25Erc8004OnchainSourceOptions,\n): Hcs25Erc8004FeedbackSource {\n const scoreScale = options.scoreScale ?? 'auto';\n return {\n async getFeedbackSummary(subject) {\n const nativeId = parseErc8004NativeId(subject);\n if (!nativeId) {\n return null;\n }\n const registry = options.registries[nativeId.chainId];\n if (!registry) {\n return null;\n }\n const contract = options.contractFor(nativeId.chainId, registry);\n const agentId = BigInt(nativeId.agentId);\n const clients = await contract.getClients(agentId);\n if (clients.length === 0) {\n return {\n averageScore: 0,\n totalFeedbacks: 0,\n network: String(nativeId.chainId),\n };\n }\n const [count, summaryValue, decimals] = await contract.getSummary(\n agentId,\n [...clients],\n options.tag1 ?? '',\n options.tag2 ?? '',\n );\n const raw = Number(summaryValue) / 10 ** Number(decimals);\n const averageScore =\n scoreScale === 'ratio5'\n ? raw * 20\n : scoreScale === 'percent'\n ? raw\n : raw <= 5\n ? raw * 20\n : raw;\n return {\n averageScore: Math.min(100, Math.max(0, averageScore)),\n totalFeedbacks: Number(count),\n network: String(nativeId.chainId),\n };\n },\n };\n}\n\n/**\n * Options for the ERC-8004 feedback signal adapter.\n */\nexport interface Hcs25Erc8004SignalAdapterOptions {\n /** One or more feedback sources; the first non-null summary wins. */\n sources: readonly Hcs25Erc8004FeedbackSource[];\n timeoutMs?: number;\n includeRegistries?: readonly string[];\n excludeRegistries?: readonly string[];\n appliesTo?: (subject: Hcs25Subject) => boolean;\n}\n\nconst DEFAULT_INCLUDED_REGISTRIES: readonly string[] = ['erc-8004'];\n\nfunction statusFromError(error: unknown): Hcs25SignalStatus {\n return isTimeoutError(error) ? 'timeout' : 'error';\n}\n\n/**\n * Creates the `erc8004-feedback` signal adapter: resolves the subject's\n * `chainId:agentId` identity, queries configured feedback sources (HTTP\n * indexer and/or on-chain via ethers), and writes\n * `metadata.erc8004FeedbackSummary`.\n */\nexport function createErc8004SignalAdapter(\n options: Hcs25Erc8004SignalAdapterOptions,\n): Hcs25SignalAdapter {\n const collect = async (\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n ): Promise<Hcs25SignalAdapterResult[]> => {\n const now = context.now.toISOString();\n const nativeId = parseErc8004NativeId(subject);\n if (!nativeId) {\n return [{ signalId: 'erc8004.feedback', status: 'missing' }];\n }\n\n let lastError: unknown = null;\n for (const source of options.sources) {\n try {\n const summary = await source.getFeedbackSummary(subject, context);\n if (!summary) {\n continue;\n }\n const averageScore = Math.min(\n 100,\n Math.max(0, Number(summary.averageScore) || 0),\n );\n const totalFeedbacks = Math.max(\n 0,\n Math.floor(Number(summary.totalFeedbacks) || 0),\n );\n const record: Record<string, Hcs25JsonValue> = {\n averageScore,\n totalFeedbacks,\n registry: summary.registry ?? subject.registry ?? 'erc-8004',\n network: summary.network ?? String(nativeId.chainId),\n updatedAt: summary.updatedAt ?? now,\n };\n return [\n {\n signalId: 'erc8004.feedback',\n status: 'ok',\n value: averageScore,\n fields: [{ scope: 'erc8004FeedbackSummary', values: record }],\n provenance: {\n source: 'erc8004',\n subjectId: `${nativeId.chainId}:${nativeId.agentId}`,\n fetchedAt: now,\n },\n },\n ];\n } catch (error) {\n lastError = error;\n continue;\n }\n }\n\n if (lastError) {\n if (\n lastError instanceof Hcs25CollectorHttpError &&\n lastError.status === 404\n ) {\n return [{ signalId: 'erc8004.feedback', status: 'missing' }];\n }\n return [\n {\n signalId: 'erc8004.feedback',\n status: statusFromError(lastError),\n },\n ];\n }\n return [{ signalId: 'erc8004.feedback', status: 'missing' }];\n };\n\n return {\n id: 'erc8004-feedback',\n produces: ['erc8004.feedback'],\n timeoutMs: options.timeoutMs,\n includeRegistries: options.includeRegistries ?? DEFAULT_INCLUDED_REGISTRIES,\n excludeRegistries: options.excludeRegistries,\n appliesTo: options.appliesTo,\n collect,\n };\n}\n\nexport { ERC8004_REPUTATION_ABI };\n"],"names":[],"mappings":"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"}