@hashgraphonline/standards-sdk 0.1.189 → 0.1.190

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 (528) hide show
  1. package/dist/browser/hcs-25/adapters/agentverse.d.ts.map +1 -1
  2. package/dist/browser/hcs-25/adapters/availability.d.ts.map +1 -1
  3. package/dist/browser/hcs-25/adapters/connectivity.d.ts.map +1 -1
  4. package/dist/browser/hcs-25/adapters/ethos.d.ts.map +1 -1
  5. package/dist/browser/hcs-25/adapters/model-evals.d.ts.map +1 -1
  6. package/dist/browser/hcs-25/adapters/simple-evals.d.ts.map +1 -1
  7. package/dist/browser/hcs-25/adapters/x402.d.ts.map +1 -1
  8. package/dist/browser/hcs-25/collectors/acp.d.ts +42 -0
  9. package/dist/browser/hcs-25/collectors/acp.d.ts.map +1 -0
  10. package/dist/browser/hcs-25/collectors/agentverse.d.ts +37 -0
  11. package/dist/browser/hcs-25/collectors/agentverse.d.ts.map +1 -0
  12. package/dist/browser/hcs-25/collectors/availability.d.ts +29 -0
  13. package/dist/browser/hcs-25/collectors/availability.d.ts.map +1 -0
  14. package/dist/browser/hcs-25/collectors/catalog.d.ts +57 -0
  15. package/dist/browser/hcs-25/collectors/catalog.d.ts.map +1 -0
  16. package/dist/browser/hcs-25/collectors/connectivity.d.ts +49 -0
  17. package/dist/browser/hcs-25/collectors/connectivity.d.ts.map +1 -0
  18. package/dist/browser/hcs-25/collectors/endpoints.d.ts +9 -0
  19. package/dist/browser/hcs-25/collectors/endpoints.d.ts.map +1 -0
  20. package/dist/browser/hcs-25/collectors/erc8004.d.ts +104 -0
  21. package/dist/browser/hcs-25/collectors/erc8004.d.ts.map +1 -0
  22. package/dist/browser/hcs-25/collectors/ethos.d.ts +95 -0
  23. package/dist/browser/hcs-25/collectors/ethos.d.ts.map +1 -0
  24. package/dist/browser/hcs-25/collectors/freshness.d.ts +36 -0
  25. package/dist/browser/hcs-25/collectors/freshness.d.ts.map +1 -0
  26. package/dist/browser/hcs-25/collectors/http.d.ts +67 -0
  27. package/dist/browser/hcs-25/collectors/http.d.ts.map +1 -0
  28. package/dist/browser/hcs-25/collectors/index.d.ts +21 -0
  29. package/dist/browser/hcs-25/collectors/index.d.ts.map +1 -0
  30. package/dist/browser/hcs-25/collectors/merge.d.ts +11 -0
  31. package/dist/browser/hcs-25/collectors/merge.d.ts.map +1 -0
  32. package/dist/browser/hcs-25/collectors/model-evals.d.ts +315 -0
  33. package/dist/browser/hcs-25/collectors/model-evals.d.ts.map +1 -0
  34. package/dist/browser/hcs-25/collectors/oss-popularity.d.ts +51 -0
  35. package/dist/browser/hcs-25/collectors/oss-popularity.d.ts.map +1 -0
  36. package/dist/browser/hcs-25/collectors/output-verification.d.ts +37 -0
  37. package/dist/browser/hcs-25/collectors/output-verification.d.ts.map +1 -0
  38. package/dist/browser/hcs-25/collectors/pipeline.d.ts +19 -0
  39. package/dist/browser/hcs-25/collectors/pipeline.d.ts.map +1 -0
  40. package/dist/browser/hcs-25/collectors/runner.d.ts +20 -0
  41. package/dist/browser/hcs-25/collectors/runner.d.ts.map +1 -0
  42. package/dist/browser/hcs-25/collectors/simple-evals.d.ts +91 -0
  43. package/dist/browser/hcs-25/collectors/simple-evals.d.ts.map +1 -0
  44. package/dist/browser/hcs-25/collectors/types.d.ts +113 -0
  45. package/dist/browser/hcs-25/collectors/types.d.ts.map +1 -0
  46. package/dist/browser/hcs-25/collectors/x402-onchain.d.ts +105 -0
  47. package/dist/browser/hcs-25/collectors/x402-onchain.d.ts.map +1 -0
  48. package/dist/browser/hcs-25/collectors/x402.d.ts +48 -0
  49. package/dist/browser/hcs-25/collectors/x402.d.ts.map +1 -0
  50. package/dist/browser/hcs-25/index.d.ts +1 -0
  51. package/dist/browser/hcs-25/index.d.ts.map +1 -1
  52. package/dist/browser/hcs-25/signals/marketplace.d.ts +6 -6
  53. package/dist/browser/hcs-25/signals/marketplace.d.ts.map +1 -1
  54. package/dist/browser/hcs-25/signals/model-evals.d.ts +12 -12
  55. package/dist/browser/hcs-25/signals/model-evals.d.ts.map +1 -1
  56. package/dist/browser/hcs-25/signals/operational.d.ts +15 -12
  57. package/dist/browser/hcs-25/signals/operational.d.ts.map +1 -1
  58. package/dist/browser/hcs-25/signals/simple-evals.d.ts +1 -1
  59. package/dist/browser/hcs-25/signals/simple-evals.d.ts.map +1 -1
  60. package/dist/browser-root/hcs-25/adapters/agentverse.d.ts.map +1 -1
  61. package/dist/browser-root/hcs-25/adapters/availability.d.ts.map +1 -1
  62. package/dist/browser-root/hcs-25/adapters/connectivity.d.ts.map +1 -1
  63. package/dist/browser-root/hcs-25/adapters/ethos.d.ts.map +1 -1
  64. package/dist/browser-root/hcs-25/adapters/model-evals.d.ts.map +1 -1
  65. package/dist/browser-root/hcs-25/adapters/simple-evals.d.ts.map +1 -1
  66. package/dist/browser-root/hcs-25/adapters/x402.d.ts.map +1 -1
  67. package/dist/browser-root/hcs-25/collectors/acp.d.ts +42 -0
  68. package/dist/browser-root/hcs-25/collectors/acp.d.ts.map +1 -0
  69. package/dist/browser-root/hcs-25/collectors/agentverse.d.ts +37 -0
  70. package/dist/browser-root/hcs-25/collectors/agentverse.d.ts.map +1 -0
  71. package/dist/browser-root/hcs-25/collectors/availability.d.ts +29 -0
  72. package/dist/browser-root/hcs-25/collectors/availability.d.ts.map +1 -0
  73. package/dist/browser-root/hcs-25/collectors/catalog.d.ts +57 -0
  74. package/dist/browser-root/hcs-25/collectors/catalog.d.ts.map +1 -0
  75. package/dist/browser-root/hcs-25/collectors/connectivity.d.ts +49 -0
  76. package/dist/browser-root/hcs-25/collectors/connectivity.d.ts.map +1 -0
  77. package/dist/browser-root/hcs-25/collectors/endpoints.d.ts +9 -0
  78. package/dist/browser-root/hcs-25/collectors/endpoints.d.ts.map +1 -0
  79. package/dist/browser-root/hcs-25/collectors/erc8004.d.ts +104 -0
  80. package/dist/browser-root/hcs-25/collectors/erc8004.d.ts.map +1 -0
  81. package/dist/browser-root/hcs-25/collectors/ethos.d.ts +95 -0
  82. package/dist/browser-root/hcs-25/collectors/ethos.d.ts.map +1 -0
  83. package/dist/browser-root/hcs-25/collectors/freshness.d.ts +36 -0
  84. package/dist/browser-root/hcs-25/collectors/freshness.d.ts.map +1 -0
  85. package/dist/browser-root/hcs-25/collectors/http.d.ts +67 -0
  86. package/dist/browser-root/hcs-25/collectors/http.d.ts.map +1 -0
  87. package/dist/browser-root/hcs-25/collectors/index.d.ts +21 -0
  88. package/dist/browser-root/hcs-25/collectors/index.d.ts.map +1 -0
  89. package/dist/browser-root/hcs-25/collectors/merge.d.ts +11 -0
  90. package/dist/browser-root/hcs-25/collectors/merge.d.ts.map +1 -0
  91. package/dist/browser-root/hcs-25/collectors/model-evals.d.ts +315 -0
  92. package/dist/browser-root/hcs-25/collectors/model-evals.d.ts.map +1 -0
  93. package/dist/browser-root/hcs-25/collectors/oss-popularity.d.ts +51 -0
  94. package/dist/browser-root/hcs-25/collectors/oss-popularity.d.ts.map +1 -0
  95. package/dist/browser-root/hcs-25/collectors/output-verification.d.ts +37 -0
  96. package/dist/browser-root/hcs-25/collectors/output-verification.d.ts.map +1 -0
  97. package/dist/browser-root/hcs-25/collectors/pipeline.d.ts +19 -0
  98. package/dist/browser-root/hcs-25/collectors/pipeline.d.ts.map +1 -0
  99. package/dist/browser-root/hcs-25/collectors/runner.d.ts +20 -0
  100. package/dist/browser-root/hcs-25/collectors/runner.d.ts.map +1 -0
  101. package/dist/browser-root/hcs-25/collectors/simple-evals.d.ts +91 -0
  102. package/dist/browser-root/hcs-25/collectors/simple-evals.d.ts.map +1 -0
  103. package/dist/browser-root/hcs-25/collectors/types.d.ts +113 -0
  104. package/dist/browser-root/hcs-25/collectors/types.d.ts.map +1 -0
  105. package/dist/browser-root/hcs-25/collectors/x402-onchain.d.ts +105 -0
  106. package/dist/browser-root/hcs-25/collectors/x402-onchain.d.ts.map +1 -0
  107. package/dist/browser-root/hcs-25/collectors/x402.d.ts +48 -0
  108. package/dist/browser-root/hcs-25/collectors/x402.d.ts.map +1 -0
  109. package/dist/browser-root/hcs-25/index.d.ts +1 -0
  110. package/dist/browser-root/hcs-25/index.d.ts.map +1 -1
  111. package/dist/browser-root/hcs-25/signals/marketplace.d.ts +6 -6
  112. package/dist/browser-root/hcs-25/signals/marketplace.d.ts.map +1 -1
  113. package/dist/browser-root/hcs-25/signals/model-evals.d.ts +12 -12
  114. package/dist/browser-root/hcs-25/signals/model-evals.d.ts.map +1 -1
  115. package/dist/browser-root/hcs-25/signals/operational.d.ts +15 -12
  116. package/dist/browser-root/hcs-25/signals/operational.d.ts.map +1 -1
  117. package/dist/browser-root/hcs-25/signals/simple-evals.d.ts +1 -1
  118. package/dist/browser-root/hcs-25/signals/simple-evals.d.ts.map +1 -1
  119. package/dist/cjs/hcs-25/adapters/agentverse.d.ts.map +1 -1
  120. package/dist/cjs/hcs-25/adapters/availability.d.ts.map +1 -1
  121. package/dist/cjs/hcs-25/adapters/connectivity.d.ts.map +1 -1
  122. package/dist/cjs/hcs-25/adapters/ethos.d.ts.map +1 -1
  123. package/dist/cjs/hcs-25/adapters/model-evals.d.ts.map +1 -1
  124. package/dist/cjs/hcs-25/adapters/simple-evals.d.ts.map +1 -1
  125. package/dist/cjs/hcs-25/adapters/x402.d.ts.map +1 -1
  126. package/dist/cjs/hcs-25/collectors/acp.d.ts +42 -0
  127. package/dist/cjs/hcs-25/collectors/acp.d.ts.map +1 -0
  128. package/dist/cjs/hcs-25/collectors/agentverse.d.ts +37 -0
  129. package/dist/cjs/hcs-25/collectors/agentverse.d.ts.map +1 -0
  130. package/dist/cjs/hcs-25/collectors/availability.d.ts +29 -0
  131. package/dist/cjs/hcs-25/collectors/availability.d.ts.map +1 -0
  132. package/dist/cjs/hcs-25/collectors/catalog.d.ts +57 -0
  133. package/dist/cjs/hcs-25/collectors/catalog.d.ts.map +1 -0
  134. package/dist/cjs/hcs-25/collectors/connectivity.d.ts +49 -0
  135. package/dist/cjs/hcs-25/collectors/connectivity.d.ts.map +1 -0
  136. package/dist/cjs/hcs-25/collectors/endpoints.d.ts +9 -0
  137. package/dist/cjs/hcs-25/collectors/endpoints.d.ts.map +1 -0
  138. package/dist/cjs/hcs-25/collectors/erc8004.d.ts +104 -0
  139. package/dist/cjs/hcs-25/collectors/erc8004.d.ts.map +1 -0
  140. package/dist/cjs/hcs-25/collectors/ethos.d.ts +95 -0
  141. package/dist/cjs/hcs-25/collectors/ethos.d.ts.map +1 -0
  142. package/dist/cjs/hcs-25/collectors/freshness.d.ts +36 -0
  143. package/dist/cjs/hcs-25/collectors/freshness.d.ts.map +1 -0
  144. package/dist/cjs/hcs-25/collectors/http.d.ts +67 -0
  145. package/dist/cjs/hcs-25/collectors/http.d.ts.map +1 -0
  146. package/dist/cjs/hcs-25/collectors/index.d.ts +21 -0
  147. package/dist/cjs/hcs-25/collectors/index.d.ts.map +1 -0
  148. package/dist/cjs/hcs-25/collectors/merge.d.ts +11 -0
  149. package/dist/cjs/hcs-25/collectors/merge.d.ts.map +1 -0
  150. package/dist/cjs/hcs-25/collectors/model-evals.d.ts +315 -0
  151. package/dist/cjs/hcs-25/collectors/model-evals.d.ts.map +1 -0
  152. package/dist/cjs/hcs-25/collectors/oss-popularity.d.ts +51 -0
  153. package/dist/cjs/hcs-25/collectors/oss-popularity.d.ts.map +1 -0
  154. package/dist/cjs/hcs-25/collectors/output-verification.d.ts +37 -0
  155. package/dist/cjs/hcs-25/collectors/output-verification.d.ts.map +1 -0
  156. package/dist/cjs/hcs-25/collectors/pipeline.d.ts +19 -0
  157. package/dist/cjs/hcs-25/collectors/pipeline.d.ts.map +1 -0
  158. package/dist/cjs/hcs-25/collectors/runner.d.ts +20 -0
  159. package/dist/cjs/hcs-25/collectors/runner.d.ts.map +1 -0
  160. package/dist/cjs/hcs-25/collectors/simple-evals.d.ts +91 -0
  161. package/dist/cjs/hcs-25/collectors/simple-evals.d.ts.map +1 -0
  162. package/dist/cjs/hcs-25/collectors/types.d.ts +113 -0
  163. package/dist/cjs/hcs-25/collectors/types.d.ts.map +1 -0
  164. package/dist/cjs/hcs-25/collectors/x402-onchain.d.ts +105 -0
  165. package/dist/cjs/hcs-25/collectors/x402-onchain.d.ts.map +1 -0
  166. package/dist/cjs/hcs-25/collectors/x402.d.ts +48 -0
  167. package/dist/cjs/hcs-25/collectors/x402.d.ts.map +1 -0
  168. package/dist/cjs/hcs-25/index.d.ts +1 -0
  169. package/dist/cjs/hcs-25/index.d.ts.map +1 -1
  170. package/dist/cjs/hcs-25/signals/marketplace.d.ts +6 -6
  171. package/dist/cjs/hcs-25/signals/marketplace.d.ts.map +1 -1
  172. package/dist/cjs/hcs-25/signals/model-evals.d.ts +12 -12
  173. package/dist/cjs/hcs-25/signals/model-evals.d.ts.map +1 -1
  174. package/dist/cjs/hcs-25/signals/operational.d.ts +15 -12
  175. package/dist/cjs/hcs-25/signals/operational.d.ts.map +1 -1
  176. package/dist/cjs/hcs-25/signals/simple-evals.d.ts +1 -1
  177. package/dist/cjs/hcs-25/signals/simple-evals.d.ts.map +1 -1
  178. package/dist/cjs/standards-sdk.cjs +2 -2
  179. package/dist/cjs/standards-sdk.cjs.map +1 -1
  180. package/dist/es/hcs-25/adapters/agentverse.d.ts.map +1 -1
  181. package/dist/es/hcs-25/adapters/availability.d.ts.map +1 -1
  182. package/dist/es/hcs-25/adapters/connectivity.d.ts.map +1 -1
  183. package/dist/es/hcs-25/adapters/ethos.d.ts.map +1 -1
  184. package/dist/es/hcs-25/adapters/model-evals.d.ts.map +1 -1
  185. package/dist/es/hcs-25/adapters/simple-evals.d.ts.map +1 -1
  186. package/dist/es/hcs-25/adapters/x402.d.ts.map +1 -1
  187. package/dist/es/hcs-25/collectors/acp.d.ts +42 -0
  188. package/dist/es/hcs-25/collectors/acp.d.ts.map +1 -0
  189. package/dist/es/hcs-25/collectors/agentverse.d.ts +37 -0
  190. package/dist/es/hcs-25/collectors/agentverse.d.ts.map +1 -0
  191. package/dist/es/hcs-25/collectors/availability.d.ts +29 -0
  192. package/dist/es/hcs-25/collectors/availability.d.ts.map +1 -0
  193. package/dist/es/hcs-25/collectors/catalog.d.ts +57 -0
  194. package/dist/es/hcs-25/collectors/catalog.d.ts.map +1 -0
  195. package/dist/es/hcs-25/collectors/connectivity.d.ts +49 -0
  196. package/dist/es/hcs-25/collectors/connectivity.d.ts.map +1 -0
  197. package/dist/es/hcs-25/collectors/endpoints.d.ts +9 -0
  198. package/dist/es/hcs-25/collectors/endpoints.d.ts.map +1 -0
  199. package/dist/es/hcs-25/collectors/erc8004.d.ts +104 -0
  200. package/dist/es/hcs-25/collectors/erc8004.d.ts.map +1 -0
  201. package/dist/es/hcs-25/collectors/ethos.d.ts +95 -0
  202. package/dist/es/hcs-25/collectors/ethos.d.ts.map +1 -0
  203. package/dist/es/hcs-25/collectors/freshness.d.ts +36 -0
  204. package/dist/es/hcs-25/collectors/freshness.d.ts.map +1 -0
  205. package/dist/es/hcs-25/collectors/http.d.ts +67 -0
  206. package/dist/es/hcs-25/collectors/http.d.ts.map +1 -0
  207. package/dist/es/hcs-25/collectors/index.d.ts +21 -0
  208. package/dist/es/hcs-25/collectors/index.d.ts.map +1 -0
  209. package/dist/es/hcs-25/collectors/merge.d.ts +11 -0
  210. package/dist/es/hcs-25/collectors/merge.d.ts.map +1 -0
  211. package/dist/es/hcs-25/collectors/model-evals.d.ts +315 -0
  212. package/dist/es/hcs-25/collectors/model-evals.d.ts.map +1 -0
  213. package/dist/es/hcs-25/collectors/oss-popularity.d.ts +51 -0
  214. package/dist/es/hcs-25/collectors/oss-popularity.d.ts.map +1 -0
  215. package/dist/es/hcs-25/collectors/output-verification.d.ts +37 -0
  216. package/dist/es/hcs-25/collectors/output-verification.d.ts.map +1 -0
  217. package/dist/es/hcs-25/collectors/pipeline.d.ts +19 -0
  218. package/dist/es/hcs-25/collectors/pipeline.d.ts.map +1 -0
  219. package/dist/es/hcs-25/collectors/runner.d.ts +20 -0
  220. package/dist/es/hcs-25/collectors/runner.d.ts.map +1 -0
  221. package/dist/es/hcs-25/collectors/simple-evals.d.ts +91 -0
  222. package/dist/es/hcs-25/collectors/simple-evals.d.ts.map +1 -0
  223. package/dist/es/hcs-25/collectors/types.d.ts +113 -0
  224. package/dist/es/hcs-25/collectors/types.d.ts.map +1 -0
  225. package/dist/es/hcs-25/collectors/x402-onchain.d.ts +105 -0
  226. package/dist/es/hcs-25/collectors/x402-onchain.d.ts.map +1 -0
  227. package/dist/es/hcs-25/collectors/x402.d.ts +48 -0
  228. package/dist/es/hcs-25/collectors/x402.d.ts.map +1 -0
  229. package/dist/es/hcs-25/index.d.ts +1 -0
  230. package/dist/es/hcs-25/index.d.ts.map +1 -1
  231. package/dist/es/hcs-25/signals/marketplace.d.ts +6 -6
  232. package/dist/es/hcs-25/signals/marketplace.d.ts.map +1 -1
  233. package/dist/es/hcs-25/signals/model-evals.d.ts +12 -12
  234. package/dist/es/hcs-25/signals/model-evals.d.ts.map +1 -1
  235. package/dist/es/hcs-25/signals/operational.d.ts +15 -12
  236. package/dist/es/hcs-25/signals/operational.d.ts.map +1 -1
  237. package/dist/es/hcs-25/signals/simple-evals.d.ts +1 -1
  238. package/dist/es/hcs-25/signals/simple-evals.d.ts.map +1 -1
  239. package/dist/es/standards-sdk.es.js +137 -58
  240. package/dist/es/standards-sdk.es.js.map +1 -1
  241. package/dist/es/standards-sdk.es101.js +2 -2
  242. package/dist/es/standards-sdk.es103.js +2 -2
  243. package/dist/es/standards-sdk.es104.js +1 -1
  244. package/dist/es/standards-sdk.es106.js +1 -1
  245. package/dist/es/standards-sdk.es108.js +2 -2
  246. package/dist/es/standards-sdk.es11.js +1 -1
  247. package/dist/es/standards-sdk.es110.js +1 -1
  248. package/dist/es/standards-sdk.es111.js +2 -2
  249. package/dist/es/standards-sdk.es115.js +3 -3
  250. package/dist/es/standards-sdk.es116.js +4 -4
  251. package/dist/es/standards-sdk.es12.js +1 -1
  252. package/dist/es/standards-sdk.es120.js +4 -4
  253. package/dist/es/standards-sdk.es121.js +11 -11
  254. package/dist/es/standards-sdk.es122.js +176 -240
  255. package/dist/es/standards-sdk.es122.js.map +1 -1
  256. package/dist/es/standards-sdk.es123.js +41 -468
  257. package/dist/es/standards-sdk.es123.js.map +1 -1
  258. package/dist/es/standards-sdk.es124.js +28 -103
  259. package/dist/es/standards-sdk.es124.js.map +1 -1
  260. package/dist/es/standards-sdk.es125.js +185 -145
  261. package/dist/es/standards-sdk.es125.js.map +1 -1
  262. package/dist/es/standards-sdk.es126.js +13 -33
  263. package/dist/es/standards-sdk.es126.js.map +1 -1
  264. package/dist/es/standards-sdk.es127.js +44 -10
  265. package/dist/es/standards-sdk.es127.js.map +1 -1
  266. package/dist/es/standards-sdk.es128.js +150 -172
  267. package/dist/es/standards-sdk.es128.js.map +1 -1
  268. package/dist/es/standards-sdk.es129.js +166 -26
  269. package/dist/es/standards-sdk.es129.js.map +1 -1
  270. package/dist/es/standards-sdk.es13.js +1 -1
  271. package/dist/es/standards-sdk.es130.js +375 -18
  272. package/dist/es/standards-sdk.es130.js.map +1 -1
  273. package/dist/es/standards-sdk.es131.js +371 -139
  274. package/dist/es/standards-sdk.es131.js.map +1 -1
  275. package/dist/es/standards-sdk.es132.js +211 -180
  276. package/dist/es/standards-sdk.es132.js.map +1 -1
  277. package/dist/es/standards-sdk.es133.js +210 -770
  278. package/dist/es/standards-sdk.es133.js.map +1 -1
  279. package/dist/es/standards-sdk.es134.js +376 -10
  280. package/dist/es/standards-sdk.es134.js.map +1 -1
  281. package/dist/es/standards-sdk.es135.js +118 -564
  282. package/dist/es/standards-sdk.es135.js.map +1 -1
  283. package/dist/es/standards-sdk.es136.js +233 -608
  284. package/dist/es/standards-sdk.es136.js.map +1 -1
  285. package/dist/es/standards-sdk.es137.js +1328 -12
  286. package/dist/es/standards-sdk.es137.js.map +1 -1
  287. package/dist/es/standards-sdk.es138.js +133 -2
  288. package/dist/es/standards-sdk.es138.js.map +1 -1
  289. package/dist/es/standards-sdk.es139.js +258 -74
  290. package/dist/es/standards-sdk.es139.js.map +1 -1
  291. package/dist/es/standards-sdk.es14.js +1 -1
  292. package/dist/es/standards-sdk.es140.js +104 -38
  293. package/dist/es/standards-sdk.es140.js.map +1 -1
  294. package/dist/es/standards-sdk.es141.js +252 -2
  295. package/dist/es/standards-sdk.es141.js.map +1 -1
  296. package/dist/es/standards-sdk.es142.js +446 -203
  297. package/dist/es/standards-sdk.es142.js.map +1 -1
  298. package/dist/es/standards-sdk.es143.js +104 -1139
  299. package/dist/es/standards-sdk.es143.js.map +1 -1
  300. package/dist/es/standards-sdk.es144.js +144 -290
  301. package/dist/es/standards-sdk.es144.js.map +1 -1
  302. package/dist/es/standards-sdk.es145.js +31 -419
  303. package/dist/es/standards-sdk.es145.js.map +1 -1
  304. package/dist/es/standards-sdk.es146.js +10 -353
  305. package/dist/es/standards-sdk.es146.js.map +1 -1
  306. package/dist/es/standards-sdk.es147.js +144 -1084
  307. package/dist/es/standards-sdk.es147.js.map +1 -1
  308. package/dist/es/standards-sdk.es148.js +25 -204
  309. package/dist/es/standards-sdk.es148.js.map +1 -1
  310. package/dist/es/standards-sdk.es149.js +17 -1562
  311. package/dist/es/standards-sdk.es149.js.map +1 -1
  312. package/dist/es/standards-sdk.es15.js +1 -1
  313. package/dist/es/standards-sdk.es150.js +128 -1134
  314. package/dist/es/standards-sdk.es150.js.map +1 -1
  315. package/dist/es/standards-sdk.es151.js +199 -14
  316. package/dist/es/standards-sdk.es151.js.map +1 -1
  317. package/dist/es/standards-sdk.es152.js +773 -434
  318. package/dist/es/standards-sdk.es152.js.map +1 -1
  319. package/dist/es/standards-sdk.es153.js +10 -256
  320. package/dist/es/standards-sdk.es153.js.map +1 -1
  321. package/dist/es/standards-sdk.es154.js +567 -4
  322. package/dist/es/standards-sdk.es154.js.map +1 -1
  323. package/dist/es/standards-sdk.es155.js +619 -74
  324. package/dist/es/standards-sdk.es155.js.map +1 -1
  325. package/dist/es/standards-sdk.es156.js +12 -86
  326. package/dist/es/standards-sdk.es156.js.map +1 -1
  327. package/dist/es/standards-sdk.es157.js +2 -60
  328. package/dist/es/standards-sdk.es157.js.map +1 -1
  329. package/dist/es/standards-sdk.es158.js +87 -2547
  330. package/dist/es/standards-sdk.es158.js.map +1 -1
  331. package/dist/es/standards-sdk.es159.js +36 -155
  332. package/dist/es/standards-sdk.es159.js.map +1 -1
  333. package/dist/es/standards-sdk.es16.js +6 -6
  334. package/dist/es/standards-sdk.es160.js +2 -7
  335. package/dist/es/standards-sdk.es160.js.map +1 -1
  336. package/dist/es/standards-sdk.es161.js +223 -74
  337. package/dist/es/standards-sdk.es161.js.map +1 -1
  338. package/dist/es/standards-sdk.es162.js +1122 -47
  339. package/dist/es/standards-sdk.es162.js.map +1 -1
  340. package/dist/es/standards-sdk.es163.js +299 -187
  341. package/dist/es/standards-sdk.es163.js.map +1 -1
  342. package/dist/es/standards-sdk.es164.js +419 -23
  343. package/dist/es/standards-sdk.es164.js.map +1 -1
  344. package/dist/es/standards-sdk.es165.js +352 -55
  345. package/dist/es/standards-sdk.es165.js.map +1 -1
  346. package/dist/es/standards-sdk.es166.js +1113 -86
  347. package/dist/es/standards-sdk.es166.js.map +1 -1
  348. package/dist/es/standards-sdk.es167.js +200 -41
  349. package/dist/es/standards-sdk.es167.js.map +1 -1
  350. package/dist/es/standards-sdk.es168.js +1551 -188
  351. package/dist/es/standards-sdk.es168.js.map +1 -1
  352. package/dist/es/standards-sdk.es169.js +1161 -51
  353. package/dist/es/standards-sdk.es169.js.map +1 -1
  354. package/dist/es/standards-sdk.es170.js +15 -47
  355. package/dist/es/standards-sdk.es170.js.map +1 -1
  356. package/dist/es/standards-sdk.es171.js +445 -50
  357. package/dist/es/standards-sdk.es171.js.map +1 -1
  358. package/dist/es/standards-sdk.es172.js +255 -45
  359. package/dist/es/standards-sdk.es172.js.map +1 -1
  360. package/dist/es/standards-sdk.es173.js +4 -122
  361. package/dist/es/standards-sdk.es173.js.map +1 -1
  362. package/dist/es/standards-sdk.es174.js +77 -50
  363. package/dist/es/standards-sdk.es174.js.map +1 -1
  364. package/dist/es/standards-sdk.es175.js +85 -42
  365. package/dist/es/standards-sdk.es175.js.map +1 -1
  366. package/dist/es/standards-sdk.es176.js +60 -72
  367. package/dist/es/standards-sdk.es176.js.map +1 -1
  368. package/dist/es/standards-sdk.es177.js +2544 -65
  369. package/dist/es/standards-sdk.es177.js.map +1 -1
  370. package/dist/es/standards-sdk.es178.js +159 -44
  371. package/dist/es/standards-sdk.es178.js.map +1 -1
  372. package/dist/es/standards-sdk.es179.js +7 -36
  373. package/dist/es/standards-sdk.es179.js.map +1 -1
  374. package/dist/es/standards-sdk.es18.js +13 -13
  375. package/dist/es/standards-sdk.es180.js +86 -30
  376. package/dist/es/standards-sdk.es180.js.map +1 -1
  377. package/dist/es/standards-sdk.es181.js +65 -34
  378. package/dist/es/standards-sdk.es181.js.map +1 -1
  379. package/dist/es/standards-sdk.es182.js +196 -48
  380. package/dist/es/standards-sdk.es182.js.map +1 -1
  381. package/dist/es/standards-sdk.es183.js +23 -135
  382. package/dist/es/standards-sdk.es183.js.map +1 -1
  383. package/dist/es/standards-sdk.es184.js +54 -38
  384. package/dist/es/standards-sdk.es184.js.map +1 -1
  385. package/dist/es/standards-sdk.es185.js +102 -12470
  386. package/dist/es/standards-sdk.es185.js.map +1 -1
  387. package/dist/es/standards-sdk.es186.js +53 -52
  388. package/dist/es/standards-sdk.es186.js.map +1 -1
  389. package/dist/es/standards-sdk.es187.js +223 -103
  390. package/dist/es/standards-sdk.es187.js.map +1 -1
  391. package/dist/es/standards-sdk.es188.js +66 -75
  392. package/dist/es/standards-sdk.es188.js.map +1 -1
  393. package/dist/es/standards-sdk.es189.js +46 -197
  394. package/dist/es/standards-sdk.es189.js.map +1 -1
  395. package/dist/es/standards-sdk.es19.js +10 -10
  396. package/dist/es/standards-sdk.es190.js +58 -668
  397. package/dist/es/standards-sdk.es190.js.map +1 -1
  398. package/dist/es/standards-sdk.es191.js +45 -168
  399. package/dist/es/standards-sdk.es191.js.map +1 -1
  400. package/dist/es/standards-sdk.es192.js +115 -315
  401. package/dist/es/standards-sdk.es192.js.map +1 -1
  402. package/dist/es/standards-sdk.es193.js +51 -340
  403. package/dist/es/standards-sdk.es193.js.map +1 -1
  404. package/dist/es/standards-sdk.es194.js +54 -448
  405. package/dist/es/standards-sdk.es194.js.map +1 -1
  406. package/dist/es/standards-sdk.es195.js +72 -331
  407. package/dist/es/standards-sdk.es195.js.map +1 -1
  408. package/dist/es/standards-sdk.es196.js +75 -76
  409. package/dist/es/standards-sdk.es196.js.map +1 -1
  410. package/dist/es/standards-sdk.es197.js +44 -73
  411. package/dist/es/standards-sdk.es197.js.map +1 -1
  412. package/dist/es/standards-sdk.es198.js +34 -15
  413. package/dist/es/standards-sdk.es198.js.map +1 -1
  414. package/dist/es/standards-sdk.es199.js +30 -139
  415. package/dist/es/standards-sdk.es199.js.map +1 -1
  416. package/dist/es/standards-sdk.es2.js +2 -2
  417. package/dist/es/standards-sdk.es20.js +1 -1
  418. package/dist/es/standards-sdk.es200.js +34 -517
  419. package/dist/es/standards-sdk.es200.js.map +1 -1
  420. package/dist/es/standards-sdk.es201.js +48 -259
  421. package/dist/es/standards-sdk.es201.js.map +1 -1
  422. package/dist/es/standards-sdk.es202.js +127 -185
  423. package/dist/es/standards-sdk.es202.js.map +1 -1
  424. package/dist/es/standards-sdk.es203.js +36 -113
  425. package/dist/es/standards-sdk.es203.js.map +1 -1
  426. package/dist/es/standards-sdk.es204.js +12464 -134
  427. package/dist/es/standards-sdk.es204.js.map +1 -1
  428. package/dist/es/standards-sdk.es205.js +14 -181
  429. package/dist/es/standards-sdk.es205.js.map +1 -1
  430. package/dist/es/standards-sdk.es206.js +55 -683
  431. package/dist/es/standards-sdk.es206.js.map +1 -1
  432. package/dist/es/standards-sdk.es207.js +93 -167
  433. package/dist/es/standards-sdk.es207.js.map +1 -1
  434. package/dist/es/standards-sdk.es208.js +71 -225
  435. package/dist/es/standards-sdk.es208.js.map +1 -1
  436. package/dist/es/standards-sdk.es209.js +176 -215
  437. package/dist/es/standards-sdk.es209.js.map +1 -1
  438. package/dist/es/standards-sdk.es21.js +1 -1
  439. package/dist/es/standards-sdk.es210.js +675 -0
  440. package/dist/es/standards-sdk.es210.js.map +1 -0
  441. package/dist/es/standards-sdk.es211.js +76 -0
  442. package/dist/es/standards-sdk.es211.js.map +1 -0
  443. package/dist/es/standards-sdk.es212.js +175 -0
  444. package/dist/es/standards-sdk.es212.js.map +1 -0
  445. package/dist/es/standards-sdk.es213.js +325 -0
  446. package/dist/es/standards-sdk.es213.js.map +1 -0
  447. package/dist/es/standards-sdk.es214.js +349 -0
  448. package/dist/es/standards-sdk.es214.js.map +1 -0
  449. package/dist/es/standards-sdk.es215.js +456 -0
  450. package/dist/es/standards-sdk.es215.js.map +1 -0
  451. package/dist/es/standards-sdk.es216.js +334 -0
  452. package/dist/es/standards-sdk.es216.js.map +1 -0
  453. package/dist/es/standards-sdk.es217.js +79 -0
  454. package/dist/es/standards-sdk.es217.js.map +1 -0
  455. package/dist/es/standards-sdk.es218.js +142 -0
  456. package/dist/es/standards-sdk.es218.js.map +1 -0
  457. package/dist/es/standards-sdk.es219.js +520 -0
  458. package/dist/es/standards-sdk.es219.js.map +1 -0
  459. package/dist/es/standards-sdk.es22.js +1 -1
  460. package/dist/es/standards-sdk.es220.js +262 -0
  461. package/dist/es/standards-sdk.es220.js.map +1 -0
  462. package/dist/es/standards-sdk.es221.js +199 -0
  463. package/dist/es/standards-sdk.es221.js.map +1 -0
  464. package/dist/es/standards-sdk.es222.js +122 -0
  465. package/dist/es/standards-sdk.es222.js.map +1 -0
  466. package/dist/es/standards-sdk.es223.js +155 -0
  467. package/dist/es/standards-sdk.es223.js.map +1 -0
  468. package/dist/es/standards-sdk.es224.js +187 -0
  469. package/dist/es/standards-sdk.es224.js.map +1 -0
  470. package/dist/es/standards-sdk.es225.js +687 -0
  471. package/dist/es/standards-sdk.es225.js.map +1 -0
  472. package/dist/es/standards-sdk.es226.js +188 -0
  473. package/dist/es/standards-sdk.es226.js.map +1 -0
  474. package/dist/es/standards-sdk.es227.js +238 -0
  475. package/dist/es/standards-sdk.es227.js.map +1 -0
  476. package/dist/es/standards-sdk.es228.js +242 -0
  477. package/dist/es/standards-sdk.es228.js.map +1 -0
  478. package/dist/es/standards-sdk.es23.js +1 -1
  479. package/dist/es/standards-sdk.es24.js +1 -1
  480. package/dist/es/standards-sdk.es25.js +1 -1
  481. package/dist/es/standards-sdk.es26.js +1 -1
  482. package/dist/es/standards-sdk.es27.js +13 -13
  483. package/dist/es/standards-sdk.es30.js +2 -2
  484. package/dist/es/standards-sdk.es31.js +4 -4
  485. package/dist/es/standards-sdk.es32.js +1 -1
  486. package/dist/es/standards-sdk.es35.js +7 -7
  487. package/dist/es/standards-sdk.es36.js +4 -4
  488. package/dist/es/standards-sdk.es37.js +2 -2
  489. package/dist/es/standards-sdk.es38.js +2 -2
  490. package/dist/es/standards-sdk.es39.js +1 -1
  491. package/dist/es/standards-sdk.es4.js +2 -2
  492. package/dist/es/standards-sdk.es40.js +1 -1
  493. package/dist/es/standards-sdk.es41.js +2 -2
  494. package/dist/es/standards-sdk.es46.js +1 -1
  495. package/dist/es/standards-sdk.es5.js +2 -2
  496. package/dist/es/standards-sdk.es51.js +1 -1
  497. package/dist/es/standards-sdk.es53.js +1 -1
  498. package/dist/es/standards-sdk.es56.js +2 -2
  499. package/dist/es/standards-sdk.es59.js +1 -1
  500. package/dist/es/standards-sdk.es6.js +2 -2
  501. package/dist/es/standards-sdk.es60.js +1 -1
  502. package/dist/es/standards-sdk.es62.js +1 -1
  503. package/dist/es/standards-sdk.es63.js +2 -2
  504. package/dist/es/standards-sdk.es64.js +1 -1
  505. package/dist/es/standards-sdk.es65.js +1 -1
  506. package/dist/es/standards-sdk.es66.js +1 -1
  507. package/dist/es/standards-sdk.es67.js +8 -8
  508. package/dist/es/standards-sdk.es69.js +1 -1
  509. package/dist/es/standards-sdk.es7.js +1 -1
  510. package/dist/es/standards-sdk.es71.js +2 -2
  511. package/dist/es/standards-sdk.es72.js +3 -3
  512. package/dist/es/standards-sdk.es75.js +5 -5
  513. package/dist/es/standards-sdk.es76.js +3 -3
  514. package/dist/es/standards-sdk.es77.js +2 -2
  515. package/dist/es/standards-sdk.es78.js +1 -1
  516. package/dist/es/standards-sdk.es81.js +2 -2
  517. package/dist/es/standards-sdk.es83.js +2 -2
  518. package/dist/es/standards-sdk.es84.js +5 -5
  519. package/dist/es/standards-sdk.es85.js +1 -1
  520. package/dist/es/standards-sdk.es88.js +1 -1
  521. package/dist/es/standards-sdk.es89.js +2 -2
  522. package/dist/es/standards-sdk.es9.js +2 -2
  523. package/dist/es/standards-sdk.es90.js +4 -4
  524. package/dist/es/standards-sdk.es94.js +3 -3
  525. package/dist/es/standards-sdk.es96.js +2 -2
  526. package/dist/es/standards-sdk.es98.js +1 -1
  527. package/dist/es/standards-sdk.es99.js +3 -3
  528. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es137.js","sources":["../../src/utils/topic-id-utils.ts"],"sourcesContent":["/**\n * Utility functions for safely handling topic ID properties that may use different naming conventions\n */\n\n/**\n * Safely extracts topic ID from an inscription result object that may have either `topicId` or `topic_id`\n * @param inscription - The inscription result object\n * @returns The topic ID string or undefined if not found\n */\ntype TopicIdCarrier =\n | { topicId?: string; topic_id?: string }\n | Record<string, unknown>\n | null\n | undefined;\n\nexport function getTopicId(inscription: unknown): string | undefined {\n if (!inscription || typeof inscription !== 'object') return undefined;\n const obj = inscription as TopicIdCarrier;\n const direct =\n (obj as { topicId?: string }).topicId ||\n (obj as { topic_id?: string }).topic_id;\n if (typeof direct === 'string' && direct.trim()) return direct;\n const rec = obj as Record<string, unknown>;\n const t1 = rec['topicId'];\n if (typeof t1 === 'string' && t1.trim()) return t1;\n const t2 = rec['topic_id'];\n if (typeof t2 === 'string' && t2.trim()) return t2;\n return undefined;\n}\n"],"names":[],"mappings":"AAeO,SAAS,WAAW,aAA0C;AACnE,MAAI,CAAC,eAAe,OAAO,gBAAgB,SAAU,QAAO;AAC5D,QAAM,MAAM;AACZ,QAAM,SACH,IAA6B,WAC7B,IAA8B;AACjC,MAAI,OAAO,WAAW,YAAY,OAAO,KAAA,EAAQ,QAAO;AACxD,QAAM,MAAM;AACZ,QAAM,KAAK,IAAI,SAAS;AACxB,MAAI,OAAO,OAAO,YAAY,GAAG,KAAA,EAAQ,QAAO;AAChD,QAAM,KAAK,IAAI,UAAU;AACzB,MAAI,OAAO,OAAO,YAAY,GAAG,KAAA,EAAQ,QAAO;AAChD,SAAO;AACT;"}
1
+ {"version":3,"file":"standards-sdk.es137.js","sources":["../../src/hcs-25/collectors/model-evals.ts"],"sourcesContent":["import type { Hcs25JsonValue, Hcs25Subject } from '../types';\nimport { isJsonObject, readString, readSubjectAdditional } from '../signals';\nimport {\n Hcs25CollectorHttpError,\n isTimeoutError,\n requestJson,\n requestText,\n stripTrailingSlashes,\n} from './http';\nimport type {\n Hcs25CollectContext,\n Hcs25SignalAdapter,\n Hcs25SignalAdapterResult,\n} from './types';\n\nconst HF_API_BASE = 'https://huggingface.co/api';\nconst HF_DATASETS_BASE = 'https://huggingface.co/datasets';\nconst OPENROUTER_API_BASE = 'https://openrouter.ai/api/v1';\nconst OPENROUTER_FRONTEND_BASE = 'https://openrouter.ai/api/frontend';\nconst OPENLM_ARENA_URL = 'https://openlm.ai/chatbot-arena/';\nconst OPENLLM_DATASET_ID = 'open-llm-leaderboard/results';\nconst OPENLLM_DATASET_BRANCH = 'main';\n\nconst DEFAULT_MODEL_REGISTRIES: readonly string[] = ['openrouter', 'near-ai'];\nconst OPENROUTER_CATEGORY_SOURCE = 'openrouter:category-rankings';\nconst HUGGINGFACE_MODEL_INDEX_SOURCE = 'huggingface:model-index';\nconst HUGGINGFACE_POPULARITY_SOURCE = 'huggingface:popularity';\nconst CHATBOT_ARENA_SOURCE = 'chatbot-arena:leaderboard';\nconst OPENLLM_EVAL_SOURCES = ['openllm-leaderboard'];\n\nconst MODEL_ID_KEYS = [\n 'openrouterModelId',\n 'huggingFaceModelId',\n 'openrouterHuggingFaceId',\n 'modelId',\n 'model',\n 'name',\n] as const;\n\n/**\n * Resolves the subject's model identifier from `metadata.additional` keys\n * (in order) or falls back to `subject.id`.\n */\nexport function resolveModelId(subject: Hcs25Subject): string | null {\n const additional = readSubjectAdditional(subject);\n for (const key of MODEL_ID_KEYS) {\n const value = readString(additional, key);\n if (value) {\n return value;\n }\n }\n const metadata = subject.metadata ?? {};\n for (const key of MODEL_ID_KEYS) {\n const value = readString(metadata, key);\n if (value) {\n return value;\n }\n }\n return subject.id || null;\n}\n\n/**\n * True when two model identifiers refer to the same model: exact match,\n * or one is the `org/` prefixed form of the other.\n */\nexport function modelIdMatches(candidate: string, wanted: string): boolean {\n const a = candidate.trim().toLowerCase();\n const b = wanted.trim().toLowerCase();\n if (a === b) {\n return true;\n }\n const stripOrg = (id: string): string =>\n id.includes('/') ? id.slice(id.lastIndexOf('/') + 1) : id;\n return stripOrg(a) === stripOrg(b);\n}\n\nfunction statusFromError(error: unknown): 'timeout' | 'error' {\n return isTimeoutError(error) ? 'timeout' : 'error';\n}\n\nfunction asRecord(value: unknown): Record<string, Hcs25JsonValue> | undefined {\n return isJsonObject(value as Hcs25JsonValue)\n ? (value as Record<string, Hcs25JsonValue>)\n : undefined;\n}\n\nfunction parseNumber(value: unknown): number | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim()) {\n const parsed = Number(value.trim());\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\nconst encodeModelIdForPath = (modelId: string): string =>\n modelId\n .split('/')\n .map(segment => encodeURIComponent(segment))\n .join('/');\n\n// ---------------------------------------------------------------------------\n// Shared metric helpers (ported from registry-broker production adapters)\n// ---------------------------------------------------------------------------\n\nconst METRIC_EXCLUDE_TOKENS = [\n 'loss',\n 'perplexity',\n 'ppl',\n 'error',\n 'rmse',\n 'mae',\n 'wer',\n 'cer',\n 'bits',\n];\n\nconst METRIC_INCLUDE_TOKENS = [\n 'accuracy',\n 'acc',\n 'exact',\n 'em',\n 'f1',\n 'precision',\n 'recall',\n 'score',\n 'pass',\n 'win',\n 'bleu',\n 'rouge',\n 'mmlu',\n 'gsm',\n 'arc',\n 'hellaswag',\n 'truthfulqa',\n 'gpqa',\n 'humaneval',\n 'mbpp',\n 'swe',\n 'math',\n 'bbh',\n 'ceval',\n];\n\nconst hasToken = (input: string, tokens: readonly string[]): boolean =>\n tokens.some(token => input.includes(token));\n\n/**\n * Filters metric names like the production adapters: drops error-rate style\n * metrics and keeps the known capability-metric families.\n */\nexport function shouldIncludeMetric(name: string): boolean {\n const normalized = name.trim().toLowerCase();\n if (!normalized) {\n return false;\n }\n if (hasToken(normalized, METRIC_EXCLUDE_TOKENS)) {\n return false;\n }\n return hasToken(normalized, METRIC_INCLUDE_TOKENS);\n}\n\n/**\n * Normalizes a raw upstream metric to `[0,100]`: values ≤1 are treated as\n * ratios (×100), ≤100 clamp as percentages, anything larger is dropped\n * (returns null).\n */\nexport function normalizeMetricValue(raw: number): number | null {\n if (!Number.isFinite(raw)) {\n return null;\n }\n if (raw <= 1) {\n return Math.min(100, Math.max(0, raw * 100));\n }\n if (raw <= 100) {\n return Math.min(100, Math.max(0, raw));\n }\n return null;\n}\n\n/**\n * Log-scale popularity normalization: `log10(v+1)/log10(max+1)*100`.\n */\nexport function normalizeLogScore(value: number, max: number): number | null {\n if (\n !Number.isFinite(value) ||\n value <= 0 ||\n !Number.isFinite(max) ||\n max <= 0\n ) {\n return null;\n }\n const numerator = Math.log10(value + 1);\n const denominator = Math.log10(max + 1);\n if (\n !Number.isFinite(numerator) ||\n !Number.isFinite(denominator) ||\n denominator <= 0\n ) {\n return null;\n }\n return Math.min(100, Math.max(0, (numerator / denominator) * 100));\n}\n\n/**\n * Production popularity proxy: log-scaled downloads (cap 10M) and likes\n * (cap 100K), mixed 0.7/0.3.\n */\nexport function computePopularityScore(\n downloads: number | null,\n likes: number | null,\n downloadsCap = 10_000_000,\n likesCap = 100_000,\n): number | null {\n const downloadsScore =\n downloads !== null ? normalizeLogScore(downloads, downloadsCap) : null;\n const likesScore = likes !== null ? normalizeLogScore(likes, likesCap) : null;\n if (downloadsScore === null) {\n return likesScore;\n }\n if (likesScore === null) {\n return downloadsScore;\n }\n return downloadsScore * 0.7 + likesScore * 0.3;\n}\n\ninterface HuggingFaceModelResponse {\n id?: string;\n downloads?: number;\n likes?: number;\n 'model-index'?: unknown;\n model_index?: unknown;\n modelIndex?: unknown;\n cardData?: { 'model-index'?: unknown };\n}\n\n/**\n * Extracts normalized model-index metrics from a HF `/api/models/{id}`\n * payload, reading the top-level `model-index` (plus `model_index` /\n * `modelIndex` / `cardData.model-index` fallbacks). Metrics arrive either\n * as an array of `{name|metric|type, value}` or a `Record<name, value>`\n * map; names are filtered by {@link shouldIncludeMetric} and values by\n * {@link normalizeMetricValue}.\n */\nexport function extractModelIndexMetrics(\n payload: HuggingFaceModelResponse | undefined,\n maxMetrics = 60,\n): Array<{ name: string; value: number }> {\n const modelIndex =\n payload?.['model-index'] ??\n payload?.model_index ??\n payload?.modelIndex ??\n payload?.cardData?.['model-index'];\n if (!Array.isArray(modelIndex)) {\n return [];\n }\n const metrics: Array<{ name: string; value: number }> = [];\n for (const entry of modelIndex) {\n const results = asRecord(entry)?.results;\n if (!Array.isArray(results)) {\n continue;\n }\n for (const result of results) {\n const block = asRecord(result)?.metrics;\n const push = (name: unknown, rawValue: unknown): void => {\n const rawName =\n typeof name === 'string' && name.trim() ? name.trim() : null;\n const parsed = parseNumber(rawValue);\n if (!rawName || parsed === null || !shouldIncludeMetric(rawName)) {\n return;\n }\n const normalized = normalizeMetricValue(parsed);\n if (normalized === null) {\n return;\n }\n metrics.push({ name: rawName, value: normalized });\n };\n if (Array.isArray(block)) {\n for (const metric of block) {\n const record = asRecord(metric);\n if (!record) {\n continue;\n }\n const name = record.name ?? record.metric ?? record.type ?? null;\n push(name, record.value);\n if (metrics.length >= maxMetrics) {\n return metrics;\n }\n }\n } else if (block && typeof block === 'object') {\n for (const [name, value] of Object.entries(\n block as Record<string, unknown>,\n )) {\n push(name, value);\n if (metrics.length >= maxMetrics) {\n return metrics;\n }\n }\n }\n }\n }\n return metrics;\n}\n\n/**\n * Resolves the canonical Hugging Face model id for a subject: stored\n * `huggingFaceModelId`/`openrouterHuggingFaceId` first, then the\n * OpenRouter `/api/v1/models` `hugging_face_id` link, then a HF search\n * fallback matching the normalized id.\n */\nexport async function resolveHuggingFaceModelId(\n modelId: string,\n context: Hcs25CollectContext,\n options: {\n huggingFaceApiBase?: string;\n openrouterApiBase?: string;\n token?: string;\n } = {},\n): Promise<string | null> {\n const normalized = modelId.trim().toLowerCase();\n if (!normalized) {\n return null;\n }\n\n // OpenRouter model catalog carries an explicit `hugging_face_id` link.\n try {\n const payload = await requestJson<{\n data?: Array<{ id?: unknown; hugging_face_id?: unknown }>;\n }>(`${options.openrouterApiBase ?? OPENROUTER_API_BASE}/models`, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n if (Array.isArray(payload.data)) {\n const match = payload.data.find(entry => {\n const id = typeof entry.id === 'string' ? entry.id.trim() : '';\n return id.toLowerCase() === normalized;\n });\n const hfId =\n match && typeof match.hugging_face_id === 'string'\n ? match.hugging_face_id.trim()\n : '';\n if (hfId) {\n return hfId;\n }\n }\n } catch {\n // fall through to HF search\n }\n\n // Fallback: HF search over the normalized id.\n try {\n const headers: Record<string, string> = options.token\n ? { authorization: `Bearer ${options.token}` }\n : {};\n const payload = await requestJson<unknown>(\n `${options.huggingFaceApiBase ?? HF_API_BASE}/models?search=${encodeURIComponent(normalized)}`,\n {\n fetch: context.fetch,\n headers,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n },\n );\n if (Array.isArray(payload)) {\n const match = payload.find(entry => {\n const id = asRecord(entry)?.id;\n return typeof id === 'string' && modelIdMatches(id, normalized);\n });\n const id = asRecord(match)?.id;\n if (typeof id === 'string' && id.trim()) {\n return id.trim();\n }\n }\n } catch {\n // unresolved\n }\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// OpenRouter category benchmarks\n// ---------------------------------------------------------------------------\n\n/**\n * A single category ranking/benchmark entry for one model.\n */\nexport interface Hcs25OpenRouterEvalRow {\n /** Model identifier or alias. */\n model: string;\n /** Benchmark category (e.g. \"coding\", \"reasoning\"). */\n category?: string;\n /** Rank position (1-based) when the source is a ranking. */\n rank?: number;\n /** Total entries ranked in this category (enables percentile). */\n outOf?: number;\n /** Direct score in `[0,100]` when the source provides one. */\n score?: number;\n /** Optional per-row weight (e.g. category volume). Default 1. */\n weight?: number;\n}\n\nexport interface Hcs25OpenRouterEvalsData {\n rows: readonly Hcs25OpenRouterEvalRow[];\n /**\n * Raw coverage proxy (e.g. summed entry volume). When provided,\n * `low-coverage` is emitted when the summed row weight falls below\n * `lowCoverageThreshold`.\n */\n coverageWeight?: number;\n /** Source identifiers stored in `openrouterEvalSources`. */\n sources?: readonly string[];\n /** Resolved Hugging Face id, persisted as `openrouterHuggingFaceId`. */\n huggingFaceId?: string;\n /** Total categories the source covers (ratio fallback for coverage). */\n totalCategories?: number;\n}\n\n/**\n * Fetches OpenRouter-style category benchmark data for a subject. Return\n * null when the source has no data for the model.\n */\nexport type Hcs25OpenRouterEvalsSource = (\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n) => Promise<Hcs25OpenRouterEvalsData | null>;\n\n/**\n * Options for the `openrouter-evals` signal adapter.\n */\nexport interface Hcs25OpenRouterEvalsSignalAdapterOptions {\n /** Data source. Default: {@link createOpenRouterBenchmarksSource} (the\n * production OpenRouter endpoint). */\n source?: Hcs25OpenRouterEvalsSource;\n /**\n * Minimum summed row weight before coverage is considered adequate.\n * Default 5 (matching production `minCoverageWeight`).\n */\n lowCoverageThreshold?: number;\n /**\n * Minimum number of covered categories before coverage is considered\n * adequate. Default 1.\n */\n minCategoryCount?: number;\n timeoutMs?: number;\n includeRegistries?: readonly string[];\n appliesTo?: (subject: Hcs25Subject) => boolean;\n}\n\n/**\n * Creates an OpenRouter evals source that fetches a JSON document shaped\n * `{rows: Hcs25OpenRouterEvalRow[], ...}` from a configured endpoint. For\n * sources with a different shape, wrap `requestJson` in a custom\n * `Hcs25OpenRouterEvalsSource`.\n */\nexport function createOpenRouterEvalsHttpSource(options: {\n url: string | ((subject: Hcs25Subject) => string | null);\n}): Hcs25OpenRouterEvalsSource {\n return async (subject, context) => {\n const url =\n typeof options.url === 'function' ? options.url(subject) : options.url;\n if (!url) {\n return null;\n }\n const data = await requestJson<Hcs25OpenRouterEvalsData>(url, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n if (!data || !Array.isArray(data.rows)) {\n return null;\n }\n return data;\n };\n}\n\ninterface OpenRouterBenchmarkEntry {\n model?: string;\n category?: string;\n rank?: number;\n volume?: number;\n count?: number;\n}\n\nconst stripDateSuffix = (value: string): string | null => {\n const trimmed = value.trim().toLowerCase();\n const match = trimmed.match(/^(.*?)-(\\d{8}|\\d{4}-\\d{2}-\\d{2}|\\d{2}-\\d{4})$/);\n return match?.[1]?.trim() || null;\n};\n\nconst buildBenchmarkCandidates = (normalizedId: string): string[] => {\n const candidates = new Set([normalizedId, `${normalizedId}:free`]);\n if (normalizedId.endsWith(':free')) {\n candidates.add(normalizedId.slice(0, -':free'.length));\n }\n return [...candidates];\n};\n\n/**\n * Production-shaped OpenRouter benchmarks source: fetches\n * `{frontendBase}/models/find?q=benchmarks`, indexes the per-model\n * `category`/`rank`/`volume` entries with `:free` and date-suffix aliases,\n * and emits rank-percentile rows for the subject's model. When\n * `preferHuggingFace` is set (default true) the subject's\n * `hugging_face_id` (resolved via the OpenRouter `/models` catalog) yields\n * a direct HF model-index score first, matching production precedence.\n */\nexport function createOpenRouterBenchmarksSource(\n options: {\n openrouterFrontendBaseUrl?: string;\n openrouterApiBaseUrl?: string;\n huggingFaceApiBase?: string;\n /** Benchmarks snapshot cache TTL in ms. Default 24h. */\n cacheTtlMs?: number;\n /** Try the HF model-index score first when an HF id resolves. */\n preferHuggingFace?: boolean;\n } = {},\n): Hcs25OpenRouterEvalsSource {\n const frontendBase = stripTrailingSlashes(\n options.openrouterFrontendBaseUrl ?? OPENROUTER_FRONTEND_BASE,\n );\n const apiBase = stripTrailingSlashes(\n options.openrouterApiBaseUrl ?? OPENROUTER_API_BASE,\n );\n const hfBase = stripTrailingSlashes(\n options.huggingFaceApiBase ?? HF_API_BASE,\n );\n const cacheTtlMs = options.cacheTtlMs ?? 24 * 60 * 60 * 1000;\n const preferHuggingFace = options.preferHuggingFace ?? true;\n let cache: {\n fetchedAt: number;\n byModel: Map<string, OpenRouterBenchmarkEntry[]>;\n categoryMaxRank: Map<string, number>;\n } | null = null;\n\n const loadBenchmarks = async (\n context: Hcs25CollectContext,\n ): Promise<{\n byModel: Map<string, OpenRouterBenchmarkEntry[]>;\n categoryMaxRank: Map<string, number>;\n } | null> => {\n if (cache && Date.now() - cache.fetchedAt < cacheTtlMs) {\n return cache;\n }\n const payload = await requestJson<{\n data?: { categories?: Record<string, OpenRouterBenchmarkEntry[]> };\n }>(`${frontendBase}/models/find?q=benchmarks`, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n const categories = payload.data?.categories;\n if (!categories || typeof categories !== 'object') {\n return null;\n }\n const byModel = new Map<string, OpenRouterBenchmarkEntry[]>();\n const categoryMaxRank = new Map<string, number>();\n for (const [model, entries] of Object.entries(categories)) {\n if (!Array.isArray(entries) || entries.length === 0) {\n continue;\n }\n const normalizedModel = model.trim().toLowerCase();\n if (!normalizedModel) {\n continue;\n }\n const registerAlias = (alias: string | null): void => {\n const candidate = alias?.trim().toLowerCase() ?? '';\n if (candidate && !byModel.has(candidate)) {\n byModel.set(candidate, entries);\n }\n };\n byModel.set(normalizedModel, entries);\n const noFree = normalizedModel.endsWith(':free')\n ? normalizedModel.slice(0, -':free'.length)\n : null;\n registerAlias(noFree);\n registerAlias(stripDateSuffix(normalizedModel));\n registerAlias(noFree ? stripDateSuffix(noFree) : null);\n for (const entry of entries) {\n const category =\n typeof entry.category === 'string'\n ? entry.category.trim().toLowerCase()\n : null;\n const rank = parseNumber(entry.rank);\n if (!category || rank === null) {\n continue;\n }\n const currentMax = categoryMaxRank.get(category) ?? 0;\n if (rank > currentMax) {\n categoryMaxRank.set(category, rank);\n }\n }\n }\n cache = { fetchedAt: Date.now(), byModel, categoryMaxRank };\n return cache;\n };\n\n return async (subject, context) => {\n const modelId = resolveModelId(subject);\n if (!modelId) {\n return null;\n }\n const normalizedId = modelId.trim().toLowerCase();\n\n // HF-first path (production precedence): resolve hugging_face_id via\n // the OpenRouter catalog, then reuse the HF model-index score.\n let huggingFaceId: string | null = null;\n if (preferHuggingFace) {\n huggingFaceId = await resolveHuggingFaceModelId(modelId, context, {\n openrouterApiBase: apiBase,\n huggingFaceApiBase: hfBase,\n }).catch((): null => null);\n if (huggingFaceId) {\n try {\n const payload = await requestJson<HuggingFaceModelResponse>(\n `${hfBase}/models/${encodeModelIdForPath(huggingFaceId)}`,\n {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n },\n );\n const metrics = extractModelIndexMetrics(payload);\n if (metrics.length > 0) {\n const score =\n metrics.reduce((sum, m) => sum + m.value, 0) / metrics.length;\n return {\n rows: [\n {\n model: modelId,\n score,\n weight: metrics.length,\n },\n ],\n coverageWeight: metrics.length,\n sources: [HUGGINGFACE_MODEL_INDEX_SOURCE],\n huggingFaceId,\n };\n }\n } catch {\n // fall through to benchmark rankings\n }\n }\n }\n\n const snapshot = await loadBenchmarks(context);\n if (!snapshot) {\n return null;\n }\n let entries: OpenRouterBenchmarkEntry[] | undefined;\n for (const candidate of buildBenchmarkCandidates(normalizedId)) {\n entries = snapshot.byModel.get(candidate);\n if (entries?.length) {\n break;\n }\n }\n if (!entries?.length) {\n return null;\n }\n const rows: Hcs25OpenRouterEvalRow[] = [];\n for (const entry of entries) {\n const category =\n typeof entry.category === 'string'\n ? entry.category.trim().toLowerCase()\n : undefined;\n const rank = parseNumber(entry.rank);\n if (!category || rank === null) {\n continue;\n }\n const maxRank = snapshot.categoryMaxRank.get(category);\n if (!maxRank || maxRank <= 0) {\n continue;\n }\n const volume = parseNumber(entry.volume);\n const count = parseNumber(entry.count);\n rows.push({\n model: modelId,\n category,\n rank,\n outOf: maxRank,\n score: ((maxRank - rank + 1) / maxRank) * 100,\n weight: volume && volume > 0 ? volume : count && count > 0 ? count : 1,\n });\n }\n if (rows.length === 0) {\n return null;\n }\n return {\n rows,\n coverageWeight: rows.reduce((sum, row) => sum + (row.weight ?? 1), 0),\n sources: [OPENROUTER_CATEGORY_SOURCE],\n huggingFaceId: huggingFaceId ?? undefined,\n };\n };\n}\n\n/**\n * Creates the `openrouter-evals` signal adapter: collects per-category\n * benchmark rows for the subject's model, computes a coverage-weighted\n * score, and stores the `openrouterEval*` fields under\n * `metadata.additional`. `openrouterEvalStatus` is `low-coverage` when the\n * summed row weight or category count falls under the configured floors.\n */\nexport function createOpenRouterEvalsSignalAdapter(\n options: Hcs25OpenRouterEvalsSignalAdapterOptions = {},\n): Hcs25SignalAdapter {\n const lowCoverageThreshold = options.lowCoverageThreshold ?? 5;\n const minCategoryCount = options.minCategoryCount ?? 1;\n const source = options.source ?? createOpenRouterBenchmarksSource();\n\n const collect = async (\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n ): Promise<Hcs25SignalAdapterResult[]> => {\n const now = context.now.toISOString();\n const modelId = resolveModelId(subject);\n\n let data: Hcs25OpenRouterEvalsData | null = null;\n try {\n data = await source(subject, context);\n } catch (error) {\n if (error instanceof Hcs25CollectorHttpError && error.status === 404) {\n data = null;\n } else {\n return [\n {\n signalId: 'openrouter.evals',\n status: statusFromError(error),\n fields: [\n {\n scope: 'additional',\n values: {\n openrouterEvalStatus: 'error',\n openrouterEvalUpdatedAt: now,\n },\n },\n ],\n },\n ];\n }\n }\n\n const rows =\n data && modelId\n ? data.rows.filter(row => modelIdMatches(row.model, modelId))\n : [];\n\n if (!data || rows.length === 0) {\n return [\n {\n signalId: 'openrouter.evals',\n status: 'missing',\n fields: [\n {\n scope: 'additional',\n values: {\n openrouterEvalStatus: 'missing',\n openrouterEvalUpdatedAt: now,\n openrouterEvalMetricsCount: 0,\n },\n },\n ],\n },\n ];\n }\n\n let weightedSum = 0;\n let totalWeight = 0;\n const categoryStats = new Map<\n string,\n { scoreSum: number; weightSum: number }\n >();\n for (const row of rows) {\n const score =\n typeof row.score === 'number'\n ? row.score\n : typeof row.rank === 'number' &&\n typeof row.outOf === 'number' &&\n row.outOf > 0\n ? ((row.outOf - row.rank + 1) / row.outOf) * 100\n : null;\n if (score === null) {\n continue;\n }\n const weight = row.weight ?? 1;\n weightedSum += score * weight;\n totalWeight += weight;\n if (row.category) {\n const existing = categoryStats.get(row.category) ?? {\n scoreSum: 0,\n weightSum: 0,\n };\n existing.scoreSum += score * weight;\n existing.weightSum += weight;\n categoryStats.set(row.category, existing);\n }\n }\n\n if (totalWeight <= 0) {\n return [\n {\n signalId: 'openrouter.evals',\n status: 'missing',\n fields: [\n {\n scope: 'additional',\n values: {\n openrouterEvalStatus: 'missing',\n openrouterEvalUpdatedAt: now,\n },\n },\n ],\n },\n ];\n }\n\n const score = Math.min(100, Math.max(0, weightedSum / totalWeight));\n // Coverage proxy: prefer the source's raw weight (e.g. summed volume);\n // otherwise derive a category-coverage ratio.\n const coverageWeight =\n data.coverageWeight ??\n (data.totalCategories && data.totalCategories > 0\n ? categoryStats.size / data.totalCategories\n : totalWeight);\n const status =\n categoryStats.size < minCategoryCount ||\n coverageWeight < lowCoverageThreshold\n ? 'low-coverage'\n : 'ok';\n const topCategories = [...categoryStats.entries()]\n .map(([category, stats]) => ({\n category,\n score:\n (stats.weightSum > 0\n ? Math.min(100, Math.max(0, stats.scoreSum / stats.weightSum))\n : 0) *\n Math.min(1, Math.max(0, stats.weightSum / lowCoverageThreshold)),\n weight: stats.weightSum,\n }))\n .sort((a, b) => b.score - a.score || b.weight - a.weight)\n .slice(0, 5)\n .map(entry => entry.category);\n\n return [\n {\n signalId: 'openrouter.evals',\n status: 'ok',\n value: score,\n fields: [\n {\n scope: 'additional',\n values: {\n openrouterEvalScore: Math.round(score * 100) / 100,\n openrouterEvalStatus: status,\n openrouterEvalUpdatedAt: now,\n openrouterEvalSources:\n data.sources && data.sources.length > 0\n ? [...data.sources]\n : [OPENROUTER_CATEGORY_SOURCE],\n openrouterEvalMetricsCount: rows.length,\n openrouterEvalCategoryCount: categoryStats.size,\n openrouterEvalCoverageWeight:\n Math.round(coverageWeight * 1000) / 1000,\n ...(topCategories.length > 0\n ? { openrouterEvalCategories: topCategories }\n : {}),\n ...(data.huggingFaceId\n ? { openrouterHuggingFaceId: data.huggingFaceId }\n : {}),\n },\n },\n ],\n provenance: {\n source: 'openrouter',\n subjectId: modelId,\n fetchedAt: now,\n },\n },\n ];\n };\n\n return {\n id: 'openrouter-evals',\n produces: ['openrouter.evals'],\n timeoutMs: options.timeoutMs,\n includeRegistries: options.includeRegistries ?? DEFAULT_MODEL_REGISTRIES,\n appliesTo: options.appliesTo,\n collect,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Chatbot Arena (preference leaderboard)\n// ---------------------------------------------------------------------------\n\n/**\n * One leaderboard entry.\n */\nexport interface Hcs25LeaderboardEntry {\n /** Model identifier or display name. */\n model: string;\n /** Elo-like rating or score. */\n score: number;\n /** Vote/sample count when available. */\n votes?: number;\n /** Organization/provider label when the source carries it. */\n organization?: string;\n}\n\n/**\n * Fetches a leaderboard snapshot for min/max normalization.\n */\nexport type Hcs25LeaderboardSource = (\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n) => Promise<readonly Hcs25LeaderboardEntry[] | null>;\n\n/**\n * Options for the `chatbot-arena` signal adapter.\n */\nexport interface Hcs25ChatbotArenaSignalAdapterOptions {\n /** Leaderboard source. Default: {@link createOpenLmArenaSource}. */\n source?: Hcs25LeaderboardSource;\n /** Extra aliases for the subject's model on the leaderboard. */\n aliases?: readonly string[];\n timeoutMs?: number;\n includeRegistries?: readonly string[];\n appliesTo?: (subject: Hcs25Subject) => boolean;\n}\n\n/**\n * Creates a leaderboard source from a JSON endpoint returning an array (or\n * `{entries|rows|leaderboard: []}`) of objects with configurable key names.\n */\nexport function createJsonLeaderboardSource(options: {\n url: string;\n modelKey?: string;\n scoreKey?: string;\n votesKey?: string;\n}): Hcs25LeaderboardSource {\n const modelKey = options.modelKey ?? 'model';\n const scoreKey = options.scoreKey ?? 'score';\n const votesKey = options.votesKey ?? 'votes';\n\n return async (_subject, context) => {\n const data = await requestJson<unknown>(options.url, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n const record = asRecord(data);\n const rows = Array.isArray(data)\n ? data\n : (record?.entries ?? record?.rows ?? record?.leaderboard);\n if (!Array.isArray(rows)) {\n return null;\n }\n const entries: Hcs25LeaderboardEntry[] = [];\n for (const row of rows) {\n const rowRecord = asRecord(row);\n if (!rowRecord) {\n continue;\n }\n const model = readString(rowRecord, modelKey);\n const score = rowRecord[scoreKey];\n const votes = rowRecord[votesKey];\n if (!model || typeof score !== 'number' || !Number.isFinite(score)) {\n continue;\n }\n entries.push({\n model,\n score,\n votes: typeof votes === 'number' ? votes : undefined,\n });\n }\n return entries;\n };\n}\n\nconst stripHtmlTags = (html: string): string => {\n // Loop until stable: a single pass over `<<script>` leaves a residual\n // tag fragment behind.\n let current = html;\n for (;;) {\n const next = current.replace(/<[^<>]*>/g, '');\n if (next === current) {\n return next;\n }\n current = next;\n }\n};\n\nconst decodeHtmlEntities = (html: string): string =>\n html\n .replace(/&nbsp;/gi, ' ')\n .replace(/&lt;/gi, '<')\n .replace(/&gt;/gi, '>')\n .replace(/&quot;/gi, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/&#(\\d+);/g, (_match, codepoint) => {\n const parsed = Number(codepoint);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return '';\n }\n try {\n return String.fromCodePoint(parsed);\n } catch {\n return '';\n }\n })\n // `&amp;` decodes last so double-escaped sequences (`&amp;lt;`) resolve\n // to the literal text `&lt;`, not `<`.\n .replace(/&amp;/gi, '&');\n\nconst normalizeArenaLabel = (value: string): string => {\n const trimmed = value.trim();\n // `Name (suffix)` — take the final parenthesized group without a\n // backtracking-prone `.*` scan.\n const open = trimmed.lastIndexOf('(');\n const base =\n open > 0 && trimmed.endsWith(')') ? trimmed.slice(0, open).trim() : trimmed;\n const suffix =\n open > 0 && trimmed.endsWith(')')\n ? trimmed.slice(open + 1, -1).trim()\n : null;\n const compactSuffix = suffix?.split(/\\s+/).join('') ?? '';\n const isDate =\n suffix !== null &&\n (/^20\\d{2}-\\d{2}-\\d{2}$/.test(suffix) ||\n /^20\\d{2}\\d{2}\\d{2}$/.test(compactSuffix));\n const combined = !isDate && suffix ? `${base} ${suffix}` : base;\n const slugged = combined.toLowerCase().replace(/[^a-z0-9]+/g, '-');\n let start = 0;\n let end = slugged.length;\n while (start < end && slugged.charCodeAt(start) === 45) {\n start += 1;\n }\n while (end > start && slugged.charCodeAt(end - 1) === 45) {\n end -= 1;\n }\n return slugged.slice(start, end);\n};\n\nconst normalizeAlphaNum = (value: string): string =>\n value.toLowerCase().replace(/[^a-z0-9]+/g, '');\n\nconst stripTrailingDateSuffix = (value: string): string | null => {\n const match =\n value\n .trim()\n .toLowerCase()\n .match(/^(.*?)-(20\\d{2}-\\d{2}-\\d{2})$/) ??\n value\n .trim()\n .toLowerCase()\n .match(/^(.*?)-(20\\d{2}\\d{2})$/);\n return match?.[1]?.trim() || null;\n};\n\n/**\n * Production-style arena match keys for a leaderboard label: normalized\n * label, alphanumerics, provider-prefixed forms, chatgpt/gpt aliases,\n * date-suffix and `-latest` expansions.\n */\nexport function buildArenaMatchKeys(\n label: string,\n organization?: string | null,\n): string[] {\n const normalized = normalizeArenaLabel(label);\n const keys = new Set<string>();\n if (!normalized) {\n return [];\n }\n const pushKey = (value: string | null | undefined): void => {\n const candidate = value?.trim() ?? '';\n if (!candidate) {\n return;\n }\n keys.add(candidate);\n keys.add(normalizeAlphaNum(candidate));\n };\n const expandChatGptAliases = (value: string): void => {\n if (value.startsWith('chatgpt-')) {\n pushKey(`gpt-${value.slice('chatgpt-'.length)}`);\n }\n if (value.startsWith('gpt-')) {\n const rest = value.slice('gpt-'.length);\n pushKey(`chatgpt-${rest}`);\n pushKey(`chatgpt-${rest}-latest`);\n }\n };\n const expandDateAliases = (value: string): void => {\n const stripped = stripTrailingDateSuffix(value);\n if (stripped) {\n pushKey(stripped);\n expandChatGptAliases(stripped);\n }\n };\n\n pushKey(normalized);\n const org = normalizeArenaLabel(organization ?? '');\n if (org) {\n pushKey(`${org}-${normalized}`);\n pushKey(`${org}/${normalized}`);\n }\n expandChatGptAliases(normalized);\n expandDateAliases(normalized);\n if (normalized.endsWith('-latest')) {\n const without = normalized.slice(0, -'-latest'.length);\n pushKey(without);\n expandChatGptAliases(without);\n expandDateAliases(without);\n }\n return [...keys].filter(Boolean);\n}\n\nconst arenaCandidateKeys = (modelId: string): string[] => {\n const base = modelId\n .trim()\n .toLowerCase()\n .replace(/:free$/i, '');\n const candidates = new Set<string>();\n const add = (value: string): void => {\n const trimmed = value.trim();\n if (trimmed) {\n candidates.add(normalizeArenaLabel(trimmed));\n candidates.add(normalizeAlphaNum(trimmed));\n }\n };\n add(base);\n add(base.replace(/\\//g, '-'));\n const withoutFast = base.replace(/-fast$/i, '');\n if (withoutFast !== base) {\n add(withoutFast);\n }\n const stripped = stripTrailingDateSuffix(base);\n if (stripped) {\n add(stripped);\n }\n if (base.startsWith('gpt-')) {\n add(`chatgpt-${base.slice(4)}`);\n }\n if (base.startsWith('chatgpt-')) {\n add(`gpt-${base.slice(8)}`);\n }\n if (base.endsWith('-latest')) {\n add(base.slice(0, -'-latest'.length));\n }\n const orgPrefix = base.includes('/') ? base.split('/')[0] : null;\n if (orgPrefix) {\n const model = base.slice(orgPrefix.length + 1);\n add(`${orgPrefix}-${model}`);\n add(`${orgPrefix}/${model}`);\n }\n return [...candidates].filter(Boolean);\n};\n\n/**\n * Scrapes the production OpenLM Chatbot Arena HTML leaderboard\n * (`https://openlm.ai/chatbot-arena/` by default): parses the `sortable`\n * table's `tbody` rows — medal, model label, arena elo, …, organization —\n * and emits `Hcs25LeaderboardEntry` records keyed via\n * {@link buildArenaMatchKeys} label normalization.\n */\nexport function createOpenLmArenaSource(\n options: {\n url?: string;\n /** Snapshot cache TTL in ms. Default 24h. */\n cacheTtlMs?: number;\n } = {},\n): Hcs25LeaderboardSource {\n const url = options.url ?? OPENLM_ARENA_URL;\n const cacheTtlMs = options.cacheTtlMs ?? 24 * 60 * 60 * 1000;\n let cache: { fetchedAt: number; entries: Hcs25LeaderboardEntry[] } | null =\n null;\n\n return async (_subject, context) => {\n if (cache && Date.now() - cache.fetchedAt < cacheTtlMs) {\n return cache.entries;\n }\n const html = await requestText(url, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n headers: { accept: 'text/html' },\n });\n const tableMatch = html.match(\n /<table[^>]*class=sortable[^>]*>.*?<\\/table>/is,\n );\n if (!tableMatch) {\n return null;\n }\n const tbodyMatch = tableMatch[0].match(/<tbody[^>]*>(.*?)<\\/tbody>/is);\n const tbody = tbodyMatch?.[1];\n if (!tbody) {\n return null;\n }\n const entries: Hcs25LeaderboardEntry[] = [];\n for (const rowMatch of tbody.matchAll(/<tr[^>]*>(.*?)<\\/tr>/gis)) {\n const rowHtml = rowMatch[1] ?? '';\n if (!rowHtml) {\n continue;\n }\n const cells = Array.from(rowHtml.matchAll(/<td[^>]*>(.*?)<\\/td>/gis)).map(\n match => match[1] ?? '',\n );\n const rawLabelCell = cells[1];\n const rawScoreCell = cells[2];\n const rawOrgCell = cells[8];\n const modelLabel = decodeHtmlEntities(\n stripHtmlTags(rawLabelCell ?? ''),\n ).trim();\n if (!modelLabel) {\n continue;\n }\n const score = parseNumber(\n decodeHtmlEntities(stripHtmlTags(rawScoreCell ?? '')).trim(),\n );\n if (score === null) {\n continue;\n }\n const organization =\n decodeHtmlEntities(stripHtmlTags(rawOrgCell ?? '')).trim() || undefined;\n entries.push({ model: modelLabel, score, organization });\n }\n if (entries.length === 0) {\n return null;\n }\n cache = { fetchedAt: Date.now(), entries };\n return entries;\n };\n}\n\n/**\n * Creates the `chatbot-arena` signal adapter: looks up the subject's model\n * on a preference leaderboard (production OpenLM HTML table by default),\n * normalizes its raw Elo-like score against the snapshot min/max, and\n * stores the `chatbotArenaEval*` fields.\n */\nexport function createChatbotArenaSignalAdapter(\n options: Hcs25ChatbotArenaSignalAdapterOptions = {},\n): Hcs25SignalAdapter {\n const source = options.source ?? createOpenLmArenaSource();\n const collect = async (\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n ): Promise<Hcs25SignalAdapterResult[]> => {\n const now = context.now.toISOString();\n const modelId = resolveModelId(subject);\n const wanted = new Set<string>();\n for (const id of [modelId, ...(options.aliases ?? [])]) {\n if (!id) {\n continue;\n }\n for (const key of arenaCandidateKeys(id)) {\n wanted.add(key);\n }\n wanted.add(id.trim().toLowerCase());\n }\n\n let entries: readonly Hcs25LeaderboardEntry[] | null = null;\n try {\n entries = await source(subject, context);\n } catch (error) {\n return [\n {\n signalId: 'chatbot-arena.eval',\n status: statusFromError(error),\n },\n ];\n }\n\n const entry =\n entries?.find(candidate => {\n if (\n wanted.has(candidate.model.trim().toLowerCase()) ||\n [...wanted].some(id => modelIdMatches(candidate.model, id))\n ) {\n return true;\n }\n const keys = buildArenaMatchKeys(\n candidate.model,\n candidate.organization,\n );\n return keys.some(key => wanted.has(key));\n }) ?? null;\n\n if (!entries || entries.length === 0 || !entry) {\n return [\n {\n signalId: 'chatbot-arena.eval',\n status: 'missing',\n fields: [\n {\n scope: 'additional',\n values: {\n chatbotArenaEvalStatus: 'missing',\n chatbotArenaEvalUpdatedAt: now,\n },\n },\n ],\n },\n ];\n }\n\n const scores = entries.map(e => e.score);\n const min = Math.min(...scores);\n const max = Math.max(...scores);\n const normalized =\n max > min ? (100 * (entry.score - min)) / (max - min) : 50;\n\n return [\n {\n signalId: 'chatbot-arena.eval',\n status: 'ok',\n value: Math.round(normalized * 100) / 100,\n fields: [\n {\n scope: 'additional',\n values: {\n chatbotArenaEvalScore: Math.round(normalized * 100) / 100,\n chatbotArenaEvalElo: entry.score,\n chatbotArenaEvalVotes: entry.votes ?? null,\n chatbotArenaEvalStatus: 'ok',\n chatbotArenaEvalUpdatedAt: now,\n chatbotArenaEvalSources: [CHATBOT_ARENA_SOURCE],\n },\n },\n ],\n provenance: {\n source: 'chatbot-arena',\n subjectId: entry.model,\n fetchedAt: now,\n },\n },\n ];\n };\n\n return {\n id: 'chatbot-arena',\n produces: ['chatbot-arena.eval'],\n timeoutMs: options.timeoutMs,\n includeRegistries: options.includeRegistries ?? DEFAULT_MODEL_REGISTRIES,\n appliesTo: options.appliesTo,\n collect,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Hugging Face model index + popularity\n// ---------------------------------------------------------------------------\n\n/**\n * Options for the `huggingface-model-index` signal adapter.\n */\nexport interface Hcs25HuggingFaceSignalAdapterOptions {\n /** Hugging Face API base. Default `https://huggingface.co/api`. */\n apiBase?: string;\n /** OpenRouter API base for `hugging_face_id` resolution. */\n openrouterApiBase?: string;\n /** Optional HF token for private/gated models. */\n token?: string;\n /** Download cap for the popularity log-scale. Default 10_000_000. */\n downloadsCap?: number;\n /** Likes cap for the popularity log-scale. Default 100_000. */\n likesCap?: number;\n /** Model-index metric cap. Default 60. */\n maxMetrics?: number;\n /**\n * Resolve a canonical HF id through the OpenRouter catalog plus a HF\n * search fallback when the subject id is not already a HF id. Default\n * true.\n */\n resolveHuggingFaceId?: boolean;\n timeoutMs?: number;\n includeRegistries?: readonly string[];\n appliesTo?: (subject: Hcs25Subject) => boolean;\n}\n\n/**\n * Creates the `huggingface-model-index` signal adapter: fetches the HF\n * model record, extracts model-index metrics when present (filtered +\n * normalized per the production rules), folds in a downloads/likes\n * popularity proxy (`model-index` 0.8 / `popularity` 0.2 in `mixed` mode),\n * resolves the canonical HF id via OpenRouter/HF search, and stores the\n * `huggingFaceEval*` fields (with `huggingFaceEvalMode` distinguishing the\n * path and `openrouterHuggingFaceId` recorded when resolved via OpenRouter).\n */\nexport function createHuggingFaceSignalAdapter(\n options: Hcs25HuggingFaceSignalAdapterOptions = {},\n): Hcs25SignalAdapter {\n const apiBase = stripTrailingSlashes(options.apiBase ?? HF_API_BASE);\n\n const collect = async (\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n ): Promise<Hcs25SignalAdapterResult[]> => {\n const now = context.now.toISOString();\n const additional = readSubjectAdditional(subject);\n const storedHfId =\n readString(additional, 'huggingFaceModelId') ??\n readString(additional, 'openrouterHuggingFaceId');\n const modelId = resolveModelId(subject);\n if (!modelId && !storedHfId) {\n return [\n {\n signalId: 'huggingface.model_index',\n status: 'missing',\n fields: [\n {\n scope: 'additional',\n values: {\n huggingFaceEvalStatus: 'missing',\n huggingFaceEvalUpdatedAt: now,\n },\n },\n ],\n },\n ];\n }\n\n try {\n const headers: Record<string, string> = options.token\n ? { authorization: `Bearer ${options.token}` }\n : {};\n let huggingFaceId = storedHfId ?? modelId!;\n let resolvedViaOpenRouter = false;\n if (!storedHfId && options.resolveHuggingFaceId !== false && modelId) {\n const resolved = await resolveHuggingFaceModelId(modelId, context, {\n huggingFaceApiBase: apiBase,\n openrouterApiBase: options.openrouterApiBase,\n token: options.token,\n }).catch((): null => null);\n if (resolved) {\n huggingFaceId = resolved;\n resolvedViaOpenRouter = true;\n }\n }\n\n const data = await requestJson<HuggingFaceModelResponse>(\n `${apiBase}/models/${encodeModelIdForPath(huggingFaceId)}`,\n {\n fetch: context.fetch,\n headers,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n },\n );\n\n const metrics = extractModelIndexMetrics(data, options.maxMetrics ?? 60);\n const modelIndexScore =\n metrics.length > 0\n ? metrics.reduce((sum, m) => sum + m.value, 0) / metrics.length\n : null;\n\n const downloads = parseNumber(data.downloads);\n const likes = parseNumber(data.likes);\n const popularityScore = computePopularityScore(\n downloads,\n likes,\n options.downloadsCap ?? 10_000_000,\n options.likesCap ?? 100_000,\n );\n\n let score: number | null = null;\n let mode: string;\n if (modelIndexScore !== null && popularityScore !== null) {\n score = modelIndexScore * 0.8 + popularityScore * 0.2;\n mode = 'mixed';\n } else if (modelIndexScore !== null) {\n score = modelIndexScore;\n mode = 'model-index';\n } else if (popularityScore !== null) {\n score = popularityScore;\n mode = 'popularity';\n } else {\n mode = 'missing';\n }\n\n const normalized =\n score === null\n ? null\n : Math.round(Math.min(100, Math.max(0, score)) * 100) / 100;\n const sources: string[] = [];\n if (modelIndexScore !== null) {\n sources.push(HUGGINGFACE_MODEL_INDEX_SOURCE);\n }\n if (popularityScore !== null) {\n sources.push(HUGGINGFACE_POPULARITY_SOURCE);\n }\n\n return [\n {\n signalId: 'huggingface.model_index',\n status: normalized === null ? 'missing' : 'ok',\n value: normalized,\n fields: [\n {\n scope: 'additional',\n values: {\n huggingFaceModelId:\n typeof data.id === 'string' && data.id.trim()\n ? data.id\n : huggingFaceId,\n huggingFaceEvalScore: normalized,\n huggingFaceSignalScore: normalized,\n huggingFaceEvalMetricsCount: metrics.length,\n huggingFaceDownloads: downloads,\n huggingFaceLikes: likes,\n huggingFaceEvalMode: mode,\n huggingFaceEvalStatus: normalized === null ? 'missing' : 'ok',\n huggingFaceEvalUpdatedAt: now,\n huggingFaceEvalSources: sources,\n ...(resolvedViaOpenRouter\n ? { openrouterHuggingFaceId: huggingFaceId }\n : {}),\n },\n },\n ],\n provenance: {\n source: 'huggingface',\n sourceUrl: `${apiBase}/models/${encodeModelIdForPath(huggingFaceId)}`,\n subjectId: huggingFaceId,\n fetchedAt: now,\n },\n },\n ];\n } catch (error) {\n const missing =\n error instanceof Hcs25CollectorHttpError && error.status === 404;\n return [\n {\n signalId: 'huggingface.model_index',\n status: missing ? 'missing' : statusFromError(error),\n fields: [\n {\n scope: 'additional',\n values: {\n huggingFaceEvalStatus: missing ? 'missing' : 'error',\n huggingFaceEvalUpdatedAt: now,\n },\n },\n ],\n },\n ];\n }\n };\n\n return {\n id: 'huggingface-model-index',\n produces: ['huggingface.model_index'],\n timeoutMs: options.timeoutMs,\n includeRegistries: options.includeRegistries ?? DEFAULT_MODEL_REGISTRIES,\n appliesTo: options.appliesTo,\n collect,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Open LLM leaderboard\n// ---------------------------------------------------------------------------\n\n/**\n * A leaderboard dataset row: a model identifier plus named metric values.\n */\nexport interface Hcs25OpenLlmRow {\n model: string;\n metrics: Record<string, number>;\n}\n\nexport type Hcs25OpenLlmSource = (\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n) => Promise<readonly Hcs25OpenLlmRow[] | null>;\n\n/**\n * Options for the `openllm-leaderboard` signal adapter.\n */\nexport interface Hcs25OpenLlmSignalAdapterOptions {\n /** Leaderboard data source. Default:\n * {@link createOpenLlmHuggingFaceSource}. */\n source?: Hcs25OpenLlmSource;\n timeoutMs?: number;\n includeRegistries?: readonly string[];\n appliesTo?: (subject: Hcs25Subject) => boolean;\n}\n\n/**\n * Creates an OpenLLM source that reads rows from a JSON endpoint returning\n * `[{model: string, <metric>: number, ...}]` (or `{rows: [...]}`). Metric\n * keys are every numeric field besides the model key.\n */\nexport function createOpenLlmJsonSource(options: {\n url: string;\n modelKey?: string;\n}): Hcs25OpenLlmSource {\n const modelKey = options.modelKey ?? 'model';\n return async (_subject, context) => {\n const data = await requestJson<unknown>(options.url, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n const record = asRecord(data);\n const rows = Array.isArray(data) ? data : record?.rows;\n if (!Array.isArray(rows)) {\n return null;\n }\n const out: Hcs25OpenLlmRow[] = [];\n for (const row of rows) {\n const rowRecord = asRecord(row);\n if (!rowRecord) {\n continue;\n }\n const model = readString(rowRecord, modelKey);\n if (!model) {\n continue;\n }\n const metrics: Record<string, number> = {};\n for (const [key, value] of Object.entries(rowRecord)) {\n const parsed = parseNumber(value);\n if (key !== modelKey && parsed !== null) {\n metrics[key] = parsed;\n }\n }\n out.push({ model, metrics });\n }\n return out;\n };\n}\n\nconst tokenizeForSimilarity = (value: string): Set<string> =>\n new Set(\n value\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter(token => token.length > 1),\n );\n\nconst jaccardSimilarity = (a: Set<string>, b: Set<string>): number => {\n if (a.size === 0 || b.size === 0) {\n return 0;\n }\n let intersection = 0;\n for (const token of a) {\n if (b.has(token)) {\n intersection += 1;\n }\n }\n return intersection / (a.size + b.size - intersection);\n};\n\n/**\n * Production Open LLM leaderboard source: resolves the subject's HF model\n * directory inside the `open-llm-leaderboard/results` HF dataset\n * (`/api/datasets/{id}/tree/{branch}/{org}/{repo}`), picks the latest\n * `results_*.json`, fetches it via `/datasets/{id}/resolve/{branch}/{path}`\n * and extracts `payload.results` metrics. When the exact `org/repo` tree\n * path is absent, falls back to a Jaccard-similarity match across the org's\n * top-level directories (production parity).\n */\nexport function createOpenLlmHuggingFaceSource(\n options: {\n huggingFaceApiBase?: string;\n huggingFaceDatasetsBase?: string;\n datasetId?: string;\n datasetBranch?: string;\n /** Path cache TTL in ms. Default 24h. */\n cacheTtlMs?: number;\n /** Minimum Jaccard similarity for org-directory fallback. Default 0.6. */\n minSimilarity?: number;\n } = {},\n): Hcs25OpenLlmSource {\n const apiBase = stripTrailingSlashes(\n options.huggingFaceApiBase ?? HF_API_BASE,\n );\n const datasetsBase = stripTrailingSlashes(\n options.huggingFaceDatasetsBase ?? HF_DATASETS_BASE,\n );\n const datasetId = options.datasetId ?? OPENLLM_DATASET_ID;\n const branch = options.datasetBranch ?? OPENLLM_DATASET_BRANCH;\n const cacheTtlMs = options.cacheTtlMs ?? 24 * 60 * 60 * 1000;\n const minSimilarity = options.minSimilarity ?? 0.6;\n const pathCache = new Map<\n string,\n { path: string | null; fetchedAt: number }\n >();\n const orgCache = new Map<string, { paths: string[]; fetchedAt: number }>();\n\n const listTree = async (\n context: Hcs25CollectContext,\n path: string,\n ): Promise<Array<{ path?: string }>> => {\n const url = `${apiBase}/datasets/${datasetId}/tree/${branch}/${encodeModelIdForPath(path)}`;\n const payload = await requestJson<Array<{ path?: string }>>(url, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n return Array.isArray(payload) ? payload : [];\n };\n\n const latestResultsPath = async (\n context: Hcs25CollectContext,\n dir: string,\n ): Promise<string | null> => {\n const candidates = (await listTree(context, dir))\n .map(entry => (typeof entry.path === 'string' ? entry.path : ''))\n .filter(path => path.includes('results_') && path.endsWith('.json'));\n return candidates.length > 0 ? (candidates.sort().at(-1) ?? null) : null;\n };\n\n const resolveViaOrg = async (\n context: Hcs25CollectContext,\n huggingFaceId: string,\n ): Promise<string | null> => {\n const slashIndex = huggingFaceId.indexOf('/');\n if (slashIndex <= 0 || slashIndex === huggingFaceId.length - 1) {\n return null;\n }\n const org = huggingFaceId.slice(0, slashIndex);\n const repo = huggingFaceId.slice(slashIndex + 1);\n if (!org || !repo) {\n return null;\n }\n const orgKey = org.toLowerCase();\n let paths: string[];\n const cached = orgCache.get(orgKey);\n if (cached && Date.now() - cached.fetchedAt < cacheTtlMs) {\n paths = cached.paths;\n } else {\n try {\n paths = (await listTree(context, org))\n .map(entry => (typeof entry.path === 'string' ? entry.path : ''))\n .filter(\n path =>\n path.startsWith(`${org}/`) &&\n !path.slice(org.length + 1).includes('/') &&\n path.slice(org.length + 1).length > 0,\n );\n } catch {\n return null;\n }\n orgCache.set(orgKey, { paths, fetchedAt: Date.now() });\n }\n if (paths.length === 0) {\n return null;\n }\n const targetTokens = tokenizeForSimilarity(repo);\n let bestPath: string | null = null;\n let bestSimilarity = 0;\n for (const path of paths) {\n const candidateRepo = path.slice(org.length + 1);\n const similarity = jaccardSimilarity(\n targetTokens,\n tokenizeForSimilarity(candidateRepo),\n );\n if (similarity > bestSimilarity) {\n bestSimilarity = similarity;\n bestPath = path;\n }\n }\n if (!bestPath || bestSimilarity < minSimilarity) {\n return null;\n }\n try {\n return await latestResultsPath(context, bestPath);\n } catch {\n return null;\n }\n };\n\n const resolveResultsPath = async (\n context: Hcs25CollectContext,\n huggingFaceId: string,\n ): Promise<string | null> => {\n const key = huggingFaceId.toLowerCase();\n const cached = pathCache.get(key);\n if (cached && Date.now() - cached.fetchedAt < cacheTtlMs) {\n return cached.path;\n }\n let path: string | null = null;\n try {\n path = await latestResultsPath(context, huggingFaceId);\n } catch {\n path = null;\n }\n if (!path) {\n path = await resolveViaOrg(context, huggingFaceId);\n }\n pathCache.set(key, { path, fetchedAt: Date.now() });\n return path;\n };\n\n return async (subject, context) => {\n const additional = readSubjectAdditional(subject);\n const huggingFaceId =\n readString(additional, 'huggingFaceModelId') ??\n readString(additional, 'openrouterHuggingFaceId') ??\n resolveModelId(subject);\n if (!huggingFaceId) {\n return null;\n }\n const resultPath = await resolveResultsPath(context, huggingFaceId);\n if (!resultPath) {\n return null;\n }\n const url = `${datasetsBase}/${datasetId}/resolve/${branch}/${resultPath}`;\n const payload = await requestJson<Record<string, unknown>>(url, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n const results = asRecord(payload)?.results;\n if (!isJsonObject(results)) {\n return null;\n }\n const metrics: Record<string, number> = {};\n for (const groupValue of Object.values(\n results as Record<string, unknown>,\n )) {\n if (!isJsonObject(groupValue as Hcs25JsonValue)) {\n continue;\n }\n for (const [name, rawValue] of Object.entries(\n groupValue as Record<string, unknown>,\n )) {\n const normalizedName = name.trim().toLowerCase();\n if (\n !normalizedName ||\n normalizedName.includes('stderr') ||\n normalizedName === 'alias'\n ) {\n continue;\n }\n const value = parseNumber(rawValue);\n if (value === null || !shouldIncludeMetric(normalizedName)) {\n continue;\n }\n // Store the raw value; the adapter applies normalizeMetricValue.\n metrics[name] = value;\n }\n }\n if (Object.keys(metrics).length === 0) {\n return null;\n }\n return [{ model: huggingFaceId, metrics }];\n };\n}\n\n/**\n * Creates the `openllm-leaderboard` signal adapter: finds the subject's\n * model on the Open LLM leaderboard dataset (production HF-datasets source\n * by default), averages its normalized metric values, and stores the\n * `openLlmEval*` fields.\n */\nexport function createOpenLlmSignalAdapter(\n options: Hcs25OpenLlmSignalAdapterOptions = {},\n): Hcs25SignalAdapter {\n const source = options.source ?? createOpenLlmHuggingFaceSource();\n const collect = async (\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n ): Promise<Hcs25SignalAdapterResult[]> => {\n const now = context.now.toISOString();\n const modelId = resolveModelId(subject);\n if (!modelId) {\n return [\n {\n signalId: 'openllm.leaderboard',\n status: 'missing',\n fields: [\n {\n scope: 'additional',\n values: {\n openLlmEvalStatus: 'missing',\n openLlmEvalUpdatedAt: now,\n },\n },\n ],\n },\n ];\n }\n\n let rows: readonly Hcs25OpenLlmRow[] | null = null;\n try {\n rows = await source(subject, context);\n } catch (error) {\n return [\n {\n signalId: 'openllm.leaderboard',\n status: statusFromError(error),\n fields: [\n {\n scope: 'additional',\n values: {\n openLlmEvalStatus: 'error',\n openLlmEvalUpdatedAt: now,\n },\n },\n ],\n },\n ];\n }\n\n const row =\n rows?.find(candidate => modelIdMatches(candidate.model, modelId)) ??\n (rows?.length === 1 ? rows[0] : null);\n\n if (!row) {\n return [\n {\n signalId: 'openllm.leaderboard',\n status: 'missing',\n fields: [\n {\n scope: 'additional',\n values: {\n openLlmEvalStatus: 'missing',\n openLlmEvalUpdatedAt: now,\n },\n },\n ],\n },\n ];\n }\n\n const values = Object.values(row.metrics)\n .map(normalizeMetricValue)\n .filter((value): value is number => value !== null);\n const score =\n values.length > 0\n ? Math.round(\n (values.reduce((sum, v) => sum + v, 0) / values.length) * 100,\n ) / 100\n : null;\n\n return [\n {\n signalId: 'openllm.leaderboard',\n status: score === null ? 'missing' : 'ok',\n value: score,\n fields: [\n {\n scope: 'additional',\n values: {\n openLlmEvalScore: score,\n openLlmEvalMetricsCount: values.length,\n openLlmEvalStatus: score === null ? 'missing' : 'ok',\n openLlmEvalUpdatedAt: now,\n openLlmEvalSources: [...OPENLLM_EVAL_SOURCES],\n },\n },\n ],\n provenance: {\n source: 'openllm-leaderboard',\n subjectId: row.model,\n fetchedAt: now,\n },\n },\n ];\n };\n\n return {\n id: 'openllm-leaderboard',\n produces: ['openllm.leaderboard'],\n timeoutMs: options.timeoutMs,\n includeRegistries: options.includeRegistries ?? DEFAULT_MODEL_REGISTRIES,\n appliesTo: options.appliesTo,\n collect,\n };\n}\n"],"names":["id","score"],"mappings":"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"}
@@ -1,5 +1,136 @@
1
- const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
1
+ import { 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 { requestJson, Hcs25CollectorHttpError } from "./standards-sdk.es122.js";
7
+ function clamp01(value) {
8
+ if (typeof value !== "number" || !Number.isFinite(value)) {
9
+ return null;
10
+ }
11
+ return Math.min(1, Math.max(0, value));
12
+ }
13
+ function defaultResolveAgentId(subject) {
14
+ const metadata = subject.metadata ?? {};
15
+ return readString(metadata, "verificationAgentId") ?? readString(metadata, "nativeId") ?? subject.id ?? null;
16
+ }
17
+ function createOutputVerificationSignalAdapter(options) {
18
+ const windowDays = options.windowDays ?? 7;
19
+ const resolveAgentId = options.resolveAgentId ?? defaultResolveAgentId;
20
+ const collect = async (subject, context) => {
21
+ const now = context.now.toISOString();
22
+ const agentId = resolveAgentId(subject);
23
+ if (!agentId || options.providers.length === 0) {
24
+ return [{ signalId: "verification.summary", status: "missing" }];
25
+ }
26
+ const perProvider = [];
27
+ let sawError = false;
28
+ for (const provider of options.providers) {
29
+ const url = `${provider.baseUrl.replace(/\/$/, "")}/v1/stats/${encodeURIComponent(agentId)}?window=${windowDays}d`;
30
+ try {
31
+ const stats = await requestJson(url, {
32
+ fetch: context.fetch,
33
+ timeoutMs: context.timeoutMs,
34
+ signal: context.signal
35
+ });
36
+ perProvider.push({ provider, stats });
37
+ } catch (error) {
38
+ if (!(error instanceof Hcs25CollectorHttpError && error.status === 404)) {
39
+ sawError = true;
40
+ }
41
+ }
42
+ }
43
+ if (perProvider.length === 0) {
44
+ return [
45
+ {
46
+ signalId: "verification.summary",
47
+ status: sawError ? "error" : "missing"
48
+ }
49
+ ];
50
+ }
51
+ let totalChecks = 0;
52
+ let allowSum = 0;
53
+ let blockSum = 0;
54
+ let uncertainSum = 0;
55
+ let confidenceSum = 0;
56
+ const stakeTotals = {};
57
+ const providersOut = [];
58
+ for (const { provider, stats } of perProvider) {
59
+ const checks = Math.max(0, Math.floor(stats.totalChecks ?? 0));
60
+ totalChecks += checks;
61
+ const weight = checks > 0 ? checks : 1;
62
+ allowSum += (stats.allowRate ?? 0) * weight;
63
+ blockSum += (stats.blockRate ?? 0) * weight;
64
+ uncertainSum += (stats.uncertainRate ?? 0) * weight;
65
+ confidenceSum += (stats.avgConfidence ?? 0) * weight;
66
+ for (const [level, levelStats] of Object.entries(
67
+ stats.stakeDistribution ?? {}
68
+ )) {
69
+ const levelChecks = Math.max(0, Math.floor(levelStats.checks ?? 0));
70
+ if (levelChecks <= 0) {
71
+ continue;
72
+ }
73
+ const bucket = stakeTotals[level] ?? (stakeTotals[level] = { checks: 0, allowRate: 0, confidence: 0 });
74
+ bucket.checks += levelChecks;
75
+ bucket.allowRate += (levelStats.allowRate ?? 0) * levelChecks;
76
+ bucket.confidence += (levelStats.avgConfidence ?? 0) * levelChecks;
77
+ }
78
+ providersOut.push({
79
+ id: provider.id,
80
+ signerAddress: provider.signerAddress ?? null,
81
+ methodologyUrl: provider.methodologyUrl ?? null,
82
+ checksContributed: checks
83
+ });
84
+ }
85
+ const divisor = perProvider.reduce(
86
+ (sum, { stats }) => sum + Math.max(0, Math.floor(stats.totalChecks ?? 0) || 1),
87
+ 0
88
+ );
89
+ const stakeDistribution = {};
90
+ for (const [level, bucket] of Object.entries(stakeTotals)) {
91
+ stakeDistribution[level] = {
92
+ checks: bucket.checks,
93
+ allowRate: bucket.allowRate / bucket.checks,
94
+ avgConfidence: bucket.confidence / bucket.checks
95
+ };
96
+ }
97
+ const summary = {
98
+ allowRate: clamp01(allowSum / divisor) ?? 0,
99
+ blockRate: clamp01(blockSum / divisor) ?? 0,
100
+ uncertainRate: clamp01(uncertainSum / divisor),
101
+ avgConfidence: clamp01(confidenceSum / divisor) ?? 0,
102
+ totalChecks,
103
+ stakeDistribution: Object.keys(stakeDistribution).length > 0 ? stakeDistribution : null,
104
+ windowDays,
105
+ providers: providersOut,
106
+ updatedAt: now
107
+ };
108
+ return [
109
+ {
110
+ signalId: "verification.summary",
111
+ status: "ok",
112
+ value: summary.allowRate,
113
+ fields: [{ scope: "outputVerificationSummary", values: summary }],
114
+ provenance: {
115
+ source: "output-verification",
116
+ subjectId: agentId,
117
+ fetchedAt: now,
118
+ params: { windowDays, providers: options.providers.map((p) => p.id) }
119
+ }
120
+ }
121
+ ];
122
+ };
123
+ return {
124
+ id: "output-verification",
125
+ produces: ["verification.summary"],
126
+ timeoutMs: options.timeoutMs,
127
+ includeRegistries: options.includeRegistries,
128
+ excludeRegistries: options.excludeRegistries,
129
+ appliesTo: options.appliesTo,
130
+ collect
131
+ };
132
+ }
2
133
  export {
3
- sleep
134
+ createOutputVerificationSignalAdapter
4
135
  };
5
136
  //# sourceMappingURL=standards-sdk.es138.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es138.js","sources":["../../src/utils/sleep.ts"],"sourcesContent":["export const sleep = (ms: number) =>\n new Promise(resolve => setTimeout(resolve, ms));\n"],"names":[],"mappings":"AAAO,MAAM,QAAQ,CAAC,OACpB,IAAI,QAAQ,CAAA,YAAW,WAAW,SAAS,EAAE,CAAC;"}
1
+ {"version":3,"file":"standards-sdk.es138.js","sources":["../../src/hcs-25/collectors/output-verification.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} from './types';\n\n/**\n * A verification provider exposing the spec reference stats endpoint\n * `GET {baseUrl}/v1/stats/{agentId}?window={n}d`.\n */\nexport interface Hcs25VerificationProvider {\n id: string;\n baseUrl: string;\n /** On-chain signer address for attestation provenance, when available. */\n signerAddress?: string;\n /** URL to the provider's verification methodology documentation. */\n methodologyUrl?: string;\n}\n\ninterface StakeLevelStats {\n checks?: number;\n allowRate?: number;\n avgConfidence?: number;\n}\n\ninterface ProviderStatsResponse {\n allowRate?: number;\n blockRate?: number;\n uncertainRate?: number;\n avgConfidence?: number;\n totalChecks?: number;\n stakeDistribution?: Record<string, StakeLevelStats>;\n windowDays?: number;\n updatedAt?: string;\n}\n\n/**\n * Options for the output-verification signal adapter.\n */\nexport interface Hcs25OutputVerificationSignalAdapterOptions {\n /** Verification providers to query; responses are check-weight merged. */\n providers: readonly Hcs25VerificationProvider[];\n /** Lookback window in days for the stats query. Default 7. */\n windowDays?: number;\n /** Resolves the provider-side agent id; defaults to `subject.id`. */\n resolveAgentId?: (subject: Hcs25Subject) => string | null;\n timeoutMs?: number;\n includeRegistries?: readonly string[];\n excludeRegistries?: readonly string[];\n appliesTo?: (subject: Hcs25Subject) => boolean;\n}\n\nfunction clamp01(value: number | undefined): number | null {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n return null;\n }\n return Math.min(1, Math.max(0, value));\n}\n\nfunction defaultResolveAgentId(subject: Hcs25Subject): string | null {\n const metadata = subject.metadata ?? {};\n return (\n readString(metadata, 'verificationAgentId') ??\n readString(metadata, 'nativeId') ??\n subject.id ??\n null\n );\n}\n\n/**\n * Creates the `output-verification` signal adapter: queries each configured\n * provider's `{baseUrl}/v1/stats/{agentId}?window={n}d` endpoint, merges the\n * responses weighted by check counts, and stores\n * `metadata.outputVerificationSummary` per the signal catalog.\n */\nexport function createOutputVerificationSignalAdapter(\n options: Hcs25OutputVerificationSignalAdapterOptions,\n): Hcs25SignalAdapter {\n const windowDays = options.windowDays ?? 7;\n const resolveAgentId = options.resolveAgentId ?? defaultResolveAgentId;\n\n const collect = async (\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n ): Promise<Hcs25SignalAdapterResult[]> => {\n const now = context.now.toISOString();\n const agentId = resolveAgentId(subject);\n if (!agentId || options.providers.length === 0) {\n return [{ signalId: 'verification.summary', status: 'missing' }];\n }\n\n const perProvider: Array<{\n provider: Hcs25VerificationProvider;\n stats: ProviderStatsResponse;\n }> = [];\n let sawError = false;\n\n for (const provider of options.providers) {\n const url = `${provider.baseUrl.replace(/\\/$/, '')}/v1/stats/${encodeURIComponent(agentId)}?window=${windowDays}d`;\n try {\n const stats = await requestJson<ProviderStatsResponse>(url, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n perProvider.push({ provider, stats });\n } catch (error) {\n if (\n !(error instanceof Hcs25CollectorHttpError && error.status === 404)\n ) {\n sawError = true;\n }\n }\n }\n\n if (perProvider.length === 0) {\n return [\n {\n signalId: 'verification.summary',\n status: sawError ? 'error' : 'missing',\n },\n ];\n }\n\n let totalChecks = 0;\n let allowSum = 0;\n let blockSum = 0;\n let uncertainSum = 0;\n let confidenceSum = 0;\n const stakeTotals: Record<\n string,\n { checks: number; allowRate: number; confidence: number }\n > = {};\n const providersOut: Record<string, Hcs25JsonValue>[] = [];\n\n for (const { provider, stats } of perProvider) {\n const checks = Math.max(0, Math.floor(stats.totalChecks ?? 0));\n totalChecks += checks;\n const weight = checks > 0 ? checks : 1;\n allowSum += (stats.allowRate ?? 0) * weight;\n blockSum += (stats.blockRate ?? 0) * weight;\n uncertainSum += (stats.uncertainRate ?? 0) * weight;\n confidenceSum += (stats.avgConfidence ?? 0) * weight;\n\n for (const [level, levelStats] of Object.entries(\n stats.stakeDistribution ?? {},\n )) {\n const levelChecks = Math.max(0, Math.floor(levelStats.checks ?? 0));\n if (levelChecks <= 0) {\n continue;\n }\n const bucket =\n stakeTotals[level] ??\n (stakeTotals[level] = { checks: 0, allowRate: 0, confidence: 0 });\n bucket.checks += levelChecks;\n bucket.allowRate += (levelStats.allowRate ?? 0) * levelChecks;\n bucket.confidence += (levelStats.avgConfidence ?? 0) * levelChecks;\n }\n\n providersOut.push({\n id: provider.id,\n signerAddress: provider.signerAddress ?? null,\n methodologyUrl: provider.methodologyUrl ?? null,\n checksContributed: checks,\n });\n }\n\n const divisor = perProvider.reduce(\n (sum, { stats }) =>\n sum + Math.max(0, Math.floor(stats.totalChecks ?? 0) || 1),\n 0,\n );\n\n const stakeDistribution: Record<string, Hcs25JsonValue> = {};\n for (const [level, bucket] of Object.entries(stakeTotals)) {\n stakeDistribution[level] = {\n checks: bucket.checks,\n allowRate: bucket.allowRate / bucket.checks,\n avgConfidence: bucket.confidence / bucket.checks,\n };\n }\n\n const summary: Record<string, Hcs25JsonValue> = {\n allowRate: clamp01(allowSum / divisor) ?? 0,\n blockRate: clamp01(blockSum / divisor) ?? 0,\n uncertainRate: clamp01(uncertainSum / divisor),\n avgConfidence: clamp01(confidenceSum / divisor) ?? 0,\n totalChecks,\n stakeDistribution:\n Object.keys(stakeDistribution).length > 0 ? stakeDistribution : null,\n windowDays,\n providers: providersOut,\n updatedAt: now,\n };\n\n return [\n {\n signalId: 'verification.summary',\n status: 'ok',\n value: summary.allowRate,\n fields: [{ scope: 'outputVerificationSummary', values: summary }],\n provenance: {\n source: 'output-verification',\n subjectId: agentId,\n fetchedAt: now,\n params: { windowDays, providers: options.providers.map(p => p.id) },\n },\n },\n ];\n };\n\n return {\n id: 'output-verification',\n produces: ['verification.summary'],\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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"}