@hashgraphonline/standards-sdk 0.1.183 → 0.1.185

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 (289) hide show
  1. package/dist/browser/hcs-25/identifiers.d.ts +24 -0
  2. package/dist/browser/hcs-25/identifiers.d.ts.map +1 -0
  3. package/dist/browser/hcs-25/index.d.ts +4 -0
  4. package/dist/browser/hcs-25/index.d.ts.map +1 -0
  5. package/dist/browser/hcs-25/scoring.d.ts +32 -0
  6. package/dist/browser/hcs-25/scoring.d.ts.map +1 -0
  7. package/dist/browser/hcs-25/types.d.ts +363 -0
  8. package/dist/browser/hcs-25/types.d.ts.map +1 -0
  9. package/dist/browser/index.d.ts +1 -0
  10. package/dist/browser/index.d.ts.map +1 -1
  11. package/dist/browser/services/registry-broker/index.d.ts +1 -0
  12. package/dist/browser/services/registry-broker/index.d.ts.map +1 -1
  13. package/dist/browser/services/registry-broker/schemas.d.ts +6 -0
  14. package/dist/browser/services/registry-broker/schemas.d.ts.map +1 -1
  15. package/dist/browser/services/registry-broker/types.d.ts +7 -1
  16. package/dist/browser/services/registry-broker/types.d.ts.map +1 -1
  17. package/dist/browser/standards-sdk.browser.js.map +1 -1
  18. package/dist/browser-root/hcs-25/identifiers.d.ts +24 -0
  19. package/dist/browser-root/hcs-25/identifiers.d.ts.map +1 -0
  20. package/dist/browser-root/hcs-25/index.d.ts +4 -0
  21. package/dist/browser-root/hcs-25/index.d.ts.map +1 -0
  22. package/dist/browser-root/hcs-25/scoring.d.ts +32 -0
  23. package/dist/browser-root/hcs-25/scoring.d.ts.map +1 -0
  24. package/dist/browser-root/hcs-25/types.d.ts +363 -0
  25. package/dist/browser-root/hcs-25/types.d.ts.map +1 -0
  26. package/dist/browser-root/index.d.ts +1 -0
  27. package/dist/browser-root/index.d.ts.map +1 -1
  28. package/dist/browser-root/services/registry-broker/index.d.ts +1 -0
  29. package/dist/browser-root/services/registry-broker/index.d.ts.map +1 -1
  30. package/dist/browser-root/services/registry-broker/schemas.d.ts +6 -0
  31. package/dist/browser-root/services/registry-broker/schemas.d.ts.map +1 -1
  32. package/dist/browser-root/services/registry-broker/types.d.ts +7 -1
  33. package/dist/browser-root/services/registry-broker/types.d.ts.map +1 -1
  34. package/dist/browser-root/standards-sdk.root-browser.js +8 -1
  35. package/dist/browser-root/standards-sdk.root-browser.js.map +1 -1
  36. package/dist/cjs/hcs-25/identifiers.d.ts +24 -0
  37. package/dist/cjs/hcs-25/identifiers.d.ts.map +1 -0
  38. package/dist/cjs/hcs-25/index.d.ts +4 -0
  39. package/dist/cjs/hcs-25/index.d.ts.map +1 -0
  40. package/dist/cjs/hcs-25/scoring.d.ts +32 -0
  41. package/dist/cjs/hcs-25/scoring.d.ts.map +1 -0
  42. package/dist/cjs/hcs-25/types.d.ts +363 -0
  43. package/dist/cjs/hcs-25/types.d.ts.map +1 -0
  44. package/dist/cjs/index.d.ts +1 -0
  45. package/dist/cjs/index.d.ts.map +1 -1
  46. package/dist/cjs/services/registry-broker/index.d.ts +1 -0
  47. package/dist/cjs/services/registry-broker/index.d.ts.map +1 -1
  48. package/dist/cjs/services/registry-broker/schemas.d.ts +6 -0
  49. package/dist/cjs/services/registry-broker/schemas.d.ts.map +1 -1
  50. package/dist/cjs/services/registry-broker/types.d.ts +7 -1
  51. package/dist/cjs/services/registry-broker/types.d.ts.map +1 -1
  52. package/dist/cjs/standards-sdk.cjs +2 -2
  53. package/dist/cjs/standards-sdk.cjs.map +1 -1
  54. package/dist/es/hcs-25/identifiers.d.ts +24 -0
  55. package/dist/es/hcs-25/identifiers.d.ts.map +1 -0
  56. package/dist/es/hcs-25/index.d.ts +4 -0
  57. package/dist/es/hcs-25/index.d.ts.map +1 -0
  58. package/dist/es/hcs-25/scoring.d.ts +32 -0
  59. package/dist/es/hcs-25/scoring.d.ts.map +1 -0
  60. package/dist/es/hcs-25/types.d.ts +363 -0
  61. package/dist/es/hcs-25/types.d.ts.map +1 -0
  62. package/dist/es/index.d.ts +1 -0
  63. package/dist/es/index.d.ts.map +1 -1
  64. package/dist/es/services/registry-broker/index.d.ts +1 -0
  65. package/dist/es/services/registry-broker/index.d.ts.map +1 -1
  66. package/dist/es/services/registry-broker/schemas.d.ts +6 -0
  67. package/dist/es/services/registry-broker/schemas.d.ts.map +1 -1
  68. package/dist/es/services/registry-broker/types.d.ts +7 -1
  69. package/dist/es/services/registry-broker/types.d.ts.map +1 -1
  70. package/dist/es/standards-sdk.es.js +69 -39
  71. package/dist/es/standards-sdk.es.js.map +1 -1
  72. package/dist/es/standards-sdk.es101.js +2 -2
  73. package/dist/es/standards-sdk.es103.js +2 -2
  74. package/dist/es/standards-sdk.es104.js +1 -1
  75. package/dist/es/standards-sdk.es106.js +1 -1
  76. package/dist/es/standards-sdk.es108.js +2 -2
  77. package/dist/es/standards-sdk.es11.js +1 -1
  78. package/dist/es/standards-sdk.es110.js +1 -1
  79. package/dist/es/standards-sdk.es111.js +2 -2
  80. package/dist/es/standards-sdk.es115.js +3 -3
  81. package/dist/es/standards-sdk.es116.js +4 -4
  82. package/dist/es/standards-sdk.es117.js +19 -251
  83. package/dist/es/standards-sdk.es117.js.map +1 -1
  84. package/dist/es/standards-sdk.es118.js +60 -475
  85. package/dist/es/standards-sdk.es118.js.map +1 -1
  86. package/dist/es/standards-sdk.es119.js +217 -86
  87. package/dist/es/standards-sdk.es119.js.map +1 -1
  88. package/dist/es/standards-sdk.es12.js +1 -1
  89. package/dist/es/standards-sdk.es120.js +242 -150
  90. package/dist/es/standards-sdk.es120.js.map +1 -1
  91. package/dist/es/standards-sdk.es121.js +470 -26
  92. package/dist/es/standards-sdk.es121.js.map +1 -1
  93. package/dist/es/standards-sdk.es122.js +103 -10
  94. package/dist/es/standards-sdk.es122.js.map +1 -1
  95. package/dist/es/standards-sdk.es123.js +145 -167
  96. package/dist/es/standards-sdk.es123.js.map +1 -1
  97. package/dist/es/standards-sdk.es124.js +30 -25
  98. package/dist/es/standards-sdk.es124.js.map +1 -1
  99. package/dist/es/standards-sdk.es125.js +10 -20
  100. package/dist/es/standards-sdk.es125.js.map +1 -1
  101. package/dist/es/standards-sdk.es126.js +159 -137
  102. package/dist/es/standards-sdk.es126.js.map +1 -1
  103. package/dist/es/standards-sdk.es127.js +27 -199
  104. package/dist/es/standards-sdk.es127.js.map +1 -1
  105. package/dist/es/standards-sdk.es128.js +15 -783
  106. package/dist/es/standards-sdk.es128.js.map +1 -1
  107. package/dist/es/standards-sdk.es129.js +157 -10
  108. package/dist/es/standards-sdk.es129.js.map +1 -1
  109. package/dist/es/standards-sdk.es13.js +1 -1
  110. package/dist/es/standards-sdk.es130.js +198 -564
  111. package/dist/es/standards-sdk.es130.js.map +1 -1
  112. package/dist/es/standards-sdk.es131.js +703 -539
  113. package/dist/es/standards-sdk.es131.js.map +1 -1
  114. package/dist/es/standards-sdk.es132.js +12 -12
  115. package/dist/es/standards-sdk.es132.js.map +1 -1
  116. package/dist/es/standards-sdk.es133.js +567 -2
  117. package/dist/es/standards-sdk.es133.js.map +1 -1
  118. package/dist/es/standards-sdk.es134.js +610 -71
  119. package/dist/es/standards-sdk.es134.js.map +1 -1
  120. package/dist/es/standards-sdk.es135.js +12 -39
  121. package/dist/es/standards-sdk.es135.js.map +1 -1
  122. package/dist/es/standards-sdk.es136.js +2 -2
  123. package/dist/es/standards-sdk.es136.js.map +1 -1
  124. package/dist/es/standards-sdk.es137.js +42 -190
  125. package/dist/es/standards-sdk.es137.js.map +1 -1
  126. package/dist/es/standards-sdk.es138.js +39 -1139
  127. package/dist/es/standards-sdk.es138.js.map +1 -1
  128. package/dist/es/standards-sdk.es139.js +2 -306
  129. package/dist/es/standards-sdk.es139.js.map +1 -1
  130. package/dist/es/standards-sdk.es14.js +1 -1
  131. package/dist/es/standards-sdk.es140.js +231 -418
  132. package/dist/es/standards-sdk.es140.js.map +1 -1
  133. package/dist/es/standards-sdk.es141.js +1135 -350
  134. package/dist/es/standards-sdk.es141.js.map +1 -1
  135. package/dist/es/standards-sdk.es142.js +268 -1084
  136. package/dist/es/standards-sdk.es142.js.map +1 -1
  137. package/dist/es/standards-sdk.es143.js +418 -204
  138. package/dist/es/standards-sdk.es143.js.map +1 -1
  139. package/dist/es/standards-sdk.es144.js +350 -1562
  140. package/dist/es/standards-sdk.es144.js.map +1 -1
  141. package/dist/es/standards-sdk.es145.js +1061 -1096
  142. package/dist/es/standards-sdk.es145.js.map +1 -1
  143. package/dist/es/standards-sdk.es146.js +204 -13
  144. package/dist/es/standards-sdk.es146.js.map +1 -1
  145. package/dist/es/standards-sdk.es147.js +1541 -233
  146. package/dist/es/standards-sdk.es147.js.map +1 -1
  147. package/dist/es/standards-sdk.es148.js +1157 -4
  148. package/dist/es/standards-sdk.es148.js.map +1 -1
  149. package/dist/es/standards-sdk.es149.js +15 -79
  150. package/dist/es/standards-sdk.es149.js.map +1 -1
  151. package/dist/es/standards-sdk.es15.js +1 -1
  152. package/dist/es/standards-sdk.es150.js +250 -78
  153. package/dist/es/standards-sdk.es150.js.map +1 -1
  154. package/dist/es/standards-sdk.es151.js +4 -60
  155. package/dist/es/standards-sdk.es151.js.map +1 -1
  156. package/dist/es/standards-sdk.es152.js +75 -153
  157. package/dist/es/standards-sdk.es152.js.map +1 -1
  158. package/dist/es/standards-sdk.es153.js +87 -7
  159. package/dist/es/standards-sdk.es153.js.map +1 -1
  160. package/dist/es/standards-sdk.es154.js +54 -80
  161. package/dist/es/standards-sdk.es154.js.map +1 -1
  162. package/dist/es/standards-sdk.es155.js +2547 -65
  163. package/dist/es/standards-sdk.es155.js.map +1 -1
  164. package/dist/es/standards-sdk.es156.js +159 -30
  165. package/dist/es/standards-sdk.es156.js.map +1 -1
  166. package/dist/es/standards-sdk.es157.js +7 -34
  167. package/dist/es/standards-sdk.es157.js.map +1 -1
  168. package/dist/es/standards-sdk.es158.js +86 -48
  169. package/dist/es/standards-sdk.es158.js.map +1 -1
  170. package/dist/es/standards-sdk.es159.js +52 -125
  171. package/dist/es/standards-sdk.es159.js.map +1 -1
  172. package/dist/es/standards-sdk.es16.js +5 -5
  173. package/dist/es/standards-sdk.es160.js +30 -42
  174. package/dist/es/standards-sdk.es160.js.map +1 -1
  175. package/dist/es/standards-sdk.es161.js +32 -2538
  176. package/dist/es/standards-sdk.es161.js.map +1 -1
  177. package/dist/es/standards-sdk.es162.js +48 -12482
  178. package/dist/es/standards-sdk.es162.js.map +1 -1
  179. package/dist/es/standards-sdk.es163.js +12479 -53
  180. package/dist/es/standards-sdk.es163.js.map +1 -1
  181. package/dist/es/standards-sdk.es164.js +124 -97
  182. package/dist/es/standards-sdk.es164.js.map +1 -1
  183. package/dist/es/standards-sdk.es165.js +35 -74
  184. package/dist/es/standards-sdk.es165.js.map +1 -1
  185. package/dist/es/standards-sdk.es166.js +14 -197
  186. package/dist/es/standards-sdk.es166.js.map +1 -1
  187. package/dist/es/standards-sdk.es167.js +54 -15
  188. package/dist/es/standards-sdk.es167.js.map +1 -1
  189. package/dist/es/standards-sdk.es168.js +96 -58
  190. package/dist/es/standards-sdk.es168.js.map +1 -1
  191. package/dist/es/standards-sdk.es169.js +69 -660
  192. package/dist/es/standards-sdk.es169.js.map +1 -1
  193. package/dist/es/standards-sdk.es170.js +188 -160
  194. package/dist/es/standards-sdk.es170.js.map +1 -1
  195. package/dist/es/standards-sdk.es171.js +657 -307
  196. package/dist/es/standards-sdk.es171.js.map +1 -1
  197. package/dist/es/standards-sdk.es172.js +64 -337
  198. package/dist/es/standards-sdk.es172.js.map +1 -1
  199. package/dist/es/standards-sdk.es173.js +129 -410
  200. package/dist/es/standards-sdk.es173.js.map +1 -1
  201. package/dist/es/standards-sdk.es174.js +200 -209
  202. package/dist/es/standards-sdk.es174.js.map +1 -1
  203. package/dist/es/standards-sdk.es175.js +334 -64
  204. package/dist/es/standards-sdk.es175.js.map +1 -1
  205. package/dist/es/standards-sdk.es176.js +438 -124
  206. package/dist/es/standards-sdk.es176.js.map +1 -1
  207. package/dist/es/standards-sdk.es177.js +310 -496
  208. package/dist/es/standards-sdk.es177.js.map +1 -1
  209. package/dist/es/standards-sdk.es178.js +60 -243
  210. package/dist/es/standards-sdk.es178.js.map +1 -1
  211. package/dist/es/standards-sdk.es179.js +118 -175
  212. package/dist/es/standards-sdk.es179.js.map +1 -1
  213. package/dist/es/standards-sdk.es18.js +12 -12
  214. package/dist/es/standards-sdk.es180.js +465 -67
  215. package/dist/es/standards-sdk.es180.js.map +1 -1
  216. package/dist/es/standards-sdk.es181.js +250 -143
  217. package/dist/es/standards-sdk.es181.js.map +1 -1
  218. package/dist/es/standards-sdk.es182.js +172 -160
  219. package/dist/es/standards-sdk.es182.js.map +1 -1
  220. package/dist/es/standards-sdk.es183.js +65 -630
  221. package/dist/es/standards-sdk.es183.js.map +1 -1
  222. package/dist/es/standards-sdk.es184.js +128 -161
  223. package/dist/es/standards-sdk.es184.js.map +1 -1
  224. package/dist/es/standards-sdk.es185.js +144 -195
  225. package/dist/es/standards-sdk.es185.js.map +1 -1
  226. package/dist/es/standards-sdk.es186.js +668 -223
  227. package/dist/es/standards-sdk.es186.js.map +1 -1
  228. package/dist/es/standards-sdk.es187.js +188 -0
  229. package/dist/es/standards-sdk.es187.js.map +1 -0
  230. package/dist/es/standards-sdk.es188.js +238 -0
  231. package/dist/es/standards-sdk.es188.js.map +1 -0
  232. package/dist/es/standards-sdk.es189.js +242 -0
  233. package/dist/es/standards-sdk.es189.js.map +1 -0
  234. package/dist/es/standards-sdk.es19.js +9 -9
  235. package/dist/es/standards-sdk.es2.js +2 -2
  236. package/dist/es/standards-sdk.es20.js +1 -1
  237. package/dist/es/standards-sdk.es21.js +1 -1
  238. package/dist/es/standards-sdk.es22.js +1 -1
  239. package/dist/es/standards-sdk.es23.js +1 -1
  240. package/dist/es/standards-sdk.es24.js +1 -1
  241. package/dist/es/standards-sdk.es25.js +1 -1
  242. package/dist/es/standards-sdk.es26.js +1 -1
  243. package/dist/es/standards-sdk.es27.js +12 -12
  244. package/dist/es/standards-sdk.es30.js +2 -2
  245. package/dist/es/standards-sdk.es31.js +4 -4
  246. package/dist/es/standards-sdk.es32.js +1 -1
  247. package/dist/es/standards-sdk.es35.js +6 -6
  248. package/dist/es/standards-sdk.es36.js +4 -4
  249. package/dist/es/standards-sdk.es37.js +2 -2
  250. package/dist/es/standards-sdk.es38.js +2 -2
  251. package/dist/es/standards-sdk.es39.js +1 -1
  252. package/dist/es/standards-sdk.es4.js +2 -2
  253. package/dist/es/standards-sdk.es40.js +1 -1
  254. package/dist/es/standards-sdk.es41.js +2 -2
  255. package/dist/es/standards-sdk.es46.js +1 -1
  256. package/dist/es/standards-sdk.es5.js +2 -2
  257. package/dist/es/standards-sdk.es51.js +1 -1
  258. package/dist/es/standards-sdk.es53.js +1 -1
  259. package/dist/es/standards-sdk.es56.js +2 -2
  260. package/dist/es/standards-sdk.es59.js +1 -1
  261. package/dist/es/standards-sdk.es6.js +2 -2
  262. package/dist/es/standards-sdk.es60.js +1 -1
  263. package/dist/es/standards-sdk.es62.js +1 -1
  264. package/dist/es/standards-sdk.es63.js +2 -2
  265. package/dist/es/standards-sdk.es64.js +1 -1
  266. package/dist/es/standards-sdk.es65.js +1 -1
  267. package/dist/es/standards-sdk.es66.js +1 -1
  268. package/dist/es/standards-sdk.es67.js +7 -7
  269. package/dist/es/standards-sdk.es69.js +1 -1
  270. package/dist/es/standards-sdk.es7.js +1 -1
  271. package/dist/es/standards-sdk.es71.js +2 -2
  272. package/dist/es/standards-sdk.es72.js +3 -3
  273. package/dist/es/standards-sdk.es75.js +5 -5
  274. package/dist/es/standards-sdk.es76.js +3 -3
  275. package/dist/es/standards-sdk.es77.js +2 -2
  276. package/dist/es/standards-sdk.es78.js +1 -1
  277. package/dist/es/standards-sdk.es81.js +2 -2
  278. package/dist/es/standards-sdk.es83.js +2 -2
  279. package/dist/es/standards-sdk.es84.js +4 -4
  280. package/dist/es/standards-sdk.es85.js +1 -1
  281. package/dist/es/standards-sdk.es88.js +1 -1
  282. package/dist/es/standards-sdk.es89.js +2 -2
  283. package/dist/es/standards-sdk.es9.js +2 -2
  284. package/dist/es/standards-sdk.es90.js +4 -4
  285. package/dist/es/standards-sdk.es94.js +3 -3
  286. package/dist/es/standards-sdk.es96.js +2 -2
  287. package/dist/es/standards-sdk.es98.js +1 -1
  288. package/dist/es/standards-sdk.es99.js +3 -3
  289. package/package.json +1 -1
@@ -1,108 +1,239 @@
1
- import { z } from "zod";
2
- import { hcs26TopicTypeEnumSchema, HCS26_PROTOCOL, hcs26OperationEnumSchema } from "./standards-sdk.es117.js";
3
- const HCS26_DEFAULT_TTL_SECONDS = 86400;
4
- function toPositiveInt(value) {
5
- if (!Number.isFinite(value)) {
6
- throw new Error("Expected a finite number");
7
- }
8
- const intValue = Math.floor(value);
9
- if (intValue <= 0) {
10
- throw new Error("Expected a positive integer");
11
- }
12
- return intValue;
1
+ import { isValidAdapterId, isValidComponentKey, isValidComponentName } from "./standards-sdk.es117.js";
2
+ import { HCS25_DEFAULT_STALE_MULTIPLIER, HCS25_DEFAULT_ROUNDING_DECIMALS, hcs25SubjectSchema, hcs25SignalSnapshotSchema, HCS25_DEFAULT_WEIGHT, HCS25_DEFAULT_CONTRIBUTION_MODE } from "./standards-sdk.es118.js";
3
+ function clampScore(value) {
4
+ return Math.min(100, Math.max(0, value));
13
5
  }
14
- function buildHcs26TopicMemo(input) {
15
- const indexed = input.indexed ?? true;
16
- const ttlSeconds = toPositiveInt(
17
- input.ttlSeconds ?? HCS26_DEFAULT_TTL_SECONDS
18
- );
19
- const topicType = hcs26TopicTypeEnumSchema.parse(input.topicType);
20
- const indexedSegment = indexed ? "0" : "1";
21
- return `${HCS26_PROTOCOL}:${indexedSegment}:${ttlSeconds}:${topicType}`;
6
+ function roundScore(value, decimals = 2) {
7
+ const factor = 10 ** decimals;
8
+ return Math.round(value * factor) / factor;
22
9
  }
23
- function parseHcs26TopicMemo(memoRaw) {
24
- const memo = memoRaw.trim();
25
- if (!memo) {
26
- return null;
10
+ function compileScoringConfig(input) {
11
+ if (!Number.isInteger(input.version) || input.version < 0) {
12
+ throw new TypeError(
13
+ "trustScoreConfigVersion must be a non-negative integer"
14
+ );
27
15
  }
28
- const match = memo.match(/^hcs-26:(\d+):(\d+):(\d+)$/);
29
- if (!match) {
30
- return null;
16
+ if (!Array.isArray(input.adapters) || input.adapters.length === 0) {
17
+ throw new TypeError("at least one trust adapter is required");
31
18
  }
32
- const indexedSegment = Number(match[1]);
33
- const ttlSeconds = Number(match[2]);
34
- const topicType = Number(match[3]);
35
- if (![indexedSegment, ttlSeconds, topicType].every(Number.isFinite)) {
36
- return null;
19
+ const seenAdapterIds = /* @__PURE__ */ new Set();
20
+ for (const adapter of input.adapters) {
21
+ validateAdapter(adapter, seenAdapterIds);
22
+ seenAdapterIds.add(adapter.id);
37
23
  }
38
- const parsedTopicType = hcs26TopicTypeEnumSchema.safeParse(topicType);
39
- if (!parsedTopicType.success) {
40
- return null;
24
+ const staleMultiplier = input.staleMultiplier ?? HCS25_DEFAULT_STALE_MULTIPLIER;
25
+ if (!Number.isFinite(staleMultiplier) || staleMultiplier < 0 || staleMultiplier > 1) {
26
+ throw new TypeError("staleMultiplier must be a number in [0, 1]");
41
27
  }
42
- if (indexedSegment !== 0 && indexedSegment !== 1) {
43
- return null;
28
+ const roundingDecimals = input.roundingDecimals ?? HCS25_DEFAULT_ROUNDING_DECIMALS;
29
+ if (!Number.isInteger(roundingDecimals) || roundingDecimals < 0 || roundingDecimals > 6) {
30
+ throw new TypeError("roundingDecimals must be an integer in [0, 6]");
44
31
  }
45
32
  return {
46
- protocol: HCS26_PROTOCOL,
47
- indexed: indexedSegment === 0,
48
- ttlSeconds,
49
- topicType: parsedTopicType.data
33
+ version: input.version,
34
+ adapters: input.adapters,
35
+ staleMultiplier,
36
+ roundingDecimals,
37
+ computeConfidence: input.computeConfidence ?? false
50
38
  };
51
39
  }
52
- function buildHcs26TransactionMemo(input) {
53
- const operation = hcs26OperationEnumSchema.parse(input.operation);
54
- const topicType = hcs26TopicTypeEnumSchema.parse(input.topicType);
55
- return `${HCS26_PROTOCOL}:op:${operation}:${topicType}`;
40
+ function validateAdapter(adapter, seenAdapterIds) {
41
+ if (typeof adapter.id !== "string" || !isValidAdapterId(adapter.id)) {
42
+ throw new TypeError(
43
+ `invalid adapterId "${String(adapter.id)}": adapter identifiers must match ^[a-z][a-z0-9]*(-[a-z][a-z0-9]*)*$`
44
+ );
45
+ }
46
+ if (seenAdapterIds.has(adapter.id)) {
47
+ throw new TypeError(
48
+ `duplicate adapterId "${adapter.id}": adapter identifiers must be unique within a configuration`
49
+ );
50
+ }
51
+ if (adapter.weight !== void 0 && (!Number.isFinite(adapter.weight) || adapter.weight < 0)) {
52
+ throw new TypeError(
53
+ `adapter "${adapter.id}" weight must be a finite non-negative number`
54
+ );
55
+ }
56
+ if (!Array.isArray(adapter.components) || adapter.components.length === 0) {
57
+ throw new TypeError(
58
+ `adapter "${adapter.id}" must declare at least one component`
59
+ );
60
+ }
61
+ if (adapter.defaultComponentKey !== void 0 && !isValidComponentKey(adapter.defaultComponentKey)) {
62
+ throw new TypeError(
63
+ `adapter "${adapter.id}" defaultComponentKey must be a valid component key`
64
+ );
65
+ }
66
+ for (const component of adapter.components) {
67
+ if (typeof component.name !== "string" || !isValidComponentName(component.name)) {
68
+ throw new TypeError(
69
+ `adapter "${adapter.id}" component name "${String(component.name)}" is not a valid component key segment`
70
+ );
71
+ }
72
+ if (component.weight !== void 0 && (!Number.isFinite(component.weight) || component.weight < 0)) {
73
+ throw new TypeError(
74
+ `adapter "${adapter.id}" component "${component.name}" weight must be a finite non-negative number`
75
+ );
76
+ }
77
+ if (typeof component.normalize !== "function") {
78
+ throw new TypeError(
79
+ `adapter "${adapter.id}" component "${component.name}" must declare a normalize function`
80
+ );
81
+ }
82
+ }
56
83
  }
57
- function parseHcs26TransactionMemo(memoRaw) {
58
- const memo = memoRaw.trim();
59
- if (!memo) {
60
- return null;
84
+ function isAdapterApplicable(adapter, subject) {
85
+ if (adapter.includeRegistries) {
86
+ if (subject.registry === void 0 || !adapter.includeRegistries.includes(subject.registry)) {
87
+ return false;
88
+ }
61
89
  }
62
- const match = memo.match(/^hcs-26:op:(\d+):(\d+)$/);
63
- if (!match) {
64
- return null;
90
+ if (adapter.excludeRegistries && subject.registry !== void 0 && adapter.excludeRegistries.includes(subject.registry)) {
91
+ return false;
65
92
  }
66
- const operation = Number(match[1]);
67
- const topicType = Number(match[2]);
68
- if (![operation, topicType].every(Number.isFinite)) {
69
- return null;
93
+ if (adapter.appliesTo && !adapter.appliesTo(subject)) {
94
+ return false;
70
95
  }
71
- const parsedOperation = hcs26OperationEnumSchema.safeParse(operation);
72
- if (!parsedOperation.success) {
73
- return null;
96
+ return true;
97
+ }
98
+ function computeTrustScore(input) {
99
+ const config = compileScoringConfig(input.config);
100
+ const subject = hcs25SubjectSchema.parse(input.subject);
101
+ const snapshot = hcs25SignalSnapshotSchema.parse(input.snapshot);
102
+ const context = { subject, snapshot, config };
103
+ const adapterScores = [];
104
+ const trustScores = {};
105
+ for (const adapter of config.adapters) {
106
+ const adapterScore = scoreAdapter(adapter, subject, context, config);
107
+ adapterScores.push(adapterScore);
108
+ if (adapterScore.applicable) {
109
+ for (const component of adapterScore.components) {
110
+ trustScores[component.key] = component.value;
111
+ }
112
+ }
74
113
  }
75
- const parsedTopicType = hcs26TopicTypeEnumSchema.safeParse(topicType);
76
- if (!parsedTopicType.success) {
77
- return null;
114
+ const denominator = adapterScores.filter((score) => score.inDenominator);
115
+ const totalWeight = denominator.reduce((sum, score) => sum + score.weight, 0);
116
+ const weightedSum = denominator.reduce(
117
+ (sum, score) => sum + score.total * score.weight,
118
+ 0
119
+ );
120
+ const total = totalWeight > 0 ? roundScore(weightedSum / totalWeight, config.roundingDecimals) : 0;
121
+ trustScores.total = total;
122
+ const record = {
123
+ trustScore: total,
124
+ trustScores,
125
+ trustScoreConfigVersion: config.version,
126
+ trustScoreUpdatedAt: (input.now ?? /* @__PURE__ */ new Date()).toISOString(),
127
+ breakdown: { adapters: adapterScores }
128
+ };
129
+ if (config.computeConfidence) {
130
+ record.trustConfidence = computeConfidence(denominator, totalWeight);
131
+ }
132
+ return record;
133
+ }
134
+ function scoreAdapter(adapter, subject, context, config) {
135
+ const weight = adapter.weight ?? HCS25_DEFAULT_WEIGHT;
136
+ const contributionMode = adapter.contributionMode ?? HCS25_DEFAULT_CONTRIBUTION_MODE;
137
+ const applicable = isAdapterApplicable(adapter, subject);
138
+ const components = [];
139
+ const unavailable = [];
140
+ if (applicable) {
141
+ for (const component of adapter.components) {
142
+ const key = `${adapter.id}.${component.name}`;
143
+ const normalized = normalizeComponent(component.normalize(context));
144
+ if (normalized === null) {
145
+ if (component.nonScorableWhenUnavailable) {
146
+ unavailable.push(key);
147
+ } else {
148
+ components.push({
149
+ key,
150
+ value: 0,
151
+ status: "missing",
152
+ weight: resolveWeight(component.weight)
153
+ });
154
+ }
155
+ continue;
156
+ }
157
+ const value = normalized.status === "stale" ? clampScore(normalized.value * config.staleMultiplier) : clampScore(normalized.value);
158
+ components.push({
159
+ key,
160
+ value,
161
+ status: normalized.status,
162
+ weight: resolveWeight(component.weight)
163
+ });
164
+ }
165
+ if (components.length === 0 && contributionMode !== HCS25_DEFAULT_CONTRIBUTION_MODE) {
166
+ const defaultKey = adapter.defaultComponentKey ?? `${adapter.id}.score`;
167
+ components.push({
168
+ key: defaultKey,
169
+ value: 0,
170
+ status: "missing",
171
+ weight: HCS25_DEFAULT_WEIGHT
172
+ });
173
+ }
174
+ }
175
+ let inDenominator = false;
176
+ if (applicable) {
177
+ inDenominator = contributionMode === "conditional" ? components.length > 0 : true;
178
+ if (weight === 0) {
179
+ inDenominator = false;
180
+ }
78
181
  }
79
182
  return {
80
- protocol: HCS26_PROTOCOL,
81
- operation: parsedOperation.data,
82
- topicType: parsedTopicType.data
183
+ adapterId: adapter.id,
184
+ contributionMode,
185
+ applicable,
186
+ inDenominator,
187
+ weight,
188
+ components,
189
+ unavailable,
190
+ total: adapterTotal(components, config.roundingDecimals)
83
191
  };
84
192
  }
85
- const hcs26TopicMemoSchema = z.string().transform((value) => {
86
- const parsed = parseHcs26TopicMemo(value);
87
- if (!parsed) {
88
- throw new Error("Invalid HCS-26 topic memo");
89
- }
90
- return parsed;
91
- });
92
- const hcs26TransactionMemoSchema = z.string().transform((value) => {
93
- const parsed = parseHcs26TransactionMemo(value);
94
- if (!parsed) {
95
- throw new Error("Invalid HCS-26 transaction memo");
96
- }
97
- return parsed;
98
- });
193
+ function normalizeComponent(normalized) {
194
+ if (!Number.isFinite(normalized.value)) {
195
+ return null;
196
+ }
197
+ if (normalized.status === "missing" || normalized.status === "timeout" || normalized.status === "error") {
198
+ return null;
199
+ }
200
+ return normalized;
201
+ }
202
+ function resolveWeight(weight) {
203
+ return weight ?? HCS25_DEFAULT_WEIGHT;
204
+ }
205
+ function adapterTotal(components, roundingDecimals) {
206
+ if (components.length === 0) {
207
+ return 0;
208
+ }
209
+ let weightedSum = 0;
210
+ let totalWeight = 0;
211
+ for (const component of components) {
212
+ weightedSum += component.value * component.weight;
213
+ totalWeight += component.weight;
214
+ }
215
+ const mean = totalWeight > 0 ? weightedSum / totalWeight : 0;
216
+ return roundScore(clampScore(mean), roundingDecimals);
217
+ }
218
+ function computeConfidence(denominator, totalWeight) {
219
+ if (totalWeight <= 0) {
220
+ return 0;
221
+ }
222
+ let weightedSum = 0;
223
+ for (const adapter of denominator) {
224
+ const okCount = adapter.components.filter(
225
+ (component) => component.status === "ok"
226
+ ).length;
227
+ const adapterConfidence = adapter.components.length > 0 ? okCount / adapter.components.length : 0;
228
+ weightedSum += adapter.weight * adapterConfidence;
229
+ }
230
+ return roundScore(weightedSum / totalWeight, 4);
231
+ }
99
232
  export {
100
- HCS26_DEFAULT_TTL_SECONDS,
101
- buildHcs26TopicMemo,
102
- buildHcs26TransactionMemo,
103
- hcs26TopicMemoSchema,
104
- hcs26TransactionMemoSchema,
105
- parseHcs26TopicMemo,
106
- parseHcs26TransactionMemo
233
+ clampScore,
234
+ compileScoringConfig,
235
+ computeTrustScore,
236
+ isAdapterApplicable,
237
+ roundScore
107
238
  };
108
239
  //# sourceMappingURL=standards-sdk.es119.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es119.js","sources":["../../src/hcs-26/memos.ts"],"sourcesContent":["import { z } from 'zod';\nimport {\n HCS26_PROTOCOL,\n hcs26OperationEnumSchema,\n hcs26TopicTypeEnumSchema,\n type Hcs26OperationEnum,\n type Hcs26TopicTypeEnum,\n} from './types';\n\nexport type Hcs26TopicMemo = {\n protocol: typeof HCS26_PROTOCOL;\n indexed: boolean;\n ttlSeconds: number;\n topicType: Hcs26TopicTypeEnum;\n};\n\nexport const HCS26_DEFAULT_TTL_SECONDS = 86400;\n\nfunction toPositiveInt(value: number): number {\n if (!Number.isFinite(value)) {\n throw new Error('Expected a finite number');\n }\n const intValue = Math.floor(value);\n if (intValue <= 0) {\n throw new Error('Expected a positive integer');\n }\n return intValue;\n}\n\nexport function buildHcs26TopicMemo(input: {\n indexed?: boolean;\n ttlSeconds?: number;\n topicType: Hcs26TopicTypeEnum;\n}): string {\n const indexed = input.indexed ?? true;\n const ttlSeconds = toPositiveInt(\n input.ttlSeconds ?? HCS26_DEFAULT_TTL_SECONDS,\n );\n const topicType = hcs26TopicTypeEnumSchema.parse(input.topicType);\n\n // HCS-2 memo convention: indexed topics use \"0\" in the second segment.\n const indexedSegment = indexed ? '0' : '1';\n return `${HCS26_PROTOCOL}:${indexedSegment}:${ttlSeconds}:${topicType}`;\n}\n\nexport function parseHcs26TopicMemo(memoRaw: string): Hcs26TopicMemo | null {\n const memo = memoRaw.trim();\n if (!memo) {\n return null;\n }\n\n const match = memo.match(/^hcs-26:(\\d+):(\\d+):(\\d+)$/);\n if (!match) {\n return null;\n }\n\n const indexedSegment = Number(match[1]);\n const ttlSeconds = Number(match[2]);\n const topicType = Number(match[3]);\n\n if (![indexedSegment, ttlSeconds, topicType].every(Number.isFinite)) {\n return null;\n }\n\n const parsedTopicType = hcs26TopicTypeEnumSchema.safeParse(topicType);\n if (!parsedTopicType.success) {\n return null;\n }\n\n if (indexedSegment !== 0 && indexedSegment !== 1) {\n return null;\n }\n\n return {\n protocol: HCS26_PROTOCOL,\n indexed: indexedSegment === 0,\n ttlSeconds,\n topicType: parsedTopicType.data,\n };\n}\n\nexport function buildHcs26TransactionMemo(input: {\n operation: Hcs26OperationEnum;\n topicType: Hcs26TopicTypeEnum;\n}): string {\n const operation = hcs26OperationEnumSchema.parse(input.operation);\n const topicType = hcs26TopicTypeEnumSchema.parse(input.topicType);\n return `${HCS26_PROTOCOL}:op:${operation}:${topicType}`;\n}\n\nexport type Hcs26TransactionMemo = {\n protocol: typeof HCS26_PROTOCOL;\n operation: Hcs26OperationEnum;\n topicType: Hcs26TopicTypeEnum;\n};\n\nexport function parseHcs26TransactionMemo(\n memoRaw: string,\n): Hcs26TransactionMemo | null {\n const memo = memoRaw.trim();\n if (!memo) {\n return null;\n }\n\n const match = memo.match(/^hcs-26:op:(\\d+):(\\d+)$/);\n if (!match) {\n return null;\n }\n\n const operation = Number(match[1]);\n const topicType = Number(match[2]);\n if (![operation, topicType].every(Number.isFinite)) {\n return null;\n }\n\n const parsedOperation = hcs26OperationEnumSchema.safeParse(operation);\n if (!parsedOperation.success) {\n return null;\n }\n const parsedTopicType = hcs26TopicTypeEnumSchema.safeParse(topicType);\n if (!parsedTopicType.success) {\n return null;\n }\n\n return {\n protocol: HCS26_PROTOCOL,\n operation: parsedOperation.data,\n topicType: parsedTopicType.data,\n };\n}\n\nexport const hcs26TopicMemoSchema = z.string().transform(value => {\n const parsed = parseHcs26TopicMemo(value);\n if (!parsed) {\n throw new Error('Invalid HCS-26 topic memo');\n }\n return parsed;\n});\n\nexport const hcs26TransactionMemoSchema = z.string().transform(value => {\n const parsed = parseHcs26TransactionMemo(value);\n if (!parsed) {\n throw new Error('Invalid HCS-26 transaction memo');\n }\n return parsed;\n});\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standards-sdk.es119.js","sources":["../../src/hcs-25/scoring.ts"],"sourcesContent":["import {\n isValidAdapterId,\n isValidComponentKey,\n isValidComponentName,\n} from './identifiers';\nimport {\n HCS25_DEFAULT_CONTRIBUTION_MODE,\n HCS25_DEFAULT_ROUNDING_DECIMALS,\n HCS25_DEFAULT_STALE_MULTIPLIER,\n HCS25_DEFAULT_WEIGHT,\n hcs25SignalSnapshotSchema,\n hcs25SubjectSchema,\n} from './types';\nimport type {\n Hcs25AdapterDefinition,\n Hcs25AdapterScore,\n Hcs25ComponentResult,\n Hcs25ContributionMode,\n Hcs25NormalizedValue,\n Hcs25ScoringConfig,\n Hcs25ScoringConfigInput,\n Hcs25SignalSnapshot,\n Hcs25Subject,\n Hcs25TrustScoreRecord,\n} from './types';\n\n/**\n * Clamps a finite component value into the HCS-25 range [0, 100].\n */\nexport function clampScore(value: number): number {\n return Math.min(100, Math.max(0, value));\n}\n\n/**\n * Rounds a value to a stable decimal precision (default 2, per HCS-25).\n */\nexport function roundScore(value: number, decimals = 2): number {\n const factor = 10 ** decimals;\n return Math.round(value * factor) / factor;\n}\n\n/**\n * Validates an adapter set and resolves configuration defaults. The returned\n * configuration is safe to pass to {@link computeTrustScore}.\n */\nexport function compileScoringConfig(\n input: Hcs25ScoringConfigInput,\n): Hcs25ScoringConfig {\n if (!Number.isInteger(input.version) || input.version < 0) {\n throw new TypeError(\n 'trustScoreConfigVersion must be a non-negative integer',\n );\n }\n\n if (!Array.isArray(input.adapters) || input.adapters.length === 0) {\n throw new TypeError('at least one trust adapter is required');\n }\n\n const seenAdapterIds = new Set<string>();\n for (const adapter of input.adapters) {\n validateAdapter(adapter, seenAdapterIds);\n seenAdapterIds.add(adapter.id);\n }\n\n const staleMultiplier =\n input.staleMultiplier ?? HCS25_DEFAULT_STALE_MULTIPLIER;\n if (\n !Number.isFinite(staleMultiplier) ||\n staleMultiplier < 0 ||\n staleMultiplier > 1\n ) {\n throw new TypeError('staleMultiplier must be a number in [0, 1]');\n }\n\n const roundingDecimals =\n input.roundingDecimals ?? HCS25_DEFAULT_ROUNDING_DECIMALS;\n if (\n !Number.isInteger(roundingDecimals) ||\n roundingDecimals < 0 ||\n roundingDecimals > 6\n ) {\n throw new TypeError('roundingDecimals must be an integer in [0, 6]');\n }\n\n return {\n version: input.version,\n adapters: input.adapters,\n staleMultiplier,\n roundingDecimals,\n computeConfidence: input.computeConfidence ?? false,\n };\n}\n\nfunction validateAdapter(\n adapter: Hcs25AdapterDefinition,\n seenAdapterIds: Set<string>,\n): void {\n if (typeof adapter.id !== 'string' || !isValidAdapterId(adapter.id)) {\n throw new TypeError(\n `invalid adapterId \"${String(adapter.id)}\": adapter identifiers must match ^[a-z][a-z0-9]*(-[a-z][a-z0-9]*)*$`,\n );\n }\n\n if (seenAdapterIds.has(adapter.id)) {\n throw new TypeError(\n `duplicate adapterId \"${adapter.id}\": adapter identifiers must be unique within a configuration`,\n );\n }\n\n if (\n adapter.weight !== undefined &&\n (!Number.isFinite(adapter.weight) || adapter.weight < 0)\n ) {\n throw new TypeError(\n `adapter \"${adapter.id}\" weight must be a finite non-negative number`,\n );\n }\n\n if (!Array.isArray(adapter.components) || adapter.components.length === 0) {\n throw new TypeError(\n `adapter \"${adapter.id}\" must declare at least one component`,\n );\n }\n\n if (\n adapter.defaultComponentKey !== undefined &&\n !isValidComponentKey(adapter.defaultComponentKey)\n ) {\n throw new TypeError(\n `adapter \"${adapter.id}\" defaultComponentKey must be a valid component key`,\n );\n }\n\n for (const component of adapter.components) {\n if (\n typeof component.name !== 'string' ||\n !isValidComponentName(component.name)\n ) {\n throw new TypeError(\n `adapter \"${adapter.id}\" component name \"${String(component.name)}\" is not a valid component key segment`,\n );\n }\n\n if (\n component.weight !== undefined &&\n (!Number.isFinite(component.weight) || component.weight < 0)\n ) {\n throw new TypeError(\n `adapter \"${adapter.id}\" component \"${component.name}\" weight must be a finite non-negative number`,\n );\n }\n\n if (typeof component.normalize !== 'function') {\n throw new TypeError(\n `adapter \"${adapter.id}\" component \"${component.name}\" must declare a normalize function`,\n );\n }\n }\n}\n\n/**\n * Evaluates adapter applicability against a subject using registry\n * include/exclude lists and the optional appliesTo predicate.\n */\nexport function isAdapterApplicable(\n adapter: Hcs25AdapterDefinition,\n subject: Hcs25Subject,\n): boolean {\n if (adapter.includeRegistries) {\n if (\n subject.registry === undefined ||\n !adapter.includeRegistries.includes(subject.registry)\n ) {\n return false;\n }\n }\n\n if (\n adapter.excludeRegistries &&\n subject.registry !== undefined &&\n adapter.excludeRegistries.includes(subject.registry)\n ) {\n return false;\n }\n\n if (adapter.appliesTo && !adapter.appliesTo(subject)) {\n return false;\n }\n\n return true;\n}\n\nexport interface Hcs25ComputeTrustScoreInput {\n subject: Hcs25Subject;\n snapshot: Hcs25SignalSnapshot;\n config: Hcs25ScoringConfigInput;\n now?: Date;\n}\n\n/**\n * Computes the composite AI Trust Score for a subject from a signal snapshot\n * and scoring configuration, following HCS-25 normalization, missing/stale\n * handling, applicability, and weighted-aggregation rules.\n */\nexport function computeTrustScore(\n input: Hcs25ComputeTrustScoreInput,\n): Hcs25TrustScoreRecord {\n const config = compileScoringConfig(input.config);\n const subject = hcs25SubjectSchema.parse(input.subject);\n const snapshot = hcs25SignalSnapshotSchema.parse(input.snapshot);\n const context = { subject, snapshot, config };\n\n const adapterScores: Hcs25AdapterScore[] = [];\n const trustScores: Record<string, number> = {};\n\n for (const adapter of config.adapters) {\n const adapterScore = scoreAdapter(adapter, subject, context, config);\n adapterScores.push(adapterScore);\n\n if (adapterScore.applicable) {\n for (const component of adapterScore.components) {\n trustScores[component.key] = component.value;\n }\n }\n }\n\n const denominator = adapterScores.filter(score => score.inDenominator);\n const totalWeight = denominator.reduce((sum, score) => sum + score.weight, 0);\n const weightedSum = denominator.reduce(\n (sum, score) => sum + score.total * score.weight,\n 0,\n );\n const total =\n totalWeight > 0\n ? roundScore(weightedSum / totalWeight, config.roundingDecimals)\n : 0;\n\n trustScores.total = total;\n\n const record: Hcs25TrustScoreRecord = {\n trustScore: total,\n trustScores,\n trustScoreConfigVersion: config.version,\n trustScoreUpdatedAt: (input.now ?? new Date()).toISOString(),\n breakdown: { adapters: adapterScores },\n };\n\n if (config.computeConfidence) {\n record.trustConfidence = computeConfidence(denominator, totalWeight);\n }\n\n return record;\n}\n\nfunction scoreAdapter(\n adapter: Hcs25AdapterDefinition,\n subject: Hcs25Subject,\n context: {\n subject: Hcs25Subject;\n snapshot: Hcs25SignalSnapshot;\n config: Hcs25ScoringConfig;\n },\n config: Hcs25ScoringConfig,\n): Hcs25AdapterScore {\n const weight = adapter.weight ?? HCS25_DEFAULT_WEIGHT;\n const contributionMode: Hcs25ContributionMode =\n adapter.contributionMode ?? HCS25_DEFAULT_CONTRIBUTION_MODE;\n const applicable = isAdapterApplicable(adapter, subject);\n\n const components: Hcs25ComponentResult[] = [];\n const unavailable: string[] = [];\n\n if (applicable) {\n for (const component of adapter.components) {\n const key = `${adapter.id}.${component.name}`;\n const normalized = normalizeComponent(component.normalize(context));\n\n if (normalized === null) {\n if (component.nonScorableWhenUnavailable) {\n unavailable.push(key);\n } else {\n components.push({\n key,\n value: 0,\n status: 'missing',\n weight: resolveWeight(component.weight),\n });\n }\n continue;\n }\n\n const value =\n normalized.status === 'stale'\n ? clampScore(normalized.value * config.staleMultiplier)\n : clampScore(normalized.value);\n\n components.push({\n key,\n value,\n status: normalized.status,\n weight: resolveWeight(component.weight),\n });\n }\n\n if (\n components.length === 0 &&\n contributionMode !== HCS25_DEFAULT_CONTRIBUTION_MODE\n ) {\n const defaultKey = adapter.defaultComponentKey ?? `${adapter.id}.score`;\n components.push({\n key: defaultKey,\n value: 0,\n status: 'missing',\n weight: HCS25_DEFAULT_WEIGHT,\n });\n }\n }\n\n let inDenominator = false;\n if (applicable) {\n inDenominator =\n contributionMode === 'conditional' ? components.length > 0 : true;\n if (weight === 0) {\n inDenominator = false;\n }\n }\n\n return {\n adapterId: adapter.id,\n contributionMode,\n applicable,\n inDenominator,\n weight,\n components,\n unavailable,\n total: adapterTotal(components, config.roundingDecimals),\n };\n}\n\nfunction normalizeComponent(\n normalized: Hcs25NormalizedValue,\n): Hcs25NormalizedValue | null {\n if (!Number.isFinite(normalized.value)) {\n return null;\n }\n\n if (\n normalized.status === 'missing' ||\n normalized.status === 'timeout' ||\n normalized.status === 'error'\n ) {\n return null;\n }\n\n return normalized;\n}\n\nfunction resolveWeight(weight: number | undefined): number {\n return weight ?? HCS25_DEFAULT_WEIGHT;\n}\n\nfunction adapterTotal(\n components: Hcs25ComponentResult[],\n roundingDecimals: number,\n): number {\n if (components.length === 0) {\n return 0;\n }\n\n let weightedSum = 0;\n let totalWeight = 0;\n for (const component of components) {\n weightedSum += component.value * component.weight;\n totalWeight += component.weight;\n }\n\n const mean = totalWeight > 0 ? weightedSum / totalWeight : 0;\n return roundScore(clampScore(mean), roundingDecimals);\n}\n\nfunction computeConfidence(\n denominator: Hcs25AdapterScore[],\n totalWeight: number,\n): number {\n if (totalWeight <= 0) {\n return 0;\n }\n\n let weightedSum = 0;\n for (const adapter of denominator) {\n const okCount = adapter.components.filter(\n component => component.status === 'ok',\n ).length;\n const adapterConfidence =\n adapter.components.length > 0 ? okCount / adapter.components.length : 0;\n weightedSum += adapter.weight * adapterConfidence;\n }\n\n return roundScore(weightedSum / totalWeight, 4);\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { buildTopicCreateTx, buildMessageTx } from "./standards-sdk.es160.js";
1
+ import { buildTopicCreateTx, buildMessageTx } from "./standards-sdk.es165.js";
2
2
  import { HCS7ConfigType, HCS7Operation } from "./standards-sdk.es8.js";
3
3
  function buildHcs7CreateRegistryTx(params) {
4
4
  const memo = `hcs-7:indexed:${params.ttl}`;