@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,382 +1,172 @@
1
- import { readSubjectAdditional, isJsonObject, readString } 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";
7
- import { stripTrailingSlashes, requestJson, Hcs25CollectorHttpError, isTimeoutError } from "./standards-sdk.es122.js";
8
- const ETHOS_API_BASE_URL = "https://api.ethos.network";
9
- const DEFAULT_CLIENT_ID = "standards-sdk";
10
- const EMBEDDED_EVM_ADDRESS_PATTERN = /0x[0-9a-fA-F]{40}/;
11
- const TWITTER_HANDLE_PATTERN = /^[a-zA-Z0-9_]{1,64}$/;
12
- const DEFAULT_EXCLUDED_REGISTRIES = [
13
- "openrouter",
14
- "near-ai",
15
- "agentverse",
16
- "uagent"
17
- ];
18
- const normalizeRegistry = (value) => typeof value === "string" ? value.trim().toLowerCase() : "";
19
- const extractAddress = (value) => {
20
- if (typeof value !== "string") {
1
+ import { resolveSubjectEndpoint } from "./standards-sdk.es127.js";
2
+ import { isTimeoutError } from "./standards-sdk.es122.js";
3
+ const MCP_PROTOCOL_VERSION = "2024-11-05";
4
+ async function fetchOk(context, url, init) {
5
+ const response = await context.fetch(url, {
6
+ ...init,
7
+ signal: context.signal
8
+ });
9
+ return response.status < 500;
10
+ }
11
+ const mcpConnectivityProbe = async (subject, context) => {
12
+ const endpoint = resolveSubjectEndpoint(subject);
13
+ if (!endpoint) {
21
14
  return null;
22
15
  }
23
- const match = EMBEDDED_EVM_ADDRESS_PATTERN.exec(value.trim());
24
- return match ? match[0] : null;
16
+ const ok = await fetchOk(context, endpoint, {
17
+ method: "POST",
18
+ headers: {
19
+ "content-type": "application/json",
20
+ accept: "application/json, text/event-stream"
21
+ },
22
+ body: JSON.stringify({
23
+ jsonrpc: "2.0",
24
+ id: 1,
25
+ method: "initialize",
26
+ params: {
27
+ protocolVersion: MCP_PROTOCOL_VERSION,
28
+ capabilities: {},
29
+ clientInfo: { name: "hcs-25-connectivity-probe", version: "1" }
30
+ }
31
+ })
32
+ });
33
+ return ok ? 100 : 0;
25
34
  };
26
- function normalizeEthosUserkey(value) {
27
- if (typeof value !== "string") {
28
- return null;
29
- }
30
- const trimmed = value.trim();
31
- if (!trimmed) {
35
+ const a2aConnectivityProbe = async (subject, context) => {
36
+ const endpoint = resolveSubjectEndpoint(subject);
37
+ if (!endpoint) {
32
38
  return null;
33
39
  }
34
- if (trimmed.includes(":")) {
35
- return trimmed;
36
- }
37
- const address = extractAddress(trimmed);
38
- return address ? `address:${address}` : null;
39
- }
40
- const userkeyKind = (userkey) => {
41
- const trimmed = userkey.trim();
42
- if (trimmed.startsWith("address:")) {
43
- return "address";
44
- }
45
- if (trimmed.startsWith("service:x.com:")) {
46
- return "x";
47
- }
48
- return "explicit";
40
+ const cardUrl = endpoint.includes("/.well-known/") ? endpoint : new URL("/.well-known/agent.json", endpoint).toString();
41
+ const ok = await fetchOk(context, cardUrl);
42
+ return ok ? 100 : 0;
49
43
  };
50
- const normalizeTwitterHandle = (value) => {
51
- if (typeof value !== "string") {
44
+ const httpConnectivityProbe = async (subject, context) => {
45
+ const endpoint = resolveSubjectEndpoint(subject);
46
+ if (!endpoint) {
52
47
  return null;
53
48
  }
54
- const withoutAt = value.trim().replace(/^@/, "").replace(/\s+/g, "");
55
- return TWITTER_HANDLE_PATTERN.test(withoutAt) ? withoutAt : null;
49
+ const ok = await fetchOk(context, endpoint);
50
+ return ok ? 100 : 0;
56
51
  };
57
- const extractTwitterFromSocials = (profile) => {
58
- if (!isJsonObject(profile)) {
59
- return null;
60
- }
61
- const socials = profile.socials;
62
- if (!Array.isArray(socials)) {
63
- return null;
64
- }
65
- for (const entry of socials) {
66
- if (!isJsonObject(entry)) {
67
- continue;
68
- }
69
- const platform = normalizeRegistry(
70
- entry.platform
71
- );
72
- if (platform !== "twitter" && platform !== "x") {
73
- continue;
74
- }
75
- const handle = normalizeTwitterHandle(
76
- entry.handle
77
- );
78
- if (handle) {
79
- return handle;
80
- }
81
- }
82
- return null;
52
+ const DEFAULT_PROBES = {
53
+ mcp: mcpConnectivityProbe,
54
+ a2a: a2aConnectivityProbe
83
55
  };
84
- function isEthosExcluded(subject) {
85
- const registry = normalizeRegistry(subject.registry);
86
- const metadata = subject.metadata ?? {};
87
- const protocol = normalizeRegistry(
88
- metadata.protocol
89
- );
90
- const protocols = Array.isArray(
91
- subject.protocols
92
- ) ? (subject.protocols ?? []).filter((v) => typeof v === "string").map(normalizeRegistry) : [];
93
- return registry === "agentverse" || registry === "uagent" || protocol === "uagent" || protocols.includes("uagent");
94
- }
95
- function deriveEthosSources(subject) {
96
- const metadata = subject.metadata ?? {};
97
- const registry = normalizeRegistry(subject.registry);
98
- const additional = readSubjectAdditional(subject);
99
- const epoch = (/* @__PURE__ */ new Date(0)).toISOString();
100
- const push = (list, userkey, kind, weight) => {
101
- if (!list.some((source) => source.userkey === userkey)) {
102
- list.push({
103
- userkey,
104
- kind,
105
- weight,
106
- status: "missing",
107
- score: null,
108
- updatedAt: epoch
109
- });
110
- }
111
- };
112
- const sources = [];
113
- const trustProviderIds = isJsonObject(metadata.trustProviderIds) ? metadata.trustProviderIds : void 0;
114
- const trustProviders = isJsonObject(metadata.trust) && isJsonObject(metadata.trust.providers) ? metadata.trust.providers : void 0;
115
- for (const candidate of [
116
- trustProviderIds?.ethos,
117
- trustProviders?.ethos,
118
- metadata.ethosUserkey
119
- ]) {
120
- const userkey = normalizeEthosUserkey(candidate);
121
- if (userkey) {
122
- push(sources, userkey, userkeyKind(userkey), 1);
123
- return sources;
124
- }
125
- }
126
- const metadataRecord = metadata;
127
- const profileSocials = extractTwitterFromSocials(metadataRecord.profile) ?? extractTwitterFromSocials(subject.profile);
128
- if (registry === "virtuals-protocol") {
129
- const handle = normalizeTwitterHandle(metadataRecord.twitterHandle) ?? normalizeTwitterHandle(metadataRecord.memeTwitterHandle) ?? profileSocials;
130
- if (handle) {
131
- push(sources, `service:x.com:username:${handle}`, "x", 0.7);
132
- }
133
- } else if (registry === "moltbook") {
134
- const owner = isJsonObject(metadataRecord.moltbook) ? normalizeTwitterHandle(
135
- metadataRecord.moltbook.owner
136
- ) : null;
137
- const handle = owner ?? profileSocials;
138
- if (handle) {
139
- push(sources, `service:x.com:username:${handle}`, "x", 1);
140
- }
141
- } else {
142
- const genericHandle = [
143
- readString(additional, "twitter"),
144
- readString(additional, "xHandle"),
145
- readString(additional, "x"),
146
- readString(additional, "twitterHandle"),
147
- readString(metadataRecord, "twitter"),
148
- readString(metadataRecord, "xHandle"),
149
- readString(metadataRecord, "x"),
150
- profileSocials
151
- ].map(normalizeTwitterHandle).find((handle) => handle !== null);
152
- if (genericHandle) {
153
- push(sources, `service:x.com:username:${genericHandle}`, "x", 1);
154
- }
155
- }
156
- const addressCandidates = [
157
- metadataRecord.agentAddress,
158
- metadataRecord.ownerAddress,
159
- metadataRecord.payTo,
160
- metadataRecord.agentAddressCaip,
161
- metadataRecord.nativeId,
162
- metadataRecord.address,
163
- metadataRecord.evmAddress,
164
- metadataRecord.uid
165
- ];
166
- for (const candidate of addressCandidates) {
167
- const address = extractAddress(candidate);
168
- if (!address) {
169
- continue;
170
- }
171
- const weightedRegistry = registry === "virtuals-protocol" || registry === "moltbook";
172
- const weight = weightedRegistry && sources.some((source) => source.kind === "x") ? 0.3 : 1;
173
- push(sources, `address:${address}`, "address", weight);
174
- break;
175
- }
176
- return sources;
177
- }
178
- const pickPrimaryUserkey = (sources) => sources.find((source) => source.kind === "address")?.userkey ?? sources[0]?.userkey ?? null;
179
- function readStoredSources(subject) {
180
- const raw = subject.metadata?.ethosSources;
181
- if (!Array.isArray(raw)) {
182
- return [];
183
- }
184
- const out = [];
185
- for (const entry of raw) {
186
- if (!isJsonObject(entry)) {
187
- continue;
188
- }
189
- const record = entry;
190
- const userkey = readString(record, "userkey");
191
- if (!userkey) {
192
- continue;
193
- }
194
- const rawKind = readString(record, "kind");
195
- const rawStatus = readString(record, "status");
196
- const score = record.score;
197
- out.push({
198
- userkey,
199
- kind: rawKind === "x" || rawKind === "address" || rawKind === "explicit" ? rawKind : userkeyKind(userkey),
200
- weight: typeof record.weight === "number" && Number.isFinite(record.weight) ? Math.max(0, record.weight) : 1,
201
- status: rawStatus === "ok" || rawStatus === "error" ? rawStatus : "missing",
202
- score: typeof score === "number" && Number.isFinite(score) ? score : null,
203
- updatedAt: readString(record, "updatedAt") ?? (/* @__PURE__ */ new Date(0)).toISOString()
204
- });
205
- }
206
- return out;
207
- }
208
- function createEthosSignalAdapter(options = {}) {
209
- const baseUrl = stripTrailingSlashes(options.baseUrl ?? ETHOS_API_BASE_URL);
210
- const resolveSources = options.sources ?? deriveEthosSources;
211
- const ttlMs = options.ttlMs ?? 12 * 60 * 60 * 1e3;
212
- const failureTtlMs = options.failureTtlMs ?? 6 * 60 * 60 * 1e3;
213
- const maxRetries = options.maxRetries ?? 2;
214
- const inferAddress = options.inferAddress ?? true;
215
- const clientId = options.client ?? DEFAULT_CLIENT_ID;
56
+ const DEFAULT_EXCLUDED_REGISTRIES = [
57
+ "openrouter",
58
+ "near-ai"
59
+ ];
60
+ function createConnectivitySignalAdapter(options = {}) {
61
+ const probes = { ...DEFAULT_PROBES, ...options.probes };
216
62
  const collect = async (subject, context) => {
217
- const now = context.now.toISOString();
218
- const resolved = (() => {
219
- const sources = resolveSources(subject);
220
- return inferAddress ? [...sources] : sources.filter((source) => source.kind !== "address");
221
- })();
222
- if (resolved.length === 0) {
63
+ const now = context.now;
64
+ const protocol = subject.protocol?.toLowerCase();
65
+ const protocolProbe = protocol ? probes[protocol] : void 0;
66
+ const defaultProbe = probes.default ?? httpConnectivityProbe;
67
+ const namedTargets = Object.keys(probes).filter(
68
+ (key) => key !== protocol && key !== "default" && !(key in DEFAULT_PROBES)
69
+ );
70
+ const results = [];
71
+ const targets = {};
72
+ let primaryScore = null;
73
+ let primaryStatus = "ok";
74
+ let probed = false;
75
+ const runProbe = async (probe, signalId, target) => {
76
+ try {
77
+ const score = await probe(subject, context);
78
+ if (score === null) {
79
+ return;
80
+ }
81
+ probed = true;
82
+ const clamped = Math.min(100, Math.max(0, score));
83
+ if (target) {
84
+ targets[target] = clamped;
85
+ } else {
86
+ primaryScore = clamped;
87
+ }
88
+ results.push({
89
+ signalId,
90
+ status: "ok",
91
+ value: clamped,
92
+ provenance: {
93
+ source: "connectivity-probe",
94
+ sourceUrl: resolveSubjectEndpoint(subject) ?? void 0,
95
+ subjectId: subject.id,
96
+ fetchedAt: now.toISOString()
97
+ }
98
+ });
99
+ } catch (error) {
100
+ probed = true;
101
+ const status = isTimeoutError(error) ? "timeout" : "error";
102
+ if (!target) {
103
+ primaryStatus = status;
104
+ primaryScore = 0;
105
+ }
106
+ results.push({
107
+ signalId,
108
+ status,
109
+ provenance: {
110
+ source: "connectivity-probe",
111
+ subjectId: subject.id,
112
+ fetchedAt: now.toISOString()
113
+ }
114
+ });
115
+ }
116
+ };
117
+ await runProbe(protocolProbe ?? defaultProbe, "connectivity.probe");
118
+ for (const target of namedTargets) {
119
+ await runProbe(probes[target], `connectivity.${target}`, target);
120
+ }
121
+ if (!probed) {
223
122
  return [
224
123
  {
225
- signalId: "ethos.score",
124
+ signalId: "connectivity.probe",
226
125
  status: "missing",
227
126
  fields: [
228
127
  {
229
- scope: "root",
230
- values: {
231
- ethosScore: null,
232
- ethosScoreStatus: "missing",
233
- ethosScoreUpdatedAt: now,
234
- ethosSources: []
235
- }
128
+ scope: "additional",
129
+ values: { connectivityStatus: "missing" }
236
130
  }
237
131
  ]
238
132
  }
239
133
  ];
240
134
  }
241
- const storedByUserkey = new Map(
242
- readStoredSources(subject).map((source) => [source.userkey, source])
243
- );
244
- const merged = resolved.map((source) => {
245
- const stored = storedByUserkey.get(source.userkey);
246
- return {
247
- ...source,
248
- status: stored?.status ?? source.status ?? "missing",
249
- score: stored?.score ?? source.score ?? null,
250
- updatedAt: stored?.updatedAt ?? source.updatedAt
251
- };
252
- });
253
- const toRefresh = merged.filter((source) => {
254
- if (context.force) {
255
- return true;
256
- }
257
- const updatedMs = parseTimestampMs(source.updatedAt);
258
- if (updatedMs === null || updatedMs <= 0) {
259
- return true;
260
- }
261
- const ttl = source.status === "ok" ? ttlMs : failureTtlMs;
262
- return context.now.getTime() - updatedMs >= ttl;
263
- });
264
- const headers = { "X-Ethos-Client": clientId };
265
- let sawTimeout = false;
266
- await Promise.all(
267
- toRefresh.map(async (source) => {
268
- const url = `${baseUrl}/api/v1/score/${encodeURIComponent(source.userkey)}`;
269
- try {
270
- const data = await requestJson(url, {
271
- fetch: context.fetch,
272
- headers,
273
- timeoutMs: context.timeoutMs,
274
- signal: context.signal,
275
- maxRetries
276
- });
277
- const score = typeof data?.data?.score === "number" && Number.isFinite(data.data.score) ? data.data.score : typeof data?.score === "number" && Number.isFinite(data.score) ? data.score : null;
278
- source.updatedAt = now;
279
- if (data?.ok === false || score === null) {
280
- source.status = "missing";
281
- source.score = null;
282
- } else {
283
- source.status = "ok";
284
- source.score = score;
285
- }
286
- } catch (error) {
287
- source.updatedAt = now;
288
- if (error instanceof Hcs25CollectorHttpError) {
289
- if (error.status === 404) {
290
- source.status = "missing";
291
- source.score = null;
292
- } else {
293
- source.status = "error";
294
- source.score = source.score ?? null;
295
- }
296
- } else if (isTimeoutError(error)) {
297
- source.status = "error";
298
- sawTimeout = true;
299
- } else {
300
- source.status = "error";
301
- }
302
- }
303
- })
304
- );
305
- const scoredSources = merged.filter(
306
- (source) => typeof source.score === "number" && Number.isFinite(source.score)
307
- );
308
- const weightSum = scoredSources.reduce(
309
- (sum, source) => sum + Math.max(0, source.weight),
310
- 0
311
- );
312
- const composite = weightSum > 0 ? Math.round(
313
- scoredSources.reduce(
314
- (sum, source) => sum + source.weight * (source.score ?? 0),
315
- 0
316
- ) / weightSum * 100
317
- ) / 100 : null;
318
- const compositeStatus = merged.some(
319
- (source) => source.status === "ok"
320
- ) ? "ok" : merged.some((source) => source.status === "error") ? "error" : "missing";
321
- const weights = {};
322
- for (const source of merged) {
323
- weights[source.kind] = Math.round(((weights[source.kind] ?? 0) + source.weight) * 100) / 100;
135
+ const additional = {
136
+ connectivityStatus: primaryStatus === "ok" ? "ok" : primaryStatus
137
+ };
138
+ if (primaryScore !== null) {
139
+ additional.connectivityScore = primaryScore;
140
+ }
141
+ if (Object.keys(targets).length > 0) {
142
+ additional.connectivityTargets = { ...targets };
324
143
  }
325
- const signalStatus = compositeStatus === "ok" ? "ok" : sawTimeout ? "timeout" : compositeStatus === "error" ? "error" : "missing";
144
+ const last = results[results.length - 1];
326
145
  return [
146
+ ...results,
327
147
  {
328
- signalId: "ethos.score",
329
- status: signalStatus,
330
- value: composite,
331
- fields: [
332
- {
333
- scope: "root",
334
- values: {
335
- ethosUserkey: pickPrimaryUserkey(merged),
336
- ethosScore: composite,
337
- ethosScoreStatus: compositeStatus,
338
- ethosScoreUpdatedAt: now,
339
- ethosSources: merged.map((source) => ({
340
- userkey: source.userkey,
341
- kind: source.kind,
342
- weight: source.weight,
343
- status: source.status ?? "missing",
344
- score: source.score ?? null,
345
- updatedAt: source.updatedAt ?? now
346
- })),
347
- ethosComposite: {
348
- version: 1,
349
- score: composite,
350
- updatedAt: now,
351
- weights
352
- }
353
- }
354
- }
355
- ],
356
- provenance: {
357
- source: "ethos",
358
- sourceUrl: `${baseUrl}/api/v1/score`,
359
- subjectId: subject.id,
360
- fetchedAt: now,
361
- params: { userkeys: merged.map((source) => source.userkey) }
362
- }
148
+ signalId: "connectivity.score",
149
+ status: primaryStatus === "ok" ? "ok" : primaryStatus,
150
+ value: primaryScore ?? void 0,
151
+ fields: [{ scope: "additional", values: additional }],
152
+ provenance: last?.provenance
363
153
  }
364
154
  ];
365
155
  };
366
156
  return {
367
- id: "ethos",
368
- produces: ["ethos.score"],
157
+ id: "connectivity",
158
+ produces: ["connectivity.probe", "connectivity.score"],
369
159
  timeoutMs: options.timeoutMs,
370
160
  includeRegistries: options.includeRegistries,
371
161
  excludeRegistries: options.excludeRegistries ?? DEFAULT_EXCLUDED_REGISTRIES,
372
- appliesTo: options.appliesTo ?? ((subject) => !isEthosExcluded(subject)),
162
+ appliesTo: options.appliesTo,
373
163
  collect
374
164
  };
375
165
  }
376
166
  export {
377
- createEthosSignalAdapter,
378
- deriveEthosSources,
379
- isEthosExcluded,
380
- normalizeEthosUserkey
167
+ a2aConnectivityProbe,
168
+ createConnectivitySignalAdapter,
169
+ httpConnectivityProbe,
170
+ mcpConnectivityProbe
381
171
  };
382
172
  //# sourceMappingURL=standards-sdk.es130.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es130.js","sources":["../../src/hcs-25/collectors/ethos.ts"],"sourcesContent":["import type { Hcs25JsonValue, Hcs25Subject } from '../types';\nimport { isJsonObject, readString, readSubjectAdditional } from '../signals';\nimport { parseTimestampMs } from './freshness';\nimport {\n Hcs25CollectorHttpError,\n isTimeoutError,\n requestJson,\n stripTrailingSlashes,\n} from './http';\nimport type {\n Hcs25CollectContext,\n Hcs25SignalAdapter,\n Hcs25SignalAdapterResult,\n} from './types';\n\nconst ETHOS_API_BASE_URL = 'https://api.ethos.network';\nconst DEFAULT_CLIENT_ID = 'standards-sdk';\nconst EMBEDDED_EVM_ADDRESS_PATTERN = /0x[0-9a-fA-F]{40}/;\nconst TWITTER_HANDLE_PATTERN = /^[a-zA-Z0-9_]{1,64}$/;\n\ntype EthosSourceKind = 'explicit' | 'x' | 'address';\ntype EthosStoredStatus = 'ok' | 'missing' | 'error';\n\n/**\n * A resolved Ethos userkey source: the userkey, how it was derived, and its\n * composite weight (per the ethos signal document's `ethosSources` schema).\n */\nexport interface Hcs25EthosSource {\n userkey: string;\n kind: EthosSourceKind;\n weight: number;\n status?: EthosStoredStatus;\n score?: number | null;\n updatedAt?: string;\n}\n\n/**\n * Options for the Ethos signal adapter.\n */\nexport interface Hcs25EthosSignalAdapterOptions {\n /**\n * Ethos API base URL; the collector requests\n * `{baseUrl}/api/v1/score/{userkey}` (the production v1 endpoint, which\n * returns an `{ok, data: {score}}` envelope). Default\n * `https://api.ethos.network`.\n */\n baseUrl?: string;\n /** `X-Ethos-Client` identifier sent with every request. */\n client?: string;\n /**\n * Explicit source list; when omitted, sources are derived per the\n * production derivation rules (see {@link deriveEthosSources}).\n */\n sources?: (subject: Hcs25Subject) => readonly Hcs25EthosSource[];\n /**\n * Refresh interval applied to sources whose stored status is `ok`.\n * Default 12 hours. Set to 0 to always refetch.\n */\n ttlMs?: number;\n /**\n * Refresh interval applied to sources in `missing`/`error` state.\n * Default 6 hours.\n */\n failureTtlMs?: number;\n /** Transient-failure retries per source request. Default 2. */\n maxRetries?: number;\n /**\n * When false, disables EVM-address inference (`agentAddress`,\n * `ownerAddress`, `payTo`, `agentAddressCaip`, `nativeId`, …). Default\n * true.\n */\n inferAddress?: 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\nconst DEFAULT_EXCLUDED_REGISTRIES: readonly string[] = [\n 'openrouter',\n 'near-ai',\n 'agentverse',\n 'uagent',\n];\n\ninterface EthosScoreResponse {\n ok?: boolean;\n data?: { score?: number };\n score?: number;\n}\n\nconst normalizeRegistry = (value: unknown): string =>\n typeof value === 'string' ? value.trim().toLowerCase() : '';\n\nconst extractAddress = (value: unknown): string | null => {\n if (typeof value !== 'string') {\n return null;\n }\n const match = EMBEDDED_EVM_ADDRESS_PATTERN.exec(value.trim());\n return match ? match[0] : null;\n};\n\n/**\n * Normalizes a stored/explicit Ethos userkey: values already containing a\n * `kind:` prefix pass through; bare EVM addresses become `address:0x…`.\n */\nexport function normalizeEthosUserkey(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n if (trimmed.includes(':')) {\n return trimmed;\n }\n const address = extractAddress(trimmed);\n return address ? `address:${address}` : null;\n}\n\nconst userkeyKind = (userkey: string): EthosSourceKind => {\n const trimmed = userkey.trim();\n if (trimmed.startsWith('address:')) {\n return 'address';\n }\n if (trimmed.startsWith('service:x.com:')) {\n return 'x';\n }\n return 'explicit';\n};\n\nconst normalizeTwitterHandle = (value: unknown): string | null => {\n if (typeof value !== 'string') {\n return null;\n }\n const withoutAt = value.trim().replace(/^@/, '').replace(/\\s+/g, '');\n return TWITTER_HANDLE_PATTERN.test(withoutAt) ? withoutAt : null;\n};\n\nconst extractTwitterFromSocials = (profile: unknown): string | null => {\n if (!isJsonObject(profile as Hcs25JsonValue)) {\n return null;\n }\n const socials = (profile as Record<string, Hcs25JsonValue>).socials;\n if (!Array.isArray(socials)) {\n return null;\n }\n for (const entry of socials) {\n if (!isJsonObject(entry)) {\n continue;\n }\n const platform = normalizeRegistry(\n (entry as Record<string, Hcs25JsonValue>).platform,\n );\n if (platform !== 'twitter' && platform !== 'x') {\n continue;\n }\n const handle = normalizeTwitterHandle(\n (entry as Record<string, Hcs25JsonValue>).handle,\n );\n if (handle) {\n return handle;\n }\n }\n return null;\n};\n\n/**\n * True when the subject is structurally outside Ethos coverage (uAgent /\n * AgentVerse agents per the ethos signal doc).\n */\nexport function isEthosExcluded(subject: Hcs25Subject): boolean {\n const registry = normalizeRegistry(subject.registry);\n const metadata = subject.metadata ?? {};\n const protocol = normalizeRegistry(\n (metadata as Record<string, Hcs25JsonValue>).protocol,\n );\n const protocols = Array.isArray(\n (subject as { protocols?: unknown }).protocols,\n )\n ? ((subject as { protocols?: unknown[] }).protocols ?? [])\n .filter((v): v is string => typeof v === 'string')\n .map(normalizeRegistry)\n : [];\n return (\n registry === 'agentverse' ||\n registry === 'uagent' ||\n protocol === 'uagent' ||\n protocols.includes('uagent')\n );\n}\n\n/**\n * Derives Ethos userkey sources per the production rules:\n *\n * - `metadata.trustProviderIds.ethos` / `metadata.trust.providers.ethos` /\n * `metadata.ethosUserkey` are explicit userkeys (weight 1, short-circuit).\n * - `virtuals-protocol` subjects derive an `x` source from\n * `twitterHandle`/`memeTwitterHandle`/`profile.socials` (weight 0.7);\n * `moltbook` subjects derive from `moltbook.owner`/`profile.socials`\n * (weight 1). Other registries use the generic\n * `additional.twitter|xHandle|x|twitterHandle` keys (weight 1).\n * - `agentAddress`, `ownerAddress`, `payTo`, `agentAddressCaip`,\n * `nativeId`, `address`, `evmAddress`, `uid` yield an `address:` source\n * (embedded `0x…` extraction makes CAIP ids work). Weight drops to 0.3\n * when an `x` source already exists on a weighted registry.\n */\nexport function deriveEthosSources(subject: Hcs25Subject): Hcs25EthosSource[] {\n const metadata = subject.metadata ?? {};\n const registry = normalizeRegistry(subject.registry);\n const additional = readSubjectAdditional(subject);\n const epoch = new Date(0).toISOString();\n const push = (\n list: Hcs25EthosSource[],\n userkey: string,\n kind: EthosSourceKind,\n weight: number,\n ): void => {\n if (!list.some(source => source.userkey === userkey)) {\n list.push({\n userkey,\n kind,\n weight,\n status: 'missing',\n score: null,\n updatedAt: epoch,\n });\n }\n };\n\n const sources: Hcs25EthosSource[] = [];\n\n const trustProviderIds = isJsonObject(metadata.trustProviderIds)\n ? metadata.trustProviderIds\n : undefined;\n const trustProviders =\n isJsonObject(metadata.trust) && isJsonObject(metadata.trust.providers)\n ? (metadata.trust.providers as Record<string, Hcs25JsonValue>)\n : undefined;\n for (const candidate of [\n trustProviderIds?.ethos,\n trustProviders?.ethos,\n metadata.ethosUserkey,\n ]) {\n const userkey = normalizeEthosUserkey(candidate);\n if (userkey) {\n push(sources, userkey, userkeyKind(userkey), 1);\n return sources;\n }\n }\n\n const metadataRecord = metadata as Record<string, Hcs25JsonValue>;\n const profileSocials =\n extractTwitterFromSocials(metadataRecord.profile) ??\n extractTwitterFromSocials((subject as { profile?: unknown }).profile);\n\n if (registry === 'virtuals-protocol') {\n const handle =\n normalizeTwitterHandle(metadataRecord.twitterHandle) ??\n normalizeTwitterHandle(metadataRecord.memeTwitterHandle) ??\n profileSocials;\n if (handle) {\n push(sources, `service:x.com:username:${handle}`, 'x', 0.7);\n }\n } else if (registry === 'moltbook') {\n const owner = isJsonObject(metadataRecord.moltbook)\n ? normalizeTwitterHandle(\n (metadataRecord.moltbook as Record<string, Hcs25JsonValue>).owner,\n )\n : null;\n const handle = owner ?? profileSocials;\n if (handle) {\n push(sources, `service:x.com:username:${handle}`, 'x', 1);\n }\n } else {\n const genericHandle = [\n readString(additional, 'twitter'),\n readString(additional, 'xHandle'),\n readString(additional, 'x'),\n readString(additional, 'twitterHandle'),\n readString(metadataRecord, 'twitter'),\n readString(metadataRecord, 'xHandle'),\n readString(metadataRecord, 'x'),\n profileSocials,\n ]\n .map(normalizeTwitterHandle)\n .find((handle): handle is string => handle !== null);\n if (genericHandle) {\n push(sources, `service:x.com:username:${genericHandle}`, 'x', 1);\n }\n }\n\n const addressCandidates = [\n metadataRecord.agentAddress,\n metadataRecord.ownerAddress,\n metadataRecord.payTo,\n metadataRecord.agentAddressCaip,\n metadataRecord.nativeId,\n metadataRecord.address,\n metadataRecord.evmAddress,\n metadataRecord.uid,\n ];\n for (const candidate of addressCandidates) {\n const address = extractAddress(candidate);\n if (!address) {\n continue;\n }\n const weightedRegistry =\n registry === 'virtuals-protocol' || registry === 'moltbook';\n const weight =\n weightedRegistry && sources.some(source => source.kind === 'x') ? 0.3 : 1;\n push(sources, `address:${address}`, 'address', weight);\n break;\n }\n\n return sources;\n}\n\nconst pickPrimaryUserkey = (\n sources: readonly Hcs25EthosSource[],\n): string | null =>\n sources.find(source => source.kind === 'address')?.userkey ??\n sources[0]?.userkey ??\n null;\n\nfunction readStoredSources(subject: Hcs25Subject): Hcs25EthosSource[] {\n const raw = subject.metadata?.ethosSources;\n if (!Array.isArray(raw)) {\n return [];\n }\n const out: Hcs25EthosSource[] = [];\n for (const entry of raw) {\n if (!isJsonObject(entry)) {\n continue;\n }\n const record = entry as Record<string, Hcs25JsonValue>;\n const userkey = readString(record, 'userkey');\n if (!userkey) {\n continue;\n }\n const rawKind = readString(record, 'kind');\n const rawStatus = readString(record, 'status');\n const score = record.score;\n out.push({\n userkey,\n kind:\n rawKind === 'x' || rawKind === 'address' || rawKind === 'explicit'\n ? rawKind\n : userkeyKind(userkey),\n weight:\n typeof record.weight === 'number' && Number.isFinite(record.weight)\n ? Math.max(0, record.weight)\n : 1,\n status:\n rawStatus === 'ok' || rawStatus === 'error' ? rawStatus : 'missing',\n score: typeof score === 'number' && Number.isFinite(score) ? score : null,\n updatedAt: readString(record, 'updatedAt') ?? new Date(0).toISOString(),\n });\n }\n return out;\n}\n\n/**\n * Creates the `ethos` signal adapter: resolves the subject's Ethos userkeys\n * per the production derivation rules, fetches each source's score from the\n * Ethos v1 score endpoint (`{ok, data:{score}}` envelope), merges with the\n * stored `ethosSources` per-source freshness (TTL/failure-TTL gating), and\n * writes the `ethosUserkey`/`ethosScore`/`ethosScoreStatus`/`ethosSources`/\n * `ethosComposite` stored fields per the signal catalog.\n */\nexport function createEthosSignalAdapter(\n options: Hcs25EthosSignalAdapterOptions = {},\n): Hcs25SignalAdapter {\n const baseUrl = stripTrailingSlashes(options.baseUrl ?? ETHOS_API_BASE_URL);\n const resolveSources = options.sources ?? deriveEthosSources;\n const ttlMs = options.ttlMs ?? 12 * 60 * 60 * 1000;\n const failureTtlMs = options.failureTtlMs ?? 6 * 60 * 60 * 1000;\n const maxRetries = options.maxRetries ?? 2;\n const inferAddress = options.inferAddress ?? true;\n const clientId = options.client ?? DEFAULT_CLIENT_ID;\n\n const collect = async (\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n ): Promise<Hcs25SignalAdapterResult[]> => {\n const now = context.now.toISOString();\n\n const resolved = ((): Hcs25EthosSource[] => {\n const sources = resolveSources(subject);\n return inferAddress\n ? [...sources]\n : sources.filter(source => source.kind !== 'address');\n })();\n\n if (resolved.length === 0) {\n return [\n {\n signalId: 'ethos.score',\n status: 'missing',\n fields: [\n {\n scope: 'root',\n values: {\n ethosScore: null,\n ethosScoreStatus: 'missing',\n ethosScoreUpdatedAt: now,\n ethosSources: [],\n },\n },\n ],\n },\n ];\n }\n\n // Merge with stored sources: keep prior scores/statuses so a transient\n // failure does not erase data, and so TTL gating can skip fresh sources.\n const storedByUserkey = new Map(\n readStoredSources(subject).map(source => [source.userkey, source]),\n );\n const merged: Hcs25EthosSource[] = resolved.map(source => {\n const stored = storedByUserkey.get(source.userkey);\n return {\n ...source,\n status: stored?.status ?? source.status ?? 'missing',\n score: stored?.score ?? source.score ?? null,\n updatedAt: stored?.updatedAt ?? source.updatedAt,\n };\n });\n\n const toRefresh = merged.filter(source => {\n if (context.force) {\n return true;\n }\n const updatedMs = parseTimestampMs(source.updatedAt);\n if (updatedMs === null || updatedMs <= 0) {\n return true;\n }\n const ttl = source.status === 'ok' ? ttlMs : failureTtlMs;\n return context.now.getTime() - updatedMs >= ttl;\n });\n\n const headers: Record<string, string> = { 'X-Ethos-Client': clientId };\n let sawError = false;\n let sawTimeout = false;\n\n await Promise.all(\n toRefresh.map(async source => {\n const url = `${baseUrl}/api/v1/score/${encodeURIComponent(source.userkey)}`;\n try {\n const data = await requestJson<EthosScoreResponse>(url, {\n fetch: context.fetch,\n headers,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n maxRetries,\n });\n // Production envelope `{ok, data:{score}}`; tolerate a flat\n // `{score}` payload for v2-shaped endpoints.\n const score =\n typeof data?.data?.score === 'number' &&\n Number.isFinite(data.data.score)\n ? data.data.score\n : typeof data?.score === 'number' && Number.isFinite(data.score)\n ? data.score\n : null;\n source.updatedAt = now;\n if (data?.ok === false || score === null) {\n source.status = 'missing';\n source.score = null;\n } else {\n source.status = 'ok';\n source.score = score;\n }\n } catch (error) {\n source.updatedAt = now;\n if (error instanceof Hcs25CollectorHttpError) {\n if (error.status === 404) {\n source.status = 'missing';\n source.score = null;\n } else {\n source.status = 'error';\n // Preserve a previously stored score on transient failure.\n source.score = source.score ?? null;\n sawError = true;\n }\n } else if (isTimeoutError(error)) {\n source.status = 'error';\n sawTimeout = true;\n sawError = true;\n } else {\n source.status = 'error';\n sawError = true;\n }\n }\n }),\n );\n\n const scoredSources = merged.filter(\n source =>\n typeof source.score === 'number' && Number.isFinite(source.score),\n );\n const weightSum = scoredSources.reduce(\n (sum, source) => sum + Math.max(0, source.weight),\n 0,\n );\n const composite =\n weightSum > 0\n ? Math.round(\n (scoredSources.reduce(\n (sum, source) => sum + source.weight * (source.score ?? 0),\n 0,\n ) /\n weightSum) *\n 100,\n ) / 100\n : null;\n\n const compositeStatus: EthosStoredStatus = merged.some(\n source => source.status === 'ok',\n )\n ? 'ok'\n : merged.some(source => source.status === 'error')\n ? 'error'\n : 'missing';\n\n // Composite weights are keyed by source kind (x/address/explicit).\n const weights: Record<string, number> = {};\n for (const source of merged) {\n weights[source.kind] =\n Math.round(((weights[source.kind] ?? 0) + source.weight) * 100) / 100;\n }\n\n const signalStatus =\n compositeStatus === 'ok'\n ? 'ok'\n : sawTimeout\n ? 'timeout'\n : compositeStatus === 'error'\n ? 'error'\n : 'missing';\n\n return [\n {\n signalId: 'ethos.score',\n status: signalStatus,\n value: composite,\n fields: [\n {\n scope: 'root',\n values: {\n ethosUserkey: pickPrimaryUserkey(merged),\n ethosScore: composite,\n ethosScoreStatus: compositeStatus,\n ethosScoreUpdatedAt: now,\n ethosSources: merged.map(source => ({\n userkey: source.userkey,\n kind: source.kind,\n weight: source.weight,\n status: source.status ?? 'missing',\n score: source.score ?? null,\n updatedAt: source.updatedAt ?? now,\n })),\n ethosComposite: {\n version: 1,\n score: composite,\n updatedAt: now,\n weights,\n },\n },\n },\n ],\n provenance: {\n source: 'ethos',\n sourceUrl: `${baseUrl}/api/v1/score`,\n subjectId: subject.id,\n fetchedAt: now,\n params: { userkeys: merged.map(source => source.userkey) },\n },\n },\n ];\n };\n\n return {\n id: 'ethos',\n produces: ['ethos.score'],\n timeoutMs: options.timeoutMs,\n includeRegistries: options.includeRegistries,\n excludeRegistries: options.excludeRegistries ?? DEFAULT_EXCLUDED_REGISTRIES,\n appliesTo: options.appliesTo ?? (subject => !isEthosExcluded(subject)),\n collect,\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standards-sdk.es130.js","sources":["../../src/hcs-25/collectors/connectivity.ts"],"sourcesContent":["import type { Hcs25JsonValue, Hcs25Subject } from '../types';\nimport { resolveSubjectEndpoint } from './endpoints';\nimport { isTimeoutError } from './http';\nimport type {\n Hcs25CollectContext,\n Hcs25SignalAdapter,\n Hcs25SignalAdapterResult,\n} from './types';\n\n/**\n * A protocol probe: returns a connectivity score in `[0,100]`, or null when\n * the probe is not meaningful for the subject.\n */\nexport type Hcs25ConnectivityProbe = (\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n) => Promise<number | null>;\n\nconst MCP_PROTOCOL_VERSION = '2024-11-05';\n\nasync function fetchOk(\n context: Hcs25CollectContext,\n url: string,\n init?: { method?: string; headers?: Record<string, string>; body?: string },\n): Promise<boolean> {\n const response = await context.fetch(url, {\n ...init,\n signal: context.signal,\n });\n return response.status < 500;\n}\n\n/**\n * MCP probe: posts a JSON-RPC `initialize` request to the endpoint. Any\n * definite HTTP response (including 4xx such as 405 on SSE-only endpoints)\n * proves connectivity; only network failure or 5xx count as disconnected.\n */\nexport const mcpConnectivityProbe: Hcs25ConnectivityProbe = async (\n subject,\n context,\n) => {\n const endpoint = resolveSubjectEndpoint(subject);\n if (!endpoint) {\n return null;\n }\n const ok = await fetchOk(context, endpoint, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n accept: 'application/json, text/event-stream',\n },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'initialize',\n params: {\n protocolVersion: MCP_PROTOCOL_VERSION,\n capabilities: {},\n clientInfo: { name: 'hcs-25-connectivity-probe', version: '1' },\n },\n }),\n });\n return ok ? 100 : 0;\n};\n\n/**\n * A2A probe: fetches the agent card at `/.well-known/agent.json` relative to\n * the endpoint origin (or the endpoint itself when it already points at a\n * well-known path).\n */\nexport const a2aConnectivityProbe: Hcs25ConnectivityProbe = async (\n subject,\n context,\n) => {\n const endpoint = resolveSubjectEndpoint(subject);\n if (!endpoint) {\n return null;\n }\n const cardUrl = endpoint.includes('/.well-known/')\n ? endpoint\n : new URL('/.well-known/agent.json', endpoint).toString();\n const ok = await fetchOk(context, cardUrl);\n return ok ? 100 : 0;\n};\n\n/**\n * Generic HTTP probe: GET the endpoint; any response below 500 counts as\n * connected.\n */\nexport const httpConnectivityProbe: Hcs25ConnectivityProbe = async (\n subject,\n context,\n) => {\n const endpoint = resolveSubjectEndpoint(subject);\n if (!endpoint) {\n return null;\n }\n const ok = await fetchOk(context, endpoint);\n return ok ? 100 : 0;\n};\n\nconst DEFAULT_PROBES: Record<string, Hcs25ConnectivityProbe> = {\n mcp: mcpConnectivityProbe,\n a2a: a2aConnectivityProbe,\n};\n\n/**\n * Options for the connectivity signal adapter.\n */\nexport interface Hcs25ConnectivitySignalAdapterOptions {\n /**\n * Probe map keyed by target name. Keys `mcp`/`a2a` are used automatically\n * for matching `subject.protocol`; other keys run unconditionally as\n * named targets and populate `connectivityTargets`. Pass `{default: fn}`\n * to override the fallback HTTP probe.\n */\n probes?: Record<string, Hcs25ConnectivityProbe>;\n /** Per-adapter timeout in milliseconds. */\n timeoutMs?: number;\n includeRegistries?: readonly string[];\n excludeRegistries?: readonly string[];\n appliesTo?: (subject: Hcs25Subject) => boolean;\n}\n\nconst DEFAULT_EXCLUDED_REGISTRIES: readonly string[] = [\n 'openrouter',\n 'near-ai',\n];\n\n/**\n * Creates the `connectivity` signal adapter: probes the subject's endpoint\n * using a protocol-aware probe (MCP initialize / A2A agent card / generic\n * HTTP) plus any named custom probes, and stores `connectivityScore` /\n * `connectivityTargets` under `metadata.additional`.\n */\nexport function createConnectivitySignalAdapter(\n options: Hcs25ConnectivitySignalAdapterOptions = {},\n): Hcs25SignalAdapter {\n const probes = { ...DEFAULT_PROBES, ...options.probes };\n\n const collect = async (\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n ): Promise<Hcs25SignalAdapterResult[]> => {\n const now = context.now;\n const protocol = subject.protocol?.toLowerCase();\n const protocolProbe = protocol ? probes[protocol] : undefined;\n const defaultProbe = probes.default ?? httpConnectivityProbe;\n const namedTargets = Object.keys(probes).filter(\n key => key !== protocol && key !== 'default' && !(key in DEFAULT_PROBES),\n );\n\n const results: Hcs25SignalAdapterResult[] = [];\n const targets: Record<string, number> = {};\n let primaryScore: number | null = null;\n let primaryStatus: 'ok' | 'timeout' | 'error' = 'ok';\n let probed = false;\n\n const runProbe = async (\n probe: Hcs25ConnectivityProbe,\n signalId: string,\n target?: string,\n ): Promise<void> => {\n try {\n const score = await probe(subject, context);\n if (score === null) {\n return;\n }\n probed = true;\n const clamped = Math.min(100, Math.max(0, score));\n if (target) {\n targets[target] = clamped;\n } else {\n primaryScore = clamped;\n }\n results.push({\n signalId,\n status: 'ok',\n value: clamped,\n provenance: {\n source: 'connectivity-probe',\n sourceUrl: resolveSubjectEndpoint(subject) ?? undefined,\n subjectId: subject.id,\n fetchedAt: now.toISOString(),\n },\n });\n } catch (error) {\n probed = true;\n const status = isTimeoutError(error) ? 'timeout' : 'error';\n if (!target) {\n primaryStatus = status;\n primaryScore = 0;\n }\n results.push({\n signalId,\n status,\n provenance: {\n source: 'connectivity-probe',\n subjectId: subject.id,\n fetchedAt: now.toISOString(),\n },\n });\n }\n };\n\n await runProbe(protocolProbe ?? defaultProbe, 'connectivity.probe');\n\n for (const target of namedTargets) {\n await runProbe(probes[target], `connectivity.${target}`, target);\n }\n\n if (!probed) {\n return [\n {\n signalId: 'connectivity.probe',\n status: 'missing',\n fields: [\n {\n scope: 'additional',\n values: { connectivityStatus: 'missing' },\n },\n ],\n },\n ];\n }\n\n const additional: Record<string, Hcs25JsonValue> = {\n connectivityStatus: primaryStatus === 'ok' ? 'ok' : primaryStatus,\n };\n if (primaryScore !== null) {\n additional.connectivityScore = primaryScore;\n }\n if (Object.keys(targets).length > 0) {\n additional.connectivityTargets = { ...targets };\n }\n\n const last = results[results.length - 1];\n return [\n ...results,\n {\n signalId: 'connectivity.score',\n status: primaryStatus === 'ok' ? 'ok' : primaryStatus,\n value: primaryScore ?? undefined,\n fields: [{ scope: 'additional', values: additional }],\n provenance: last?.provenance,\n },\n ];\n };\n\n return {\n id: 'connectivity',\n produces: ['connectivity.probe', 'connectivity.score'],\n timeoutMs: options.timeoutMs,\n includeRegistries: options.includeRegistries,\n excludeRegistries: options.excludeRegistries ?? DEFAULT_EXCLUDED_REGISTRIES,\n appliesTo: options.appliesTo,\n collect,\n };\n}\n"],"names":[],"mappings":"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"}