@hashgraphonline/standards-sdk 0.1.190 → 0.1.191
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/hcs-25/adapters/ans-trust-discovery.d.ts +22 -0
- package/dist/browser/hcs-25/adapters/ans-trust-discovery.d.ts.map +1 -0
- package/dist/browser/hcs-25/adapters/index.d.ts +1 -0
- package/dist/browser/hcs-25/adapters/index.d.ts.map +1 -1
- package/dist/browser/hcs-25/collectors/ans-trust-discovery.d.ts +32 -0
- package/dist/browser/hcs-25/collectors/ans-trust-discovery.d.ts.map +1 -0
- package/dist/browser/hcs-25/collectors/catalog.d.ts +9 -2
- package/dist/browser/hcs-25/collectors/catalog.d.ts.map +1 -1
- package/dist/browser/hcs-25/collectors/index.d.ts +1 -0
- package/dist/browser/hcs-25/collectors/index.d.ts.map +1 -1
- package/dist/browser/hcs-25/signals/ans-trust-discovery.d.ts +50 -0
- package/dist/browser/hcs-25/signals/ans-trust-discovery.d.ts.map +1 -0
- package/dist/browser/hcs-25/signals/index.d.ts +1 -0
- package/dist/browser/hcs-25/signals/index.d.ts.map +1 -1
- package/dist/browser-root/hcs-25/adapters/ans-trust-discovery.d.ts +22 -0
- package/dist/browser-root/hcs-25/adapters/ans-trust-discovery.d.ts.map +1 -0
- package/dist/browser-root/hcs-25/adapters/index.d.ts +1 -0
- package/dist/browser-root/hcs-25/adapters/index.d.ts.map +1 -1
- package/dist/browser-root/hcs-25/collectors/ans-trust-discovery.d.ts +32 -0
- package/dist/browser-root/hcs-25/collectors/ans-trust-discovery.d.ts.map +1 -0
- package/dist/browser-root/hcs-25/collectors/catalog.d.ts +9 -2
- package/dist/browser-root/hcs-25/collectors/catalog.d.ts.map +1 -1
- package/dist/browser-root/hcs-25/collectors/index.d.ts +1 -0
- package/dist/browser-root/hcs-25/collectors/index.d.ts.map +1 -1
- package/dist/browser-root/hcs-25/signals/ans-trust-discovery.d.ts +50 -0
- package/dist/browser-root/hcs-25/signals/ans-trust-discovery.d.ts.map +1 -0
- package/dist/browser-root/hcs-25/signals/index.d.ts +1 -0
- package/dist/browser-root/hcs-25/signals/index.d.ts.map +1 -1
- package/dist/cjs/hcs-25/adapters/ans-trust-discovery.d.ts +22 -0
- package/dist/cjs/hcs-25/adapters/ans-trust-discovery.d.ts.map +1 -0
- package/dist/cjs/hcs-25/adapters/index.d.ts +1 -0
- package/dist/cjs/hcs-25/adapters/index.d.ts.map +1 -1
- package/dist/cjs/hcs-25/collectors/ans-trust-discovery.d.ts +32 -0
- package/dist/cjs/hcs-25/collectors/ans-trust-discovery.d.ts.map +1 -0
- package/dist/cjs/hcs-25/collectors/catalog.d.ts +9 -2
- package/dist/cjs/hcs-25/collectors/catalog.d.ts.map +1 -1
- package/dist/cjs/hcs-25/collectors/index.d.ts +1 -0
- package/dist/cjs/hcs-25/collectors/index.d.ts.map +1 -1
- package/dist/cjs/hcs-25/signals/ans-trust-discovery.d.ts +50 -0
- package/dist/cjs/hcs-25/signals/ans-trust-discovery.d.ts.map +1 -0
- package/dist/cjs/hcs-25/signals/index.d.ts +1 -0
- package/dist/cjs/hcs-25/signals/index.d.ts.map +1 -1
- package/dist/cjs/standards-sdk.cjs +1 -1
- package/dist/cjs/standards-sdk.cjs.map +1 -1
- package/dist/es/hcs-25/adapters/ans-trust-discovery.d.ts +22 -0
- package/dist/es/hcs-25/adapters/ans-trust-discovery.d.ts.map +1 -0
- package/dist/es/hcs-25/adapters/index.d.ts +1 -0
- package/dist/es/hcs-25/adapters/index.d.ts.map +1 -1
- package/dist/es/hcs-25/collectors/ans-trust-discovery.d.ts +32 -0
- package/dist/es/hcs-25/collectors/ans-trust-discovery.d.ts.map +1 -0
- package/dist/es/hcs-25/collectors/catalog.d.ts +9 -2
- package/dist/es/hcs-25/collectors/catalog.d.ts.map +1 -1
- package/dist/es/hcs-25/collectors/index.d.ts +1 -0
- package/dist/es/hcs-25/collectors/index.d.ts.map +1 -1
- package/dist/es/hcs-25/signals/ans-trust-discovery.d.ts +50 -0
- package/dist/es/hcs-25/signals/ans-trust-discovery.d.ts.map +1 -0
- package/dist/es/hcs-25/signals/index.d.ts +1 -0
- package/dist/es/hcs-25/signals/index.d.ts.map +1 -1
- package/dist/es/standards-sdk.es.js +78 -71
- package/dist/es/standards-sdk.es.js.map +1 -1
- package/dist/es/standards-sdk.es101.js +2 -2
- package/dist/es/standards-sdk.es103.js +2 -2
- package/dist/es/standards-sdk.es104.js +1 -1
- package/dist/es/standards-sdk.es106.js +1 -1
- package/dist/es/standards-sdk.es108.js +2 -2
- package/dist/es/standards-sdk.es11.js +1 -1
- package/dist/es/standards-sdk.es110.js +1 -1
- package/dist/es/standards-sdk.es111.js +2 -2
- package/dist/es/standards-sdk.es115.js +3 -3
- package/dist/es/standards-sdk.es116.js +4 -4
- package/dist/es/standards-sdk.es12.js +1 -1
- package/dist/es/standards-sdk.es120.js +22 -4
- package/dist/es/standards-sdk.es120.js.map +1 -1
- package/dist/es/standards-sdk.es121.js +15 -12
- package/dist/es/standards-sdk.es121.js.map +1 -1
- package/dist/es/standards-sdk.es123.js +6 -5
- package/dist/es/standards-sdk.es123.js.map +1 -1
- package/dist/es/standards-sdk.es124.js +6 -5
- package/dist/es/standards-sdk.es124.js.map +1 -1
- package/dist/es/standards-sdk.es127.js +6 -5
- package/dist/es/standards-sdk.es127.js.map +1 -1
- package/dist/es/standards-sdk.es128.js +110 -136
- package/dist/es/standards-sdk.es128.js.map +1 -1
- package/dist/es/standards-sdk.es129.js +133 -141
- package/dist/es/standards-sdk.es129.js.map +1 -1
- package/dist/es/standards-sdk.es13.js +1 -1
- package/dist/es/standards-sdk.es130.js +135 -345
- package/dist/es/standards-sdk.es130.js.map +1 -1
- package/dist/es/standards-sdk.es131.js +332 -344
- package/dist/es/standards-sdk.es131.js.map +1 -1
- package/dist/es/standards-sdk.es132.js +338 -178
- package/dist/es/standards-sdk.es132.js.map +1 -1
- package/dist/es/standards-sdk.es133.js +200 -196
- package/dist/es/standards-sdk.es133.js.map +1 -1
- package/dist/es/standards-sdk.es134.js +216 -364
- package/dist/es/standards-sdk.es134.js.map +1 -1
- package/dist/es/standards-sdk.es135.js +358 -100
- package/dist/es/standards-sdk.es135.js.map +1 -1
- package/dist/es/standards-sdk.es136.js +91 -220
- package/dist/es/standards-sdk.es136.js.map +1 -1
- package/dist/es/standards-sdk.es137.js +173 -1250
- package/dist/es/standards-sdk.es137.js.map +1 -1
- package/dist/es/standards-sdk.es138.js +1295 -98
- package/dist/es/standards-sdk.es138.js.map +1 -1
- package/dist/es/standards-sdk.es139.js +109 -246
- package/dist/es/standards-sdk.es139.js.map +1 -1
- package/dist/es/standards-sdk.es14.js +1 -1
- package/dist/es/standards-sdk.es140.js +263 -97
- package/dist/es/standards-sdk.es140.js.map +1 -1
- package/dist/es/standards-sdk.es141.js +107 -248
- package/dist/es/standards-sdk.es141.js.map +1 -1
- package/dist/es/standards-sdk.es142.js +246 -472
- package/dist/es/standards-sdk.es142.js.map +1 -1
- package/dist/es/standards-sdk.es143.js +458 -85
- package/dist/es/standards-sdk.es143.js.map +1 -1
- package/dist/es/standards-sdk.es144.js +96 -151
- package/dist/es/standards-sdk.es144.js.map +1 -1
- package/dist/es/standards-sdk.es145.js +155 -29
- package/dist/es/standards-sdk.es145.js.map +1 -1
- package/dist/es/standards-sdk.es146.js +26 -4
- package/dist/es/standards-sdk.es146.js.map +1 -1
- package/dist/es/standards-sdk.es147.js +10 -180
- package/dist/es/standards-sdk.es147.js.map +1 -1
- package/dist/es/standards-sdk.es148.js +179 -26
- package/dist/es/standards-sdk.es148.js.map +1 -1
- package/dist/es/standards-sdk.es149.js +27 -20
- package/dist/es/standards-sdk.es149.js.map +1 -1
- package/dist/es/standards-sdk.es15.js +1 -1
- package/dist/es/standards-sdk.es150.js +18 -156
- package/dist/es/standards-sdk.es150.js.map +1 -1
- package/dist/es/standards-sdk.es151.js +148 -190
- package/dist/es/standards-sdk.es151.js.map +1 -1
- package/dist/es/standards-sdk.es152.js +159 -747
- package/dist/es/standards-sdk.es152.js.map +1 -1
- package/dist/es/standards-sdk.es153.js +786 -9
- package/dist/es/standards-sdk.es153.js.map +1 -1
- package/dist/es/standards-sdk.es154.js +13 -567
- package/dist/es/standards-sdk.es154.js.map +1 -1
- package/dist/es/standards-sdk.es155.js +541 -600
- package/dist/es/standards-sdk.es155.js.map +1 -1
- package/dist/es/standards-sdk.es156.js +625 -12
- package/dist/es/standards-sdk.es156.js.map +1 -1
- package/dist/es/standards-sdk.es157.js +13 -2
- package/dist/es/standards-sdk.es157.js.map +1 -1
- package/dist/es/standards-sdk.es158.js +2 -87
- package/dist/es/standards-sdk.es158.js.map +1 -1
- package/dist/es/standards-sdk.es159.js +84 -37
- package/dist/es/standards-sdk.es159.js.map +1 -1
- package/dist/es/standards-sdk.es16.js +6 -6
- package/dist/es/standards-sdk.es160.js +40 -2
- package/dist/es/standards-sdk.es160.js.map +1 -1
- package/dist/es/standards-sdk.es161.js +2 -235
- package/dist/es/standards-sdk.es161.js.map +1 -1
- package/dist/es/standards-sdk.es162.js +204 -1109
- package/dist/es/standards-sdk.es162.js.map +1 -1
- package/dist/es/standards-sdk.es163.js +1059 -225
- package/dist/es/standards-sdk.es163.js.map +1 -1
- package/dist/es/standards-sdk.es164.js +303 -419
- package/dist/es/standards-sdk.es164.js.map +1 -1
- package/dist/es/standards-sdk.es165.js +418 -351
- package/dist/es/standards-sdk.es165.js.map +1 -1
- package/dist/es/standards-sdk.es166.js +347 -1114
- package/dist/es/standards-sdk.es166.js.map +1 -1
- package/dist/es/standards-sdk.es167.js +1094 -180
- package/dist/es/standards-sdk.es167.js.map +1 -1
- package/dist/es/standards-sdk.es168.js +153 -1512
- package/dist/es/standards-sdk.es168.js.map +1 -1
- package/dist/es/standards-sdk.es169.js +1457 -1056
- package/dist/es/standards-sdk.es169.js.map +1 -1
- package/dist/es/standards-sdk.es170.js +1163 -14
- package/dist/es/standards-sdk.es170.js.map +1 -1
- package/dist/es/standards-sdk.es171.js +15 -449
- package/dist/es/standards-sdk.es171.js.map +1 -1
- package/dist/es/standards-sdk.es172.js +440 -248
- package/dist/es/standards-sdk.es172.js.map +1 -1
- package/dist/es/standards-sdk.es173.js +259 -4
- package/dist/es/standards-sdk.es173.js.map +1 -1
- package/dist/es/standards-sdk.es174.js +4 -81
- package/dist/es/standards-sdk.es174.js.map +1 -1
- package/dist/es/standards-sdk.es175.js +71 -77
- package/dist/es/standards-sdk.es175.js.map +1 -1
- package/dist/es/standards-sdk.es176.js +80 -53
- package/dist/es/standards-sdk.es176.js.map +1 -1
- package/dist/es/standards-sdk.es177.js +59 -2546
- package/dist/es/standards-sdk.es177.js.map +1 -1
- package/dist/es/standards-sdk.es178.js +2547 -159
- package/dist/es/standards-sdk.es178.js.map +1 -1
- package/dist/es/standards-sdk.es179.js +159 -7
- package/dist/es/standards-sdk.es179.js.map +1 -1
- package/dist/es/standards-sdk.es18.js +13 -13
- package/dist/es/standards-sdk.es180.js +7 -86
- package/dist/es/standards-sdk.es180.js.map +1 -1
- package/dist/es/standards-sdk.es181.js +65 -44
- package/dist/es/standards-sdk.es181.js.map +1 -1
- package/dist/es/standards-sdk.es182.js +57 -188
- package/dist/es/standards-sdk.es182.js.map +1 -1
- package/dist/es/standards-sdk.es183.js +27 -26
- package/dist/es/standards-sdk.es183.js.map +1 -1
- package/dist/es/standards-sdk.es184.js +191 -53
- package/dist/es/standards-sdk.es184.js.map +1 -1
- package/dist/es/standards-sdk.es185.js +21 -109
- package/dist/es/standards-sdk.es185.js.map +1 -1
- package/dist/es/standards-sdk.es186.js +49 -47
- package/dist/es/standards-sdk.es186.js.map +1 -1
- package/dist/es/standards-sdk.es187.js +89 -205
- package/dist/es/standards-sdk.es187.js.map +1 -1
- package/dist/es/standards-sdk.es188.js +35 -58
- package/dist/es/standards-sdk.es188.js.map +1 -1
- package/dist/es/standards-sdk.es189.js +48 -39
- package/dist/es/standards-sdk.es189.js.map +1 -1
- package/dist/es/standards-sdk.es19.js +10 -10
- package/dist/es/standards-sdk.es190.js +218 -48
- package/dist/es/standards-sdk.es190.js.map +1 -1
- package/dist/es/standards-sdk.es191.js +66 -42
- package/dist/es/standards-sdk.es191.js.map +1 -1
- package/dist/es/standards-sdk.es192.js +33 -105
- package/dist/es/standards-sdk.es192.js.map +1 -1
- package/dist/es/standards-sdk.es193.js +49 -43
- package/dist/es/standards-sdk.es193.js.map +1 -1
- package/dist/es/standards-sdk.es194.js +33 -42
- package/dist/es/standards-sdk.es194.js.map +1 -1
- package/dist/es/standards-sdk.es195.js +123 -72
- package/dist/es/standards-sdk.es195.js.map +1 -1
- package/dist/es/standards-sdk.es196.js +58 -75
- package/dist/es/standards-sdk.es196.js.map +1 -1
- package/dist/es/standards-sdk.es197.js +60 -44
- package/dist/es/standards-sdk.es197.js.map +1 -1
- package/dist/es/standards-sdk.es198.js +72 -36
- package/dist/es/standards-sdk.es198.js.map +1 -1
- package/dist/es/standards-sdk.es199.js +75 -30
- package/dist/es/standards-sdk.es199.js.map +1 -1
- package/dist/es/standards-sdk.es2.js +2 -2
- package/dist/es/standards-sdk.es20.js +1 -1
- package/dist/es/standards-sdk.es200.js +44 -34
- package/dist/es/standards-sdk.es200.js.map +1 -1
- package/dist/es/standards-sdk.es201.js +36 -48
- package/dist/es/standards-sdk.es201.js.map +1 -1
- package/dist/es/standards-sdk.es202.js +30 -138
- package/dist/es/standards-sdk.es202.js.map +1 -1
- package/dist/es/standards-sdk.es203.js +34 -42
- package/dist/es/standards-sdk.es203.js.map +1 -1
- package/dist/es/standards-sdk.es204.js +48 -12482
- package/dist/es/standards-sdk.es204.js.map +1 -1
- package/dist/es/standards-sdk.es205.js +134 -13
- package/dist/es/standards-sdk.es205.js.map +1 -1
- package/dist/es/standards-sdk.es206.js +36 -50
- package/dist/es/standards-sdk.es206.js.map +1 -1
- package/dist/es/standards-sdk.es207.js +12449 -78
- package/dist/es/standards-sdk.es207.js.map +1 -1
- package/dist/es/standards-sdk.es208.js +15 -79
- package/dist/es/standards-sdk.es208.js.map +1 -1
- package/dist/es/standards-sdk.es209.js +48 -192
- package/dist/es/standards-sdk.es209.js.map +1 -1
- package/dist/es/standards-sdk.es21.js +1 -1
- package/dist/es/standards-sdk.es210.js +90 -651
- package/dist/es/standards-sdk.es210.js.map +1 -1
- package/dist/es/standards-sdk.es211.js +71 -63
- package/dist/es/standards-sdk.es211.js.map +1 -1
- package/dist/es/standards-sdk.es212.js +188 -160
- package/dist/es/standards-sdk.es212.js.map +1 -1
- package/dist/es/standards-sdk.es213.js +65 -314
- package/dist/es/standards-sdk.es213.js.map +1 -1
- package/dist/es/standards-sdk.es214.js +661 -335
- package/dist/es/standards-sdk.es214.js.map +1 -1
- package/dist/es/standards-sdk.es215.js +129 -410
- package/dist/es/standards-sdk.es215.js.map +1 -1
- package/dist/es/standards-sdk.es216.js +200 -209
- package/dist/es/standards-sdk.es216.js.map +1 -1
- package/dist/es/standards-sdk.es217.js +334 -64
- package/dist/es/standards-sdk.es217.js.map +1 -1
- package/dist/es/standards-sdk.es218.js +438 -124
- package/dist/es/standards-sdk.es218.js.map +1 -1
- package/dist/es/standards-sdk.es219.js +310 -496
- package/dist/es/standards-sdk.es219.js.map +1 -1
- package/dist/es/standards-sdk.es22.js +1 -1
- package/dist/es/standards-sdk.es220.js +60 -243
- package/dist/es/standards-sdk.es220.js.map +1 -1
- package/dist/es/standards-sdk.es221.js +118 -175
- package/dist/es/standards-sdk.es221.js.map +1 -1
- package/dist/es/standards-sdk.es222.js +465 -67
- package/dist/es/standards-sdk.es222.js.map +1 -1
- package/dist/es/standards-sdk.es223.js +250 -143
- package/dist/es/standards-sdk.es223.js.map +1 -1
- package/dist/es/standards-sdk.es224.js +172 -160
- package/dist/es/standards-sdk.es224.js.map +1 -1
- package/dist/es/standards-sdk.es225.js +65 -630
- package/dist/es/standards-sdk.es225.js.map +1 -1
- package/dist/es/standards-sdk.es226.js +128 -161
- package/dist/es/standards-sdk.es226.js.map +1 -1
- package/dist/es/standards-sdk.es227.js +144 -195
- package/dist/es/standards-sdk.es227.js.map +1 -1
- package/dist/es/standards-sdk.es228.js +668 -223
- package/dist/es/standards-sdk.es228.js.map +1 -1
- package/dist/es/standards-sdk.es229.js +188 -0
- package/dist/es/standards-sdk.es229.js.map +1 -0
- package/dist/es/standards-sdk.es23.js +1 -1
- package/dist/es/standards-sdk.es230.js +238 -0
- package/dist/es/standards-sdk.es230.js.map +1 -0
- package/dist/es/standards-sdk.es231.js +242 -0
- package/dist/es/standards-sdk.es231.js.map +1 -0
- package/dist/es/standards-sdk.es24.js +1 -1
- package/dist/es/standards-sdk.es25.js +1 -1
- package/dist/es/standards-sdk.es26.js +1 -1
- package/dist/es/standards-sdk.es27.js +13 -13
- package/dist/es/standards-sdk.es30.js +2 -2
- package/dist/es/standards-sdk.es31.js +4 -4
- package/dist/es/standards-sdk.es32.js +1 -1
- package/dist/es/standards-sdk.es35.js +7 -7
- package/dist/es/standards-sdk.es36.js +4 -4
- package/dist/es/standards-sdk.es37.js +2 -2
- package/dist/es/standards-sdk.es38.js +2 -2
- package/dist/es/standards-sdk.es39.js +1 -1
- package/dist/es/standards-sdk.es4.js +2 -2
- package/dist/es/standards-sdk.es40.js +1 -1
- package/dist/es/standards-sdk.es41.js +2 -2
- package/dist/es/standards-sdk.es46.js +1 -1
- package/dist/es/standards-sdk.es5.js +2 -2
- package/dist/es/standards-sdk.es51.js +1 -1
- package/dist/es/standards-sdk.es53.js +1 -1
- package/dist/es/standards-sdk.es56.js +2 -2
- package/dist/es/standards-sdk.es59.js +1 -1
- package/dist/es/standards-sdk.es6.js +2 -2
- package/dist/es/standards-sdk.es60.js +1 -1
- package/dist/es/standards-sdk.es62.js +1 -1
- package/dist/es/standards-sdk.es63.js +2 -2
- package/dist/es/standards-sdk.es64.js +1 -1
- package/dist/es/standards-sdk.es65.js +1 -1
- package/dist/es/standards-sdk.es66.js +1 -1
- package/dist/es/standards-sdk.es67.js +8 -8
- package/dist/es/standards-sdk.es69.js +1 -1
- package/dist/es/standards-sdk.es7.js +1 -1
- package/dist/es/standards-sdk.es71.js +2 -2
- package/dist/es/standards-sdk.es72.js +3 -3
- package/dist/es/standards-sdk.es75.js +5 -5
- package/dist/es/standards-sdk.es76.js +3 -3
- package/dist/es/standards-sdk.es77.js +2 -2
- package/dist/es/standards-sdk.es78.js +1 -1
- package/dist/es/standards-sdk.es81.js +2 -2
- package/dist/es/standards-sdk.es83.js +2 -2
- package/dist/es/standards-sdk.es84.js +5 -5
- package/dist/es/standards-sdk.es85.js +1 -1
- package/dist/es/standards-sdk.es88.js +1 -1
- package/dist/es/standards-sdk.es89.js +2 -2
- package/dist/es/standards-sdk.es9.js +2 -2
- package/dist/es/standards-sdk.es90.js +4 -4
- package/dist/es/standards-sdk.es94.js +3 -3
- package/dist/es/standards-sdk.es96.js +2 -2
- package/dist/es/standards-sdk.es98.js +1 -1
- package/dist/es/standards-sdk.es99.js +3 -3
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es131.js","sources":["../../src/hcs-25/collectors/oss-popularity.ts"],"sourcesContent":["import type { Hcs25JsonValue, Hcs25Subject } from '../types';\nimport { isJsonObject, readString, readSubjectAdditional } from '../signals';\nimport { resolveSubjectEndpoint } from './endpoints';\nimport {\n Hcs25CollectorHttpError,\n isTimeoutError,\n requestJson,\n requestText,\n} from './http';\nimport type {\n Hcs25CollectContext,\n Hcs25SignalAdapter,\n Hcs25SignalAdapterResult,\n Hcs25SignalStatus,\n} from './types';\n\nconst GITHUB_API_BASE = 'https://api.github.com';\nconst NPM_API_BASE = 'https://api.npmjs.org';\nconst NPM_REGISTRY_BASE = 'https://registry.npmjs.org';\nconst PYPISTATS_API_BASE = 'https://pypistats.org/api';\nconst PYPI_API_BASE = 'https://pypi.org/pypi';\nconst RAW_GITHUB_BASE = 'https://raw.githubusercontent.com';\n\nconst GITHUB_REPO_PATTERN =\n /github\\.com[:/]+([A-Za-z0-9_.-]+)\\/([A-Za-z0-9_.-]+)/;\n\n/**\n * Options for the OSS popularity signal adapter.\n */\nexport interface Hcs25OssPopularitySignalAdapterOptions {\n /** GitHub API base URL. Default `https://api.github.com`. */\n githubApiBase?: string;\n /** Optional GitHub token for higher rate limits. */\n githubToken?: string;\n /** npm downloads API base. Default `https://api.npmjs.org`. */\n npmApiBase?: string;\n /** pypistats API base. Default `https://pypistats.org/api`. */\n pypiApiBase?: string;\n /**\n * When no GitHub repo is declared, infer one from the package's\n * registry metadata (npm `repository.url`, PyPI `project_urls` /\n * `home_page`). Default true.\n */\n inferRepository?: boolean;\n /**\n * When no package identity is declared, infer one from the repo's\n * `package.json` / `pyproject.toml` / `setup.cfg` on `main`/`master`.\n * Default true.\n */\n inferPackageIdentity?: boolean;\n /**\n * When the GitHub API lookup fails or returns no star count, scrape the\n * repo page's star counter as a fallback. Default true.\n */\n githubHtmlFallback?: boolean;\n /** Per-adapter timeout in milliseconds. */\n timeoutMs?: number;\n includeRegistries?: readonly string[];\n excludeRegistries?: readonly string[];\n appliesTo?: (subject: Hcs25Subject) => boolean;\n}\n\n/**\n * Extracts an `owner/repo` pair from a free-form value (URL, git SSH form,\n * or an already-normalized `owner/repo` slug).\n */\nexport function parseGithubRepo(value: string | null): string | null {\n if (!value) {\n return null;\n }\n const direct = value.match(/^([A-Za-z0-9_.-]+)\\/([A-Za-z0-9_.-]+)$/);\n if (direct) {\n return `${direct[1]}/${direct[2]}`;\n }\n const match = value.match(GITHUB_REPO_PATTERN);\n if (!match) {\n return null;\n }\n return `${match[1]}/${match[2].replace(/\\.git$/, '')}`;\n}\n\nfunction resolveGithubRepo(subject: Hcs25Subject): string | null {\n const additional = readSubjectAdditional(subject);\n const metadata = subject.metadata ?? {};\n const mcp = isJsonObject(metadata.mcp) ? metadata.mcp : undefined;\n\n for (const value of [\n readString(additional, 'githubRepo'),\n readString(additional, 'repository'),\n readString(metadata, 'repository'),\n readString(mcp, 'repository'),\n readString(metadata, 'repoUrl'),\n readString(additional, 'repoUrl'),\n readString(metadata, 'homepage'),\n readString(additional, 'homepage'),\n resolveSubjectEndpoint(subject),\n ]) {\n const repo = parseGithubRepo(value);\n if (repo) {\n return repo;\n }\n }\n return null;\n}\n\nfunction resolvePackage(\n subject: Hcs25Subject,\n): { registry: 'npm' | 'pypi'; name: string } | null {\n const additional = readSubjectAdditional(subject);\n const registry = readString(additional, 'packageRegistry');\n const name = readString(additional, 'packageName');\n if (name && (registry === 'npm' || registry === 'pypi')) {\n return { registry, name };\n }\n if (name) {\n return { registry: 'npm', name };\n }\n return null;\n}\n\ninterface GithubRepoResponse {\n stargazers_count?: number;\n}\n\ninterface NpmDownloadsResponse {\n downloads?: number;\n}\n\ninterface PyPiRecentResponse {\n data?: { last_month?: number };\n}\n\nfunction statusFromError(error: unknown): Hcs25SignalStatus {\n if (error instanceof Hcs25CollectorHttpError && error.status === 404) {\n return 'missing';\n }\n return isTimeoutError(error) ? 'timeout' : 'error';\n}\n\nconst parseLikelyPackageName = (value: string | null): string | null => {\n if (!value) {\n return null;\n }\n const trimmed = value.trim();\n return /^[a-zA-Z0-9._~@/-]{1,214}$/.test(trimmed) ? trimmed : null;\n};\n\nconst parseNpmPackageName = (body: string): string | null => {\n try {\n const parsed = JSON.parse(body) as { name?: unknown };\n return typeof parsed.name === 'string' ? parsed.name : null;\n } catch {\n return null;\n }\n};\n\nconst parsePyProjectName = (body: string): string | null => {\n const match = body.match(/^\\s*name\\s*=\\s*[\"']([^\"']+)[\"']/m);\n return match?.[1] ?? null;\n};\n\nconst parseSetupCfgName = (body: string): string | null => {\n const match = body.match(/^\\s*name\\s*=\\s*(\\S+)\\s*$/m);\n return match?.[1] ?? null;\n};\n\n/**\n * Infers the package identity (`npm`/`pypi` + name) from the repository's\n * package manifests on `main`/`master`, per production behavior.\n */\nasync function inferPackageIdentity(\n repo: string,\n context: Hcs25CollectContext,\n): Promise<{ registry: 'npm' | 'pypi'; name: string } | null> {\n const base = `${RAW_GITHUB_BASE}/${repo\n .split('/')\n .map(encodeURIComponent)\n .join('/')}`;\n let npmName: string | null = null;\n let pypiName: string | null = null;\n\n for (const branch of ['main', 'master']) {\n if (!npmName) {\n try {\n const body = await requestText(`${base}/${branch}/package.json`, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n npmName = parseLikelyPackageName(parseNpmPackageName(body));\n } catch {\n // manifest not present on this branch\n }\n }\n if (!pypiName) {\n try {\n const body = await requestText(`${base}/${branch}/pyproject.toml`, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n pypiName = parseLikelyPackageName(parsePyProjectName(body));\n } catch {\n try {\n const body = await requestText(`${base}/${branch}/setup.cfg`, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n pypiName = parseLikelyPackageName(parseSetupCfgName(body));\n } catch {\n // no python manifest either\n }\n }\n }\n if (npmName || pypiName) {\n break;\n }\n }\n\n if (npmName && !pypiName) {\n return { registry: 'npm', name: npmName };\n }\n if (pypiName && !npmName) {\n return { registry: 'pypi', name: pypiName };\n }\n return null;\n}\n\n/**\n * Infers the GitHub repository for a package from its registry metadata\n * (PyPI `project_urls`/`home_page`; npm `repository.url`/`homepage`/\n * `bugs.url`).\n */\nasync function inferRepositoryFromPackage(\n pkg: { registry: 'npm' | 'pypi'; name: string },\n context: Hcs25CollectContext,\n): Promise<string | null> {\n const candidates: string[] = [];\n try {\n if (pkg.registry === 'pypi') {\n const payload = await requestJson<{\n info?: {\n home_page?: unknown;\n project_urls?: Record<string, unknown>;\n };\n }>(`${PYPI_API_BASE}/${encodeURIComponent(pkg.name)}/json`, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n const home = payload.info?.home_page;\n if (typeof home === 'string') {\n candidates.push(home);\n }\n const urls = payload.info?.project_urls;\n if (urls && typeof urls === 'object' && !Array.isArray(urls)) {\n for (const value of Object.values(urls)) {\n if (typeof value === 'string') {\n candidates.push(value);\n }\n }\n }\n } else {\n const payload = await requestJson<{\n repository?: { url?: unknown } | unknown;\n homepage?: unknown;\n bugs?: { url?: unknown } | unknown;\n }>(`${NPM_REGISTRY_BASE}/${encodeURIComponent(pkg.name)}`, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n const repo =\n payload.repository &&\n typeof payload.repository === 'object' &&\n !Array.isArray(payload.repository)\n ? (payload.repository as Record<string, unknown>).url\n : payload.repository;\n if (typeof repo === 'string') {\n candidates.push(repo);\n }\n if (typeof payload.homepage === 'string') {\n candidates.push(payload.homepage);\n }\n const bugs =\n payload.bugs &&\n typeof payload.bugs === 'object' &&\n !Array.isArray(payload.bugs)\n ? (payload.bugs as Record<string, unknown>).url\n : payload.bugs;\n if (typeof bugs === 'string') {\n candidates.push(bugs);\n }\n }\n } catch {\n return null;\n }\n for (const candidate of candidates) {\n const repo = parseGithubRepo(candidate);\n if (repo) {\n return repo;\n }\n }\n return null;\n}\n\n/**\n * Reads GitHub star count from the repo HTML page's counter badge\n * (production fallback when the API is rate-limited).\n */\nasync function fetchGithubStarsViaHtml(\n repo: string,\n context: Hcs25CollectContext,\n): Promise<number | null> {\n const url = `https://github.com/${repo\n .split('/')\n .map(encodeURIComponent)\n .join('/')}`;\n const body = await requestText(url, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n headers: { accept: 'text/html' },\n });\n const match =\n body.match(\n /id=\"repo-stars-counter-star\"[^>]*aria-label=\"(?<count>[0-9,]+)\\s+users?\\s+starred/i,\n ) ??\n body.match(/id=\"repo-stars-counter-star\"[^>]*title=\"(?<count>[0-9,]+)\"/i);\n const raw = match?.groups?.count;\n if (!raw) {\n return null;\n }\n const parsed = Number(raw.replace(/,/g, ''));\n return Number.isFinite(parsed) ? Math.max(0, Math.floor(parsed)) : null;\n}\n\n/**\n * Creates the `oss-popularity` signal adapter: collects GitHub repository\n * stars and npm/PyPI 30-day download counts — with package/repo identity\n * inference across `package.json`, `pyproject.toml`, `setup.cfg`, PyPI\n * metadata, and npm registry metadata — writing the catalog fields under\n * `metadata.additional`.\n */\nexport function createOssPopularitySignalAdapter(\n options: Hcs25OssPopularitySignalAdapterOptions = {},\n): Hcs25SignalAdapter {\n const collect = async (\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n ): Promise<Hcs25SignalAdapterResult[]> => {\n const now = context.now.toISOString();\n let repo = resolveGithubRepo(subject);\n let pkg = resolvePackage(subject);\n\n // Cross-inference: repo ⇄ package (production behavior).\n if (!repo && pkg && options.inferRepository !== false) {\n repo = await inferRepositoryFromPackage(pkg, context).catch(\n (): null => null,\n );\n }\n if (!pkg && repo && options.inferPackageIdentity !== false) {\n pkg = await inferPackageIdentity(repo, context).catch((): null => null);\n }\n\n const results: Hcs25SignalAdapterResult[] = [];\n const additional: Record<string, Hcs25JsonValue> = {};\n\n if (repo) {\n additional.githubRepo = repo;\n additional.packageRepositoryUpdatedAt = now;\n try {\n const headers: Record<string, string> = {\n accept: 'application/vnd.github+json',\n };\n if (options.githubToken) {\n headers.authorization = `Bearer ${options.githubToken}`;\n }\n let stars: number | null = null;\n try {\n const data = await requestJson<GithubRepoResponse>(\n `${options.githubApiBase ?? GITHUB_API_BASE}/repos/${repo}`,\n {\n fetch: context.fetch,\n headers,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n },\n );\n stars =\n typeof data.stargazers_count === 'number'\n ? Math.max(0, Math.floor(data.stargazers_count))\n : null;\n } catch (error) {\n if (options.githubHtmlFallback === false) {\n throw error;\n }\n }\n if (stars === null && options.githubHtmlFallback !== false) {\n stars = await fetchGithubStarsViaHtml(repo, context).catch(\n (): null => null,\n );\n }\n additional.githubStars = stars;\n additional.githubStarsUpdatedAt = now;\n results.push({\n signalId: 'oss.github_stars',\n status: stars === null ? 'missing' : 'ok',\n value: stars,\n provenance: {\n source: 'github',\n sourceUrl: `${options.githubApiBase ?? GITHUB_API_BASE}/repos/${repo}`,\n subjectId: repo,\n fetchedAt: now,\n },\n });\n } catch (error) {\n results.push({\n signalId: 'oss.github_stars',\n status: statusFromError(error),\n provenance: {\n source: 'github',\n subjectId: repo,\n fetchedAt: now,\n },\n });\n }\n }\n\n if (pkg) {\n additional.packageRegistry = pkg.registry;\n additional.packageName = pkg.name;\n additional.packageIdentityUpdatedAt = now;\n const signalId =\n pkg.registry === 'npm' ? 'oss.npm_downloads' : 'oss.pypi_downloads';\n try {\n if (pkg.registry === 'npm') {\n const data = await requestJson<NpmDownloadsResponse>(\n `${options.npmApiBase ?? NPM_API_BASE}/downloads/point/last-month/${encodeURIComponent(pkg.name)}`,\n {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n },\n );\n const downloads =\n typeof data.downloads === 'number'\n ? Math.max(0, Math.floor(data.downloads))\n : null;\n additional.npmDownloads30d = downloads;\n additional.npmDownloadsUpdatedAt = now;\n if (downloads !== null) {\n additional.packageDownloadCount = downloads;\n }\n results.push({\n signalId,\n status: downloads === null ? 'missing' : 'ok',\n value: downloads,\n provenance: {\n source: 'npm',\n subjectId: pkg.name,\n fetchedAt: now,\n },\n });\n } else {\n const data = await requestJson<PyPiRecentResponse>(\n `${options.pypiApiBase ?? PYPISTATS_API_BASE}/packages/${encodeURIComponent(pkg.name)}/recent`,\n {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n },\n );\n const downloads =\n typeof data.data?.last_month === 'number'\n ? Math.max(0, Math.floor(data.data.last_month))\n : null;\n additional.pypiDownloads30d = downloads;\n additional.pypiDownloadsUpdatedAt = now;\n if (downloads !== null) {\n additional.packageDownloadCount = downloads;\n }\n results.push({\n signalId,\n status: downloads === null ? 'missing' : 'ok',\n value: downloads,\n provenance: {\n source: 'pypi',\n subjectId: pkg.name,\n fetchedAt: now,\n },\n });\n }\n } catch (error) {\n results.push({\n signalId,\n status: statusFromError(error),\n provenance: {\n source: pkg.registry,\n subjectId: pkg.name,\n fetchedAt: now,\n },\n });\n }\n }\n\n if (results.length === 0) {\n return [\n {\n signalId: 'oss.github_stars',\n status: 'missing',\n },\n ];\n }\n\n const rootValues: Record<string, Hcs25JsonValue> = {};\n // Persist an inferred repository at the metadata root so downstream\n // collectors and the stored record share the canonical value.\n if (repo && !readString(subject.metadata ?? {}, 'repository')) {\n rootValues.repository = `https://github.com/${repo}`;\n }\n\n results.push({\n signalId: 'oss.popularity',\n status: 'ok',\n fields: [\n { scope: 'additional', values: additional },\n ...(Object.keys(rootValues).length > 0\n ? [{ scope: 'root' as const, values: rootValues }]\n : []),\n ],\n provenance: {\n source: 'oss-popularity',\n subjectId: subject.id,\n fetchedAt: now,\n },\n });\n return results;\n };\n\n return {\n id: 'oss-popularity',\n produces: [\n 'oss.github_stars',\n 'oss.npm_downloads',\n 'oss.pypi_downloads',\n 'oss.popularity',\n ],\n timeoutMs: options.timeoutMs,\n includeRegistries: options.includeRegistries,\n excludeRegistries: options.excludeRegistries,\n appliesTo: options.appliesTo,\n collect,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"standards-sdk.es131.js","sources":["../../src/hcs-25/collectors/ethos.ts"],"sourcesContent":["import type { Hcs25JsonValue, Hcs25Subject } from '../types';\nimport { isJsonObject, readString, readSubjectAdditional } from '../signals';\nimport { parseTimestampMs } from './freshness';\nimport {\n Hcs25CollectorHttpError,\n isTimeoutError,\n requestJson,\n stripTrailingSlashes,\n} from './http';\nimport type {\n Hcs25CollectContext,\n Hcs25SignalAdapter,\n Hcs25SignalAdapterResult,\n} from './types';\n\nconst ETHOS_API_BASE_URL = 'https://api.ethos.network';\nconst DEFAULT_CLIENT_ID = 'standards-sdk';\nconst EMBEDDED_EVM_ADDRESS_PATTERN = /0x[0-9a-fA-F]{40}/;\nconst TWITTER_HANDLE_PATTERN = /^[a-zA-Z0-9_]{1,64}$/;\n\ntype EthosSourceKind = 'explicit' | 'x' | 'address';\ntype EthosStoredStatus = 'ok' | 'missing' | 'error';\n\n/**\n * A resolved Ethos userkey source: the userkey, how it was derived, and its\n * composite weight (per the ethos signal document's `ethosSources` schema).\n */\nexport interface Hcs25EthosSource {\n userkey: string;\n kind: EthosSourceKind;\n weight: number;\n status?: EthosStoredStatus;\n score?: number | null;\n updatedAt?: string;\n}\n\n/**\n * Options for the Ethos signal adapter.\n */\nexport interface Hcs25EthosSignalAdapterOptions {\n /**\n * Ethos API base URL; the collector requests\n * `{baseUrl}/api/v1/score/{userkey}` (the production v1 endpoint, which\n * returns an `{ok, data: {score}}` envelope). Default\n * `https://api.ethos.network`.\n */\n baseUrl?: string;\n /** `X-Ethos-Client` identifier sent with every request. */\n client?: string;\n /**\n * Explicit source list; when omitted, sources are derived per the\n * production derivation rules (see {@link deriveEthosSources}).\n */\n sources?: (subject: Hcs25Subject) => readonly Hcs25EthosSource[];\n /**\n * Refresh interval applied to sources whose stored status is `ok`.\n * Default 12 hours. Set to 0 to always refetch.\n */\n ttlMs?: number;\n /**\n * Refresh interval applied to sources in `missing`/`error` state.\n * Default 6 hours.\n */\n failureTtlMs?: number;\n /** Transient-failure retries per source request. Default 2. */\n maxRetries?: number;\n /**\n * When false, disables EVM-address inference (`agentAddress`,\n * `ownerAddress`, `payTo`, `agentAddressCaip`, `nativeId`, …). Default\n * true.\n */\n inferAddress?: boolean;\n /** Per-adapter timeout in milliseconds. */\n timeoutMs?: number;\n includeRegistries?: readonly string[];\n excludeRegistries?: readonly string[];\n appliesTo?: (subject: Hcs25Subject) => boolean;\n}\n\nconst DEFAULT_EXCLUDED_REGISTRIES: readonly string[] = [\n 'openrouter',\n 'near-ai',\n 'agentverse',\n 'uagent',\n];\n\ninterface EthosScoreResponse {\n ok?: boolean;\n data?: { score?: number };\n score?: number;\n}\n\nconst normalizeRegistry = (value: unknown): string =>\n typeof value === 'string' ? value.trim().toLowerCase() : '';\n\nconst extractAddress = (value: unknown): string | null => {\n if (typeof value !== 'string') {\n return null;\n }\n const match = EMBEDDED_EVM_ADDRESS_PATTERN.exec(value.trim());\n return match ? match[0] : null;\n};\n\n/**\n * Normalizes a stored/explicit Ethos userkey: values already containing a\n * `kind:` prefix pass through; bare EVM addresses become `address:0x…`.\n */\nexport function normalizeEthosUserkey(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n if (trimmed.includes(':')) {\n return trimmed;\n }\n const address = extractAddress(trimmed);\n return address ? `address:${address}` : null;\n}\n\nconst userkeyKind = (userkey: string): EthosSourceKind => {\n const trimmed = userkey.trim();\n if (trimmed.startsWith('address:')) {\n return 'address';\n }\n if (trimmed.startsWith('service:x.com:')) {\n return 'x';\n }\n return 'explicit';\n};\n\nconst normalizeTwitterHandle = (value: unknown): string | null => {\n if (typeof value !== 'string') {\n return null;\n }\n const withoutAt = value.trim().replace(/^@/, '').replace(/\\s+/g, '');\n return TWITTER_HANDLE_PATTERN.test(withoutAt) ? withoutAt : null;\n};\n\nconst extractTwitterFromSocials = (profile: unknown): string | null => {\n if (!isJsonObject(profile as Hcs25JsonValue)) {\n return null;\n }\n const socials = (profile as Record<string, Hcs25JsonValue>).socials;\n if (!Array.isArray(socials)) {\n return null;\n }\n for (const entry of socials) {\n if (!isJsonObject(entry)) {\n continue;\n }\n const platform = normalizeRegistry(\n (entry as Record<string, Hcs25JsonValue>).platform,\n );\n if (platform !== 'twitter' && platform !== 'x') {\n continue;\n }\n const handle = normalizeTwitterHandle(\n (entry as Record<string, Hcs25JsonValue>).handle,\n );\n if (handle) {\n return handle;\n }\n }\n return null;\n};\n\n/**\n * True when the subject is structurally outside Ethos coverage (uAgent /\n * AgentVerse agents per the ethos signal doc).\n */\nexport function isEthosExcluded(subject: Hcs25Subject): boolean {\n const registry = normalizeRegistry(subject.registry);\n const metadata = subject.metadata ?? {};\n const protocol = normalizeRegistry(\n (metadata as Record<string, Hcs25JsonValue>).protocol,\n );\n const protocols = Array.isArray(\n (subject as { protocols?: unknown }).protocols,\n )\n ? ((subject as { protocols?: unknown[] }).protocols ?? [])\n .filter((v): v is string => typeof v === 'string')\n .map(normalizeRegistry)\n : [];\n return (\n registry === 'agentverse' ||\n registry === 'uagent' ||\n protocol === 'uagent' ||\n protocols.includes('uagent')\n );\n}\n\n/**\n * Derives Ethos userkey sources per the production rules:\n *\n * - `metadata.trustProviderIds.ethos` / `metadata.trust.providers.ethos` /\n * `metadata.ethosUserkey` are explicit userkeys (weight 1, short-circuit).\n * - `virtuals-protocol` subjects derive an `x` source from\n * `twitterHandle`/`memeTwitterHandle`/`profile.socials` (weight 0.7);\n * `moltbook` subjects derive from `moltbook.owner`/`profile.socials`\n * (weight 1). Other registries use the generic\n * `additional.twitter|xHandle|x|twitterHandle` keys (weight 1).\n * - `agentAddress`, `ownerAddress`, `payTo`, `agentAddressCaip`,\n * `nativeId`, `address`, `evmAddress`, `uid` yield an `address:` source\n * (embedded `0x…` extraction makes CAIP ids work). Weight drops to 0.3\n * when an `x` source already exists on a weighted registry.\n */\nexport function deriveEthosSources(subject: Hcs25Subject): Hcs25EthosSource[] {\n const metadata = subject.metadata ?? {};\n const registry = normalizeRegistry(subject.registry);\n const additional = readSubjectAdditional(subject);\n const epoch = new Date(0).toISOString();\n const push = (\n list: Hcs25EthosSource[],\n userkey: string,\n kind: EthosSourceKind,\n weight: number,\n ): void => {\n if (!list.some(source => source.userkey === userkey)) {\n list.push({\n userkey,\n kind,\n weight,\n status: 'missing',\n score: null,\n updatedAt: epoch,\n });\n }\n };\n\n const sources: Hcs25EthosSource[] = [];\n\n const trustProviderIds = isJsonObject(metadata.trustProviderIds)\n ? metadata.trustProviderIds\n : undefined;\n const trustProviders =\n isJsonObject(metadata.trust) && isJsonObject(metadata.trust.providers)\n ? (metadata.trust.providers as Record<string, Hcs25JsonValue>)\n : undefined;\n for (const candidate of [\n trustProviderIds?.ethos,\n trustProviders?.ethos,\n metadata.ethosUserkey,\n ]) {\n const userkey = normalizeEthosUserkey(candidate);\n if (userkey) {\n push(sources, userkey, userkeyKind(userkey), 1);\n return sources;\n }\n }\n\n const metadataRecord = metadata as Record<string, Hcs25JsonValue>;\n const profileSocials =\n extractTwitterFromSocials(metadataRecord.profile) ??\n extractTwitterFromSocials((subject as { profile?: unknown }).profile);\n\n if (registry === 'virtuals-protocol') {\n const handle =\n normalizeTwitterHandle(metadataRecord.twitterHandle) ??\n normalizeTwitterHandle(metadataRecord.memeTwitterHandle) ??\n profileSocials;\n if (handle) {\n push(sources, `service:x.com:username:${handle}`, 'x', 0.7);\n }\n } else if (registry === 'moltbook') {\n const owner = isJsonObject(metadataRecord.moltbook)\n ? normalizeTwitterHandle(\n (metadataRecord.moltbook as Record<string, Hcs25JsonValue>).owner,\n )\n : null;\n const handle = owner ?? profileSocials;\n if (handle) {\n push(sources, `service:x.com:username:${handle}`, 'x', 1);\n }\n } else {\n const genericHandle = [\n readString(additional, 'twitter'),\n readString(additional, 'xHandle'),\n readString(additional, 'x'),\n readString(additional, 'twitterHandle'),\n readString(metadataRecord, 'twitter'),\n readString(metadataRecord, 'xHandle'),\n readString(metadataRecord, 'x'),\n profileSocials,\n ]\n .map(normalizeTwitterHandle)\n .find((handle): handle is string => handle !== null);\n if (genericHandle) {\n push(sources, `service:x.com:username:${genericHandle}`, 'x', 1);\n }\n }\n\n const addressCandidates = [\n metadataRecord.agentAddress,\n metadataRecord.ownerAddress,\n metadataRecord.payTo,\n metadataRecord.agentAddressCaip,\n metadataRecord.nativeId,\n metadataRecord.address,\n metadataRecord.evmAddress,\n metadataRecord.uid,\n ];\n for (const candidate of addressCandidates) {\n const address = extractAddress(candidate);\n if (!address) {\n continue;\n }\n const weightedRegistry =\n registry === 'virtuals-protocol' || registry === 'moltbook';\n const weight =\n weightedRegistry && sources.some(source => source.kind === 'x') ? 0.3 : 1;\n push(sources, `address:${address}`, 'address', weight);\n break;\n }\n\n return sources;\n}\n\nconst pickPrimaryUserkey = (\n sources: readonly Hcs25EthosSource[],\n): string | null =>\n sources.find(source => source.kind === 'address')?.userkey ??\n sources[0]?.userkey ??\n null;\n\nfunction readStoredSources(subject: Hcs25Subject): Hcs25EthosSource[] {\n const raw = subject.metadata?.ethosSources;\n if (!Array.isArray(raw)) {\n return [];\n }\n const out: Hcs25EthosSource[] = [];\n for (const entry of raw) {\n if (!isJsonObject(entry)) {\n continue;\n }\n const record = entry as Record<string, Hcs25JsonValue>;\n const userkey = readString(record, 'userkey');\n if (!userkey) {\n continue;\n }\n const rawKind = readString(record, 'kind');\n const rawStatus = readString(record, 'status');\n const score = record.score;\n out.push({\n userkey,\n kind:\n rawKind === 'x' || rawKind === 'address' || rawKind === 'explicit'\n ? rawKind\n : userkeyKind(userkey),\n weight:\n typeof record.weight === 'number' && Number.isFinite(record.weight)\n ? Math.max(0, record.weight)\n : 1,\n status:\n rawStatus === 'ok' || rawStatus === 'error' ? rawStatus : 'missing',\n score: typeof score === 'number' && Number.isFinite(score) ? score : null,\n updatedAt: readString(record, 'updatedAt') ?? new Date(0).toISOString(),\n });\n }\n return out;\n}\n\n/**\n * Creates the `ethos` signal adapter: resolves the subject's Ethos userkeys\n * per the production derivation rules, fetches each source's score from the\n * Ethos v1 score endpoint (`{ok, data:{score}}` envelope), merges with the\n * stored `ethosSources` per-source freshness (TTL/failure-TTL gating), and\n * writes the `ethosUserkey`/`ethosScore`/`ethosScoreStatus`/`ethosSources`/\n * `ethosComposite` stored fields per the signal catalog.\n */\nexport function createEthosSignalAdapter(\n options: Hcs25EthosSignalAdapterOptions = {},\n): Hcs25SignalAdapter {\n const baseUrl = stripTrailingSlashes(options.baseUrl ?? ETHOS_API_BASE_URL);\n const resolveSources = options.sources ?? deriveEthosSources;\n const ttlMs = options.ttlMs ?? 12 * 60 * 60 * 1000;\n const failureTtlMs = options.failureTtlMs ?? 6 * 60 * 60 * 1000;\n const maxRetries = options.maxRetries ?? 2;\n const inferAddress = options.inferAddress ?? true;\n const clientId = options.client ?? DEFAULT_CLIENT_ID;\n\n const collect = async (\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n ): Promise<Hcs25SignalAdapterResult[]> => {\n const now = context.now.toISOString();\n\n const resolved = ((): Hcs25EthosSource[] => {\n const sources = resolveSources(subject);\n return inferAddress\n ? [...sources]\n : sources.filter(source => source.kind !== 'address');\n })();\n\n if (resolved.length === 0) {\n return [\n {\n signalId: 'ethos.score',\n status: 'missing',\n fields: [\n {\n scope: 'root',\n values: {\n ethosScore: null,\n ethosScoreStatus: 'missing',\n ethosScoreUpdatedAt: now,\n ethosSources: [],\n },\n },\n ],\n },\n ];\n }\n\n // Merge with stored sources: keep prior scores/statuses so a transient\n // failure does not erase data, and so TTL gating can skip fresh sources.\n const storedByUserkey = new Map(\n readStoredSources(subject).map(source => [source.userkey, source]),\n );\n const merged: Hcs25EthosSource[] = resolved.map(source => {\n const stored = storedByUserkey.get(source.userkey);\n return {\n ...source,\n status: stored?.status ?? source.status ?? 'missing',\n score: stored?.score ?? source.score ?? null,\n updatedAt: stored?.updatedAt ?? source.updatedAt,\n };\n });\n\n const toRefresh = merged.filter(source => {\n if (context.force) {\n return true;\n }\n const updatedMs = parseTimestampMs(source.updatedAt);\n if (updatedMs === null || updatedMs <= 0) {\n return true;\n }\n const ttl = source.status === 'ok' ? ttlMs : failureTtlMs;\n return context.now.getTime() - updatedMs >= ttl;\n });\n\n const headers: Record<string, string> = { 'X-Ethos-Client': clientId };\n let sawError = false;\n let sawTimeout = false;\n\n await Promise.all(\n toRefresh.map(async source => {\n const url = `${baseUrl}/api/v1/score/${encodeURIComponent(source.userkey)}`;\n try {\n const data = await requestJson<EthosScoreResponse>(url, {\n fetch: context.fetch,\n headers,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n maxRetries,\n });\n // Production envelope `{ok, data:{score}}`; tolerate a flat\n // `{score}` payload for v2-shaped endpoints.\n const score =\n typeof data?.data?.score === 'number' &&\n Number.isFinite(data.data.score)\n ? data.data.score\n : typeof data?.score === 'number' && Number.isFinite(data.score)\n ? data.score\n : null;\n source.updatedAt = now;\n if (data?.ok === false || score === null) {\n source.status = 'missing';\n source.score = null;\n } else {\n source.status = 'ok';\n source.score = score;\n }\n } catch (error) {\n source.updatedAt = now;\n if (error instanceof Hcs25CollectorHttpError) {\n if (error.status === 404) {\n source.status = 'missing';\n source.score = null;\n } else {\n source.status = 'error';\n // Preserve a previously stored score on transient failure.\n source.score = source.score ?? null;\n sawError = true;\n }\n } else if (isTimeoutError(error)) {\n source.status = 'error';\n sawTimeout = true;\n sawError = true;\n } else {\n source.status = 'error';\n sawError = true;\n }\n }\n }),\n );\n\n const scoredSources = merged.filter(\n source =>\n typeof source.score === 'number' && Number.isFinite(source.score),\n );\n const weightSum = scoredSources.reduce(\n (sum, source) => sum + Math.max(0, source.weight),\n 0,\n );\n const composite =\n weightSum > 0\n ? Math.round(\n (scoredSources.reduce(\n (sum, source) => sum + source.weight * (source.score ?? 0),\n 0,\n ) /\n weightSum) *\n 100,\n ) / 100\n : null;\n\n const compositeStatus: EthosStoredStatus = merged.some(\n source => source.status === 'ok',\n )\n ? 'ok'\n : merged.some(source => source.status === 'error')\n ? 'error'\n : 'missing';\n\n // Composite weights are keyed by source kind (x/address/explicit).\n const weights: Record<string, number> = {};\n for (const source of merged) {\n weights[source.kind] =\n Math.round(((weights[source.kind] ?? 0) + source.weight) * 100) / 100;\n }\n\n const signalStatus =\n compositeStatus === 'ok'\n ? 'ok'\n : sawTimeout\n ? 'timeout'\n : compositeStatus === 'error'\n ? 'error'\n : 'missing';\n\n return [\n {\n signalId: 'ethos.score',\n status: signalStatus,\n value: composite,\n fields: [\n {\n scope: 'root',\n values: {\n ethosUserkey: pickPrimaryUserkey(merged),\n ethosScore: composite,\n ethosScoreStatus: compositeStatus,\n ethosScoreUpdatedAt: now,\n ethosSources: merged.map(source => ({\n userkey: source.userkey,\n kind: source.kind,\n weight: source.weight,\n status: source.status ?? 'missing',\n score: source.score ?? null,\n updatedAt: source.updatedAt ?? now,\n })),\n ethosComposite: {\n version: 1,\n score: composite,\n updatedAt: now,\n weights,\n },\n },\n },\n ],\n provenance: {\n source: 'ethos',\n sourceUrl: `${baseUrl}/api/v1/score`,\n subjectId: subject.id,\n fetchedAt: now,\n params: { userkeys: merged.map(source => source.userkey) },\n },\n },\n ];\n };\n\n return {\n id: 'ethos',\n produces: ['ethos.score'],\n timeoutMs: options.timeoutMs,\n includeRegistries: options.includeRegistries,\n excludeRegistries: options.excludeRegistries ?? DEFAULT_EXCLUDED_REGISTRIES,\n appliesTo: options.appliesTo ?? (subject => !isEthosExcluded(subject)),\n collect,\n };\n}\n"],"names":[],"mappings":"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"}
|