@hashgraphonline/standards-sdk 0.1.184 → 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.
- package/dist/browser/hcs-25/identifiers.d.ts +24 -0
- package/dist/browser/hcs-25/identifiers.d.ts.map +1 -0
- package/dist/browser/hcs-25/index.d.ts +4 -0
- package/dist/browser/hcs-25/index.d.ts.map +1 -0
- package/dist/browser/hcs-25/scoring.d.ts +32 -0
- package/dist/browser/hcs-25/scoring.d.ts.map +1 -0
- package/dist/browser/hcs-25/types.d.ts +363 -0
- package/dist/browser/hcs-25/types.d.ts.map +1 -0
- package/dist/browser/index.d.ts +1 -0
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser-root/hcs-25/identifiers.d.ts +24 -0
- package/dist/browser-root/hcs-25/identifiers.d.ts.map +1 -0
- package/dist/browser-root/hcs-25/index.d.ts +4 -0
- package/dist/browser-root/hcs-25/index.d.ts.map +1 -0
- package/dist/browser-root/hcs-25/scoring.d.ts +32 -0
- package/dist/browser-root/hcs-25/scoring.d.ts.map +1 -0
- package/dist/browser-root/hcs-25/types.d.ts +363 -0
- package/dist/browser-root/hcs-25/types.d.ts.map +1 -0
- package/dist/browser-root/index.d.ts +1 -0
- package/dist/browser-root/index.d.ts.map +1 -1
- package/dist/cjs/hcs-25/identifiers.d.ts +24 -0
- package/dist/cjs/hcs-25/identifiers.d.ts.map +1 -0
- package/dist/cjs/hcs-25/index.d.ts +4 -0
- package/dist/cjs/hcs-25/index.d.ts.map +1 -0
- package/dist/cjs/hcs-25/scoring.d.ts +32 -0
- package/dist/cjs/hcs-25/scoring.d.ts.map +1 -0
- package/dist/cjs/hcs-25/types.d.ts +363 -0
- package/dist/cjs/hcs-25/types.d.ts.map +1 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/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/identifiers.d.ts +24 -0
- package/dist/es/hcs-25/identifiers.d.ts.map +1 -0
- package/dist/es/hcs-25/index.d.ts +4 -0
- package/dist/es/hcs-25/index.d.ts.map +1 -0
- package/dist/es/hcs-25/scoring.d.ts +32 -0
- package/dist/es/hcs-25/scoring.d.ts.map +1 -0
- package/dist/es/hcs-25/types.d.ts +363 -0
- package/dist/es/hcs-25/types.d.ts.map +1 -0
- package/dist/es/index.d.ts +1 -0
- package/dist/es/index.d.ts.map +1 -1
- package/dist/es/standards-sdk.es.js +62 -40
- 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.es117.js +19 -251
- package/dist/es/standards-sdk.es117.js.map +1 -1
- package/dist/es/standards-sdk.es118.js +60 -475
- package/dist/es/standards-sdk.es118.js.map +1 -1
- package/dist/es/standards-sdk.es119.js +217 -86
- package/dist/es/standards-sdk.es119.js.map +1 -1
- package/dist/es/standards-sdk.es12.js +1 -1
- package/dist/es/standards-sdk.es120.js +242 -150
- package/dist/es/standards-sdk.es120.js.map +1 -1
- package/dist/es/standards-sdk.es121.js +470 -26
- package/dist/es/standards-sdk.es121.js.map +1 -1
- package/dist/es/standards-sdk.es122.js +103 -10
- package/dist/es/standards-sdk.es122.js.map +1 -1
- package/dist/es/standards-sdk.es123.js +145 -167
- package/dist/es/standards-sdk.es123.js.map +1 -1
- package/dist/es/standards-sdk.es124.js +30 -25
- package/dist/es/standards-sdk.es124.js.map +1 -1
- package/dist/es/standards-sdk.es125.js +10 -20
- package/dist/es/standards-sdk.es125.js.map +1 -1
- package/dist/es/standards-sdk.es126.js +159 -137
- package/dist/es/standards-sdk.es126.js.map +1 -1
- package/dist/es/standards-sdk.es127.js +27 -199
- package/dist/es/standards-sdk.es127.js.map +1 -1
- package/dist/es/standards-sdk.es128.js +15 -783
- package/dist/es/standards-sdk.es128.js.map +1 -1
- package/dist/es/standards-sdk.es129.js +157 -10
- 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 +198 -564
- package/dist/es/standards-sdk.es130.js.map +1 -1
- package/dist/es/standards-sdk.es131.js +703 -539
- package/dist/es/standards-sdk.es131.js.map +1 -1
- package/dist/es/standards-sdk.es132.js +12 -12
- package/dist/es/standards-sdk.es132.js.map +1 -1
- package/dist/es/standards-sdk.es133.js +567 -2
- package/dist/es/standards-sdk.es133.js.map +1 -1
- package/dist/es/standards-sdk.es134.js +610 -71
- package/dist/es/standards-sdk.es134.js.map +1 -1
- package/dist/es/standards-sdk.es135.js +12 -39
- package/dist/es/standards-sdk.es135.js.map +1 -1
- package/dist/es/standards-sdk.es136.js +2 -2
- package/dist/es/standards-sdk.es136.js.map +1 -1
- package/dist/es/standards-sdk.es137.js +42 -190
- package/dist/es/standards-sdk.es137.js.map +1 -1
- package/dist/es/standards-sdk.es138.js +39 -1139
- package/dist/es/standards-sdk.es138.js.map +1 -1
- package/dist/es/standards-sdk.es139.js +2 -306
- 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 +231 -418
- package/dist/es/standards-sdk.es140.js.map +1 -1
- package/dist/es/standards-sdk.es141.js +1135 -350
- package/dist/es/standards-sdk.es141.js.map +1 -1
- package/dist/es/standards-sdk.es142.js +268 -1084
- package/dist/es/standards-sdk.es142.js.map +1 -1
- package/dist/es/standards-sdk.es143.js +418 -204
- package/dist/es/standards-sdk.es143.js.map +1 -1
- package/dist/es/standards-sdk.es144.js +350 -1562
- package/dist/es/standards-sdk.es144.js.map +1 -1
- package/dist/es/standards-sdk.es145.js +1061 -1096
- package/dist/es/standards-sdk.es145.js.map +1 -1
- package/dist/es/standards-sdk.es146.js +204 -13
- package/dist/es/standards-sdk.es146.js.map +1 -1
- package/dist/es/standards-sdk.es147.js +1541 -233
- package/dist/es/standards-sdk.es147.js.map +1 -1
- package/dist/es/standards-sdk.es148.js +1157 -4
- package/dist/es/standards-sdk.es148.js.map +1 -1
- package/dist/es/standards-sdk.es149.js +15 -79
- 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 +250 -78
- package/dist/es/standards-sdk.es150.js.map +1 -1
- package/dist/es/standards-sdk.es151.js +4 -60
- package/dist/es/standards-sdk.es151.js.map +1 -1
- package/dist/es/standards-sdk.es152.js +80 -2546
- package/dist/es/standards-sdk.es152.js.map +1 -1
- package/dist/es/standards-sdk.es153.js +80 -152
- package/dist/es/standards-sdk.es153.js.map +1 -1
- package/dist/es/standards-sdk.es154.js +60 -7
- package/dist/es/standards-sdk.es154.js.map +1 -1
- package/dist/es/standards-sdk.es155.js +2547 -86
- package/dist/es/standards-sdk.es155.js.map +1 -1
- package/dist/es/standards-sdk.es156.js +144 -50
- package/dist/es/standards-sdk.es156.js.map +1 -1
- package/dist/es/standards-sdk.es157.js +7 -30
- package/dist/es/standards-sdk.es157.js.map +1 -1
- package/dist/es/standards-sdk.es158.js +86 -34
- package/dist/es/standards-sdk.es158.js.map +1 -1
- package/dist/es/standards-sdk.es159.js +65 -48
- package/dist/es/standards-sdk.es159.js.map +1 -1
- package/dist/es/standards-sdk.es16.js +5 -5
- package/dist/es/standards-sdk.es160.js +30 -138
- package/dist/es/standards-sdk.es160.js.map +1 -1
- package/dist/es/standards-sdk.es161.js +34 -42
- package/dist/es/standards-sdk.es161.js.map +1 -1
- package/dist/es/standards-sdk.es162.js +48 -12482
- package/dist/es/standards-sdk.es162.js.map +1 -1
- package/dist/es/standards-sdk.es163.js +12479 -53
- package/dist/es/standards-sdk.es163.js.map +1 -1
- package/dist/es/standards-sdk.es164.js +124 -97
- package/dist/es/standards-sdk.es164.js.map +1 -1
- package/dist/es/standards-sdk.es165.js +35 -74
- package/dist/es/standards-sdk.es165.js.map +1 -1
- package/dist/es/standards-sdk.es166.js +14 -197
- package/dist/es/standards-sdk.es166.js.map +1 -1
- package/dist/es/standards-sdk.es167.js +54 -15
- package/dist/es/standards-sdk.es167.js.map +1 -1
- package/dist/es/standards-sdk.es168.js +90 -651
- package/dist/es/standards-sdk.es168.js.map +1 -1
- package/dist/es/standards-sdk.es169.js +70 -161
- package/dist/es/standards-sdk.es169.js.map +1 -1
- package/dist/es/standards-sdk.es170.js +187 -309
- package/dist/es/standards-sdk.es170.js.map +1 -1
- package/dist/es/standards-sdk.es171.js +661 -335
- package/dist/es/standards-sdk.es171.js.map +1 -1
- package/dist/es/standards-sdk.es172.js +64 -444
- package/dist/es/standards-sdk.es172.js.map +1 -1
- package/dist/es/standards-sdk.es173.js +142 -301
- package/dist/es/standards-sdk.es173.js.map +1 -1
- package/dist/es/standards-sdk.es174.js +310 -64
- package/dist/es/standards-sdk.es174.js.map +1 -1
- package/dist/es/standards-sdk.es175.js +337 -64
- package/dist/es/standards-sdk.es175.js.map +1 -1
- package/dist/es/standards-sdk.es176.js +438 -124
- package/dist/es/standards-sdk.es176.js.map +1 -1
- package/dist/es/standards-sdk.es177.js +310 -496
- package/dist/es/standards-sdk.es177.js.map +1 -1
- package/dist/es/standards-sdk.es178.js +60 -243
- package/dist/es/standards-sdk.es178.js.map +1 -1
- package/dist/es/standards-sdk.es179.js +118 -175
- package/dist/es/standards-sdk.es179.js.map +1 -1
- package/dist/es/standards-sdk.es18.js +12 -12
- package/dist/es/standards-sdk.es180.js +465 -67
- package/dist/es/standards-sdk.es180.js.map +1 -1
- package/dist/es/standards-sdk.es181.js +250 -143
- package/dist/es/standards-sdk.es181.js.map +1 -1
- package/dist/es/standards-sdk.es182.js +172 -160
- package/dist/es/standards-sdk.es182.js.map +1 -1
- package/dist/es/standards-sdk.es183.js +65 -630
- package/dist/es/standards-sdk.es183.js.map +1 -1
- package/dist/es/standards-sdk.es184.js +128 -161
- package/dist/es/standards-sdk.es184.js.map +1 -1
- package/dist/es/standards-sdk.es185.js +144 -195
- package/dist/es/standards-sdk.es185.js.map +1 -1
- package/dist/es/standards-sdk.es186.js +668 -223
- package/dist/es/standards-sdk.es186.js.map +1 -1
- package/dist/es/standards-sdk.es187.js +188 -0
- package/dist/es/standards-sdk.es187.js.map +1 -0
- package/dist/es/standards-sdk.es188.js +238 -0
- package/dist/es/standards-sdk.es188.js.map +1 -0
- package/dist/es/standards-sdk.es189.js +242 -0
- package/dist/es/standards-sdk.es189.js.map +1 -0
- package/dist/es/standards-sdk.es19.js +9 -9
- package/dist/es/standards-sdk.es2.js +2 -2
- package/dist/es/standards-sdk.es20.js +1 -1
- package/dist/es/standards-sdk.es21.js +1 -1
- package/dist/es/standards-sdk.es22.js +1 -1
- package/dist/es/standards-sdk.es23.js +1 -1
- 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 +12 -12
- 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 +6 -6
- 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 +7 -7
- 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 +4 -4
- 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,481 +1,66 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
for (let index = 0; index < len; index += 1) {
|
|
40
|
-
const aId = a.prerelease[index];
|
|
41
|
-
const bId = b.prerelease[index];
|
|
42
|
-
if (aId === void 0 && bId !== void 0) return -1;
|
|
43
|
-
if (aId !== void 0 && bId === void 0) return 1;
|
|
44
|
-
if (aId === bId) continue;
|
|
45
|
-
if (typeof aId === "number" && typeof bId === "number") {
|
|
46
|
-
return aId - bId;
|
|
47
|
-
}
|
|
48
|
-
if (typeof aId === "number" && typeof bId === "string") {
|
|
49
|
-
return -1;
|
|
50
|
-
}
|
|
51
|
-
if (typeof aId === "string" && typeof bId === "number") {
|
|
52
|
-
return 1;
|
|
53
|
-
}
|
|
54
|
-
if (typeof aId === "string" && typeof bId === "string") {
|
|
55
|
-
return aId < bId ? -1 : 1;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return 0;
|
|
59
|
-
}
|
|
60
|
-
function isActiveStatus(status) {
|
|
61
|
-
return !status || status === "active";
|
|
62
|
-
}
|
|
63
|
-
function normalizeUidString(value) {
|
|
64
|
-
if (typeof value !== "string") {
|
|
65
|
-
return null;
|
|
66
|
-
}
|
|
67
|
-
const trimmed = value.trim();
|
|
68
|
-
return trimmed.length > 0 ? trimmed : null;
|
|
69
|
-
}
|
|
70
|
-
function resolveSequenceNumber(primary, fallback) {
|
|
71
|
-
if (typeof primary === "number") {
|
|
72
|
-
return primary;
|
|
73
|
-
}
|
|
74
|
-
if (typeof fallback === "number") {
|
|
75
|
-
return fallback;
|
|
76
|
-
}
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
function parseSequenceFromUid(uid) {
|
|
80
|
-
if (!/^\d+$/.test(uid)) {
|
|
81
|
-
return null;
|
|
82
|
-
}
|
|
83
|
-
const parsed = Number(uid);
|
|
84
|
-
return Number.isSafeInteger(parsed) ? parsed : null;
|
|
85
|
-
}
|
|
86
|
-
function ensureNonEmptyString(value, field) {
|
|
87
|
-
if (typeof value !== "string") {
|
|
88
|
-
throw new Error(`Expected ${field} to be a string`);
|
|
89
|
-
}
|
|
90
|
-
const trimmed = value.trim();
|
|
91
|
-
if (!trimmed) {
|
|
92
|
-
throw new Error(`Expected ${field} to be a non-empty string`);
|
|
93
|
-
}
|
|
94
|
-
return trimmed;
|
|
95
|
-
}
|
|
96
|
-
function mergeDiscoveryMetadata(base, update) {
|
|
97
|
-
if (!update) {
|
|
98
|
-
return base;
|
|
99
|
-
}
|
|
100
|
-
return { ...base, ...update };
|
|
101
|
-
}
|
|
102
|
-
function normalizeDiscoveryRegister(input, messageSequenceNumber) {
|
|
103
|
-
const seq = typeof input.sequence_number === "number" ? input.sequence_number : typeof messageSequenceNumber === "number" ? messageSequenceNumber : void 0;
|
|
104
|
-
if ("t_id" in input) {
|
|
105
|
-
return {
|
|
106
|
-
p: "hcs-26",
|
|
107
|
-
op: "register",
|
|
108
|
-
t_id: ensureNonEmptyString(input.t_id, "t_id"),
|
|
109
|
-
account_id: ensureNonEmptyString(input.account_id, "account_id"),
|
|
110
|
-
metadata: input.metadata,
|
|
111
|
-
...input.m ? { m: input.m } : {},
|
|
112
|
-
...typeof seq === "number" ? { sequence_number: seq } : {}
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
return {
|
|
116
|
-
p: "hcs-26",
|
|
117
|
-
op: "register",
|
|
118
|
-
t_id: ensureNonEmptyString(input.version_registry, "version_registry"),
|
|
119
|
-
account_id: ensureNonEmptyString(input.publisher, "publisher"),
|
|
120
|
-
metadata: input.metadata,
|
|
121
|
-
...input.m ? { m: input.m } : {},
|
|
122
|
-
...typeof seq === "number" ? { sequence_number: seq } : {}
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
class Hcs26SkillRegistryResolver {
|
|
126
|
-
constructor(deps) {
|
|
127
|
-
this.network = deps.network;
|
|
128
|
-
this.logger = deps.logger ?? Logger.getInstance({
|
|
129
|
-
module: "HCS26Resolver",
|
|
130
|
-
level: "info"
|
|
131
|
-
});
|
|
132
|
-
this.mirrorNode = new HederaMirrorNode(
|
|
133
|
-
deps.network,
|
|
134
|
-
this.logger,
|
|
135
|
-
deps.mirrorNode
|
|
136
|
-
);
|
|
137
|
-
this.hrlResolver = new HRLResolver("warn");
|
|
138
|
-
}
|
|
139
|
-
async resolveDiscoveryMetadataHrl(metadataHrl, mode) {
|
|
140
|
-
const resolved = await this.hrlResolver.resolve(metadataHrl, {
|
|
141
|
-
network: this.network,
|
|
142
|
-
returnRaw: true
|
|
143
|
-
});
|
|
144
|
-
const bytes = resolved.content instanceof ArrayBuffer ? Buffer.from(resolved.content) : Buffer.from(String(resolved.content), "utf8");
|
|
145
|
-
let raw;
|
|
146
|
-
try {
|
|
147
|
-
raw = JSON.parse(bytes.toString("utf8"));
|
|
148
|
-
} catch {
|
|
149
|
-
throw new Error("Discovery metadata HRL content is not valid JSON");
|
|
150
|
-
}
|
|
151
|
-
const schema = mode === "full" ? hcs26DiscoveryMetadataSchema : hcs26DiscoveryMetadataPatchSchema;
|
|
152
|
-
const parsed = schema.safeParse(raw);
|
|
153
|
-
if (!parsed.success) {
|
|
154
|
-
throw new Error(`Invalid discovery metadata: ${parsed.error.message}`);
|
|
155
|
-
}
|
|
156
|
-
return this.normalizeDiscoveryMetadataObject(
|
|
157
|
-
parsed.data
|
|
158
|
-
);
|
|
159
|
-
}
|
|
160
|
-
normalizeDiscoveryMetadataObject(metadata) {
|
|
161
|
-
if (typeof metadata.icon !== "string" || metadata.icon.trim().length === 0) {
|
|
162
|
-
const iconLegacy = metadata.icon_hcs1;
|
|
163
|
-
if (typeof iconLegacy === "string" && iconLegacy.trim().length > 0) {
|
|
164
|
-
return { ...metadata, icon: iconLegacy };
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
return metadata;
|
|
168
|
-
}
|
|
169
|
-
async resolveDiscoveryMetadataUri(metadataUri, mode) {
|
|
170
|
-
const trimmed = metadataUri.trim();
|
|
171
|
-
if (trimmed.startsWith("hcs://1/")) {
|
|
172
|
-
return this.resolveDiscoveryMetadataHrl(trimmed, mode);
|
|
173
|
-
}
|
|
174
|
-
throw new Error(`Unsupported discovery metadata URI: ${trimmed}`);
|
|
175
|
-
}
|
|
176
|
-
resolveDiscoveryMetadataObject(params) {
|
|
177
|
-
if (typeof params.metadata === "string") {
|
|
178
|
-
return this.resolveDiscoveryMetadataUri(params.metadata, params.mode);
|
|
179
|
-
}
|
|
180
|
-
const schema = params.mode === "full" ? hcs26DiscoveryMetadataSchema : hcs26DiscoveryMetadataPatchSchema;
|
|
181
|
-
const parsed = schema.safeParse(params.metadata);
|
|
182
|
-
if (!parsed.success) {
|
|
183
|
-
throw new Error(`Invalid discovery metadata: ${parsed.error.message}`);
|
|
184
|
-
}
|
|
185
|
-
return Promise.resolve(
|
|
186
|
-
this.normalizeDiscoveryMetadataObject(
|
|
187
|
-
parsed.data
|
|
188
|
-
)
|
|
189
|
-
);
|
|
190
|
-
}
|
|
191
|
-
async getDiscoveryRegister(params) {
|
|
192
|
-
const messages = await this.mirrorNode.getTopicMessages(
|
|
193
|
-
params.directoryTopicId,
|
|
194
|
-
{
|
|
195
|
-
sequenceNumber: `eq:${params.skillUid}`,
|
|
196
|
-
limit: 5,
|
|
197
|
-
order: "asc"
|
|
198
|
-
}
|
|
199
|
-
);
|
|
200
|
-
for (const message of messages) {
|
|
201
|
-
const parsedNew = hcs26DiscoveryRegisterSchema.safeParse(message);
|
|
202
|
-
const parsedLegacy = parsedNew.success ? null : hcs26DiscoveryRegisterLegacySchema.safeParse(message);
|
|
203
|
-
const parsed = parsedNew.success ? parsedNew : parsedLegacy && parsedLegacy.success ? parsedLegacy : null;
|
|
204
|
-
if (!parsed) {
|
|
205
|
-
continue;
|
|
206
|
-
}
|
|
207
|
-
const normalized = normalizeDiscoveryRegister(
|
|
208
|
-
parsed.data,
|
|
209
|
-
message.sequence_number
|
|
210
|
-
);
|
|
211
|
-
const seq = normalized.sequence_number;
|
|
212
|
-
if (typeof seq === "number" && seq === params.skillUid) {
|
|
213
|
-
const metadata = await this.resolveDiscoveryMetadataObject({
|
|
214
|
-
metadata: normalized.metadata,
|
|
215
|
-
mode: "full"
|
|
216
|
-
});
|
|
217
|
-
return { ...normalized, metadata };
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
return null;
|
|
221
|
-
}
|
|
222
|
-
async resolveDiscoveryRecord(params) {
|
|
223
|
-
const register = await this.getDiscoveryRegister({
|
|
224
|
-
directoryTopicId: params.directoryTopicId,
|
|
225
|
-
skillUid: params.skillUid
|
|
226
|
-
});
|
|
227
|
-
if (!register) {
|
|
228
|
-
return null;
|
|
229
|
-
}
|
|
230
|
-
const scanLimit = typeof params.scanLimit === "number" && params.scanLimit > 0 ? Math.min(5e3, Math.floor(params.scanLimit)) : 1e3;
|
|
231
|
-
const messages = await this.mirrorNode.getTopicMessages(
|
|
232
|
-
params.directoryTopicId,
|
|
233
|
-
{
|
|
234
|
-
limit: scanLimit,
|
|
235
|
-
order: "asc"
|
|
236
|
-
}
|
|
237
|
-
);
|
|
238
|
-
const uid = String(params.skillUid);
|
|
239
|
-
const registerSequence = resolveSequenceNumber(
|
|
240
|
-
register.sequence_number,
|
|
241
|
-
params.skillUid
|
|
242
|
-
);
|
|
243
|
-
let current = register;
|
|
244
|
-
for (const message of messages) {
|
|
245
|
-
const messageSequence = resolveSequenceNumber(
|
|
246
|
-
void 0,
|
|
247
|
-
message.sequence_number
|
|
248
|
-
);
|
|
249
|
-
const deleteParsed = hcs26DiscoveryDeleteSchema.safeParse(message);
|
|
250
|
-
if (deleteParsed.success && deleteParsed.data.uid === uid) {
|
|
251
|
-
const deleteSequence = resolveSequenceNumber(
|
|
252
|
-
deleteParsed.data.sequence_number,
|
|
253
|
-
messageSequence
|
|
254
|
-
);
|
|
255
|
-
if (registerSequence !== null && deleteSequence !== null && deleteSequence <= registerSequence) {
|
|
256
|
-
continue;
|
|
257
|
-
}
|
|
258
|
-
return null;
|
|
259
|
-
}
|
|
260
|
-
const updateParsedNew = hcs26DiscoveryUpdateSchema.safeParse(message);
|
|
261
|
-
const updateParsedLegacy = updateParsedNew.success ? null : hcs26DiscoveryUpdateLegacySchema.safeParse(message);
|
|
262
|
-
const updateParsed = updateParsedNew.success ? updateParsedNew : updateParsedLegacy && updateParsedLegacy.success ? updateParsedLegacy : null;
|
|
263
|
-
if (!updateParsed || updateParsed.data.uid !== uid) {
|
|
264
|
-
continue;
|
|
265
|
-
}
|
|
266
|
-
const updateSequence = resolveSequenceNumber(
|
|
267
|
-
updateParsed.data.sequence_number,
|
|
268
|
-
messageSequence
|
|
269
|
-
);
|
|
270
|
-
if (registerSequence !== null && updateSequence !== null && updateSequence <= registerSequence) {
|
|
271
|
-
continue;
|
|
272
|
-
}
|
|
273
|
-
const nextAccountId = "account_id" in updateParsed.data ? normalizeUidString(updateParsed.data.account_id) : normalizeUidString(updateParsed.data.publisher);
|
|
274
|
-
const nextMetadataRaw = updateParsed.data.metadata;
|
|
275
|
-
const nextMetadata = nextMetadataRaw !== void 0 ? await this.resolveDiscoveryMetadataObject({
|
|
276
|
-
metadata: nextMetadataRaw,
|
|
277
|
-
mode: "patch"
|
|
278
|
-
}) : void 0;
|
|
279
|
-
current = {
|
|
280
|
-
...current,
|
|
281
|
-
...nextAccountId ? { account_id: nextAccountId } : {},
|
|
282
|
-
metadata: mergeDiscoveryMetadata(current.metadata, nextMetadata)
|
|
283
|
-
};
|
|
284
|
-
}
|
|
285
|
-
return current;
|
|
286
|
-
}
|
|
287
|
-
async listVersionRegisters(params) {
|
|
288
|
-
const limit = typeof params.limit === "number" && params.limit > 0 ? Math.min(1e3, params.limit) : 500;
|
|
289
|
-
const messages = await this.mirrorNode.getTopicMessages(
|
|
290
|
-
params.versionRegistryTopicId,
|
|
291
|
-
{
|
|
292
|
-
limit,
|
|
293
|
-
order: "desc"
|
|
294
|
-
}
|
|
295
|
-
);
|
|
296
|
-
const registersByUid = /* @__PURE__ */ new Map();
|
|
297
|
-
const updatesByUid = /* @__PURE__ */ new Map();
|
|
298
|
-
const deletedByUid = /* @__PURE__ */ new Map();
|
|
299
|
-
for (const message of messages) {
|
|
300
|
-
const parsedNew = hcs26VersionRegisterSchema.safeParse(message);
|
|
301
|
-
const parsedLegacy = parsedNew.success ? null : hcs26VersionRegisterLegacySchema.safeParse(message);
|
|
302
|
-
const registerParsed = parsedNew.success ? parsedNew : parsedLegacy && parsedLegacy.success ? parsedLegacy : null;
|
|
303
|
-
if (registerParsed) {
|
|
304
|
-
if (registerParsed.data.skill_uid !== params.skillUid) {
|
|
305
|
-
continue;
|
|
306
|
-
}
|
|
307
|
-
const uid = typeof registerParsed.data.sequence_number === "number" ? String(registerParsed.data.sequence_number) : typeof message.sequence_number === "number" ? String(message.sequence_number) : null;
|
|
308
|
-
if (uid) {
|
|
309
|
-
const registerSequence = resolveSequenceNumber(
|
|
310
|
-
registerParsed.data.sequence_number,
|
|
311
|
-
message.sequence_number
|
|
312
|
-
);
|
|
313
|
-
registersByUid.set(uid, {
|
|
314
|
-
register: registerParsed.data,
|
|
315
|
-
sequenceNumber: registerSequence
|
|
316
|
-
});
|
|
317
|
-
}
|
|
318
|
-
continue;
|
|
319
|
-
}
|
|
320
|
-
const updateParsed = hcs26VersionUpdateSchema.safeParse(message);
|
|
321
|
-
if (updateParsed.success) {
|
|
322
|
-
const uid = updateParsed.data.uid.trim();
|
|
323
|
-
const list = updatesByUid.get(uid) ?? [];
|
|
324
|
-
list.push({
|
|
325
|
-
update: updateParsed.data,
|
|
326
|
-
sequenceNumber: resolveSequenceNumber(
|
|
327
|
-
updateParsed.data.sequence_number,
|
|
328
|
-
message.sequence_number
|
|
329
|
-
)
|
|
330
|
-
});
|
|
331
|
-
updatesByUid.set(uid, list);
|
|
332
|
-
continue;
|
|
333
|
-
}
|
|
334
|
-
const deleteParsed = hcs26VersionDeleteSchema.safeParse(message);
|
|
335
|
-
if (deleteParsed.success) {
|
|
336
|
-
const uid = deleteParsed.data.uid.trim();
|
|
337
|
-
const list = deletedByUid.get(uid) ?? [];
|
|
338
|
-
const sequenceNumber = resolveSequenceNumber(
|
|
339
|
-
deleteParsed.data.sequence_number,
|
|
340
|
-
message.sequence_number
|
|
341
|
-
);
|
|
342
|
-
if (sequenceNumber !== null) {
|
|
343
|
-
list.push(sequenceNumber);
|
|
344
|
-
deletedByUid.set(uid, list);
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
const entries = [];
|
|
349
|
-
for (const [uid, registerState] of registersByUid.entries()) {
|
|
350
|
-
const registerSequence = registerState.sequenceNumber ?? parseSequenceFromUid(uid);
|
|
351
|
-
const deleteSequences = deletedByUid.get(uid) ?? [];
|
|
352
|
-
const hasDeleteAfterRegister = deleteSequences.some(
|
|
353
|
-
(sequence) => registerSequence === null ? true : sequence > registerSequence
|
|
354
|
-
);
|
|
355
|
-
if (hasDeleteAfterRegister) {
|
|
356
|
-
continue;
|
|
357
|
-
}
|
|
358
|
-
const updates = updatesByUid.get(uid);
|
|
359
|
-
if (!updates || updates.length === 0) {
|
|
360
|
-
entries.push(registerState.register);
|
|
361
|
-
continue;
|
|
362
|
-
}
|
|
363
|
-
const sorted = [...updates].filter(
|
|
364
|
-
(update) => registerSequence === null ? true : update.sequenceNumber !== null && update.sequenceNumber > registerSequence
|
|
365
|
-
).sort((a, b) => {
|
|
366
|
-
const aSeq = a.sequenceNumber ?? 0;
|
|
367
|
-
const bSeq = b.sequenceNumber ?? 0;
|
|
368
|
-
return aSeq - bSeq;
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { isValidSignalId } from "./standards-sdk.es117.js";
|
|
3
|
+
const hcs25JsonValueSchema = z.lazy(
|
|
4
|
+
() => z.union([
|
|
5
|
+
z.string(),
|
|
6
|
+
z.number(),
|
|
7
|
+
z.boolean(),
|
|
8
|
+
z.null(),
|
|
9
|
+
z.array(hcs25JsonValueSchema),
|
|
10
|
+
z.record(z.string(), hcs25JsonValueSchema)
|
|
11
|
+
])
|
|
12
|
+
);
|
|
13
|
+
const hcs25SignalStatusSchema = z.enum([
|
|
14
|
+
"ok",
|
|
15
|
+
"missing",
|
|
16
|
+
"timeout",
|
|
17
|
+
"error",
|
|
18
|
+
"stale"
|
|
19
|
+
]);
|
|
20
|
+
const hcs25SignalProvenanceSchema = z.object({
|
|
21
|
+
source: z.string().min(1).optional(),
|
|
22
|
+
sourceUrl: z.string().min(1).optional(),
|
|
23
|
+
subjectId: z.string().min(1).optional(),
|
|
24
|
+
fetchedAt: z.string().min(1).optional(),
|
|
25
|
+
params: z.record(z.string(), hcs25JsonValueSchema).optional()
|
|
26
|
+
}).passthrough();
|
|
27
|
+
const hcs25SignalSchema = z.object({
|
|
28
|
+
status: hcs25SignalStatusSchema,
|
|
29
|
+
value: hcs25JsonValueSchema.optional(),
|
|
30
|
+
fetchedAt: z.string().min(1).optional(),
|
|
31
|
+
provenance: hcs25SignalProvenanceSchema.optional()
|
|
32
|
+
}).passthrough();
|
|
33
|
+
const hcs25SignalSnapshotSchema = z.record(z.string(), hcs25SignalSchema).superRefine((snapshot, ctx) => {
|
|
34
|
+
for (const key of Object.keys(snapshot)) {
|
|
35
|
+
if (!isValidSignalId(key)) {
|
|
36
|
+
ctx.addIssue({
|
|
37
|
+
code: z.ZodIssueCode.custom,
|
|
38
|
+
message: `invalid signal identifier "${key}": signal identifiers must be namespaced, e.g. "provider.metric"`
|
|
369
39
|
});
|
|
370
|
-
if (sorted.length === 0) {
|
|
371
|
-
entries.push(registerState.register);
|
|
372
|
-
continue;
|
|
373
|
-
}
|
|
374
|
-
const final = sorted.reduce((acc, updateState) => {
|
|
375
|
-
if (updateState.update.status) {
|
|
376
|
-
return { ...acc, status: updateState.update.status };
|
|
377
|
-
}
|
|
378
|
-
return acc;
|
|
379
|
-
}, registerState.register);
|
|
380
|
-
entries.push(final);
|
|
381
|
-
}
|
|
382
|
-
return entries;
|
|
383
|
-
}
|
|
384
|
-
async getLatestVersionRegister(params) {
|
|
385
|
-
const entries = await this.listVersionRegisters({
|
|
386
|
-
versionRegistryTopicId: params.versionRegistryTopicId,
|
|
387
|
-
skillUid: params.skillUid,
|
|
388
|
-
limit: 100
|
|
389
|
-
});
|
|
390
|
-
const active = entries.filter((entry) => isActiveStatus(entry.status));
|
|
391
|
-
if (active.length === 0) {
|
|
392
|
-
return null;
|
|
393
|
-
}
|
|
394
|
-
let best = active[0];
|
|
395
|
-
let bestParsed = parseSemver(best.version);
|
|
396
|
-
for (let index = 1; index < active.length; index += 1) {
|
|
397
|
-
const candidate = active[index];
|
|
398
|
-
const candidateParsed = parseSemver(candidate.version);
|
|
399
|
-
if (!bestParsed && candidateParsed) {
|
|
400
|
-
best = candidate;
|
|
401
|
-
bestParsed = candidateParsed;
|
|
402
|
-
continue;
|
|
403
|
-
}
|
|
404
|
-
if (bestParsed && candidateParsed) {
|
|
405
|
-
const cmp = compareSemver(candidateParsed, bestParsed);
|
|
406
|
-
if (cmp > 0) {
|
|
407
|
-
best = candidate;
|
|
408
|
-
bestParsed = candidateParsed;
|
|
409
|
-
continue;
|
|
410
|
-
}
|
|
411
|
-
if (cmp === 0) {
|
|
412
|
-
const bestSeq = typeof best.sequence_number === "number" ? best.sequence_number : 0;
|
|
413
|
-
const candSeq = typeof candidate.sequence_number === "number" ? candidate.sequence_number : 0;
|
|
414
|
-
if (candSeq > bestSeq) {
|
|
415
|
-
best = candidate;
|
|
416
|
-
bestParsed = candidateParsed;
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
return best;
|
|
422
|
-
}
|
|
423
|
-
async resolveManifest(params) {
|
|
424
|
-
const manifestHrl = typeof params.manifestHrl === "string" && params.manifestHrl.trim().length > 0 ? params.manifestHrl.trim() : typeof params.manifestTopicId === "string" && params.manifestTopicId.trim().length > 0 ? `hcs://1/${params.manifestTopicId.trim()}` : null;
|
|
425
|
-
if (!manifestHrl) {
|
|
426
|
-
throw new Error("Manifest HRL or topic id is required");
|
|
427
|
-
}
|
|
428
|
-
const resolved = await this.hrlResolver.resolve(manifestHrl, {
|
|
429
|
-
network: this.network,
|
|
430
|
-
returnRaw: true
|
|
431
|
-
});
|
|
432
|
-
const contentType = resolved.contentType ?? "";
|
|
433
|
-
if (!contentType.toLowerCase().startsWith("application/json")) {
|
|
434
|
-
throw new Error(
|
|
435
|
-
`Expected application/json for manifest, got ${resolved.contentType ?? "unknown"}`
|
|
436
|
-
);
|
|
437
|
-
}
|
|
438
|
-
const bytes = resolved.content instanceof ArrayBuffer ? Buffer.from(resolved.content) : Buffer.from(String(resolved.content), "utf8");
|
|
439
|
-
const sha256Hex = await hash(bytes, "sha256");
|
|
440
|
-
let raw;
|
|
441
|
-
try {
|
|
442
|
-
raw = JSON.parse(bytes.toString("utf8"));
|
|
443
|
-
} catch {
|
|
444
|
-
throw new Error("Manifest content is not valid JSON");
|
|
445
|
-
}
|
|
446
|
-
const parsed = hcs26SkillManifestSchema.safeParse(raw);
|
|
447
|
-
if (!parsed.success) {
|
|
448
|
-
throw new Error(`Invalid HCS-26 manifest: ${parsed.error.message}`);
|
|
449
|
-
}
|
|
450
|
-
const hasSkillMd = parsed.data.files.some((file) => file.path === "SKILL.md");
|
|
451
|
-
if (!hasSkillMd) {
|
|
452
|
-
throw new Error(
|
|
453
|
-
'HCS-26 manifest must include SKILL.md at path "SKILL.md"'
|
|
454
|
-
);
|
|
455
|
-
}
|
|
456
|
-
return { manifest: parsed.data, raw, sha256Hex };
|
|
457
|
-
}
|
|
458
|
-
async verifyVersionRegisterMatchesManifest(params) {
|
|
459
|
-
const checksumRaw = params.versionRegister.checksum;
|
|
460
|
-
if (!checksumRaw) {
|
|
461
|
-
this.logger.warn(
|
|
462
|
-
"HCS-26 version register is missing checksum; skipping manifest verification."
|
|
463
|
-
);
|
|
464
|
-
return;
|
|
465
|
-
}
|
|
466
|
-
const checksum = checksumRaw.trim();
|
|
467
|
-
if (!checksum.startsWith("sha256:")) {
|
|
468
|
-
throw new Error(`Unsupported checksum: ${checksum}`);
|
|
469
|
-
}
|
|
470
|
-
const expectedHex = checksum.slice("sha256:".length);
|
|
471
|
-
if (params.manifestSha256Hex !== expectedHex) {
|
|
472
|
-
throw new Error(
|
|
473
|
-
`Manifest checksum mismatch (expected ${expectedHex}, got ${params.manifestSha256Hex})`
|
|
474
|
-
);
|
|
475
40
|
}
|
|
476
41
|
}
|
|
477
|
-
}
|
|
42
|
+
});
|
|
43
|
+
const hcs25SubjectSchema = z.object({
|
|
44
|
+
id: z.string().min(1),
|
|
45
|
+
registry: z.string().min(1).optional(),
|
|
46
|
+
protocol: z.string().min(1).optional(),
|
|
47
|
+
class: z.string().min(1).optional(),
|
|
48
|
+
metadata: z.record(z.string(), hcs25JsonValueSchema).optional()
|
|
49
|
+
}).passthrough();
|
|
50
|
+
const HCS25_DEFAULT_WEIGHT = 1;
|
|
51
|
+
const HCS25_DEFAULT_CONTRIBUTION_MODE = "conditional";
|
|
52
|
+
const HCS25_DEFAULT_STALE_MULTIPLIER = 1;
|
|
53
|
+
const HCS25_DEFAULT_ROUNDING_DECIMALS = 2;
|
|
478
54
|
export {
|
|
479
|
-
|
|
55
|
+
HCS25_DEFAULT_CONTRIBUTION_MODE,
|
|
56
|
+
HCS25_DEFAULT_ROUNDING_DECIMALS,
|
|
57
|
+
HCS25_DEFAULT_STALE_MULTIPLIER,
|
|
58
|
+
HCS25_DEFAULT_WEIGHT,
|
|
59
|
+
hcs25JsonValueSchema,
|
|
60
|
+
hcs25SignalProvenanceSchema,
|
|
61
|
+
hcs25SignalSchema,
|
|
62
|
+
hcs25SignalSnapshotSchema,
|
|
63
|
+
hcs25SignalStatusSchema,
|
|
64
|
+
hcs25SubjectSchema
|
|
480
65
|
};
|
|
481
66
|
//# sourceMappingURL=standards-sdk.es118.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es118.js","sources":["../../src/hcs-26/resolver.ts"],"sourcesContent":["import { Logger, type ILogger } from '../utils/logger';\nimport { HederaMirrorNode } from '../services/mirror-node';\nimport { HRLResolver } from '../utils/hrl-resolver';\nimport type { MirrorNodeConfig } from '../services/mirror-node';\nimport { hash } from '../utils/crypto-abstraction';\nimport {\n hcs26DiscoveryRegisterSchema,\n hcs26DiscoveryRegisterLegacySchema,\n hcs26DiscoveryMetadataSchema,\n hcs26DiscoveryMetadataPatchSchema,\n hcs26DiscoveryUpdateSchema,\n hcs26DiscoveryUpdateLegacySchema,\n hcs26DiscoveryDeleteSchema,\n hcs26SkillManifestSchema,\n hcs26VersionRegisterSchema,\n hcs26VersionRegisterLegacySchema,\n hcs26VersionUpdateSchema,\n hcs26VersionDeleteSchema,\n type HCS26Network,\n type Hcs26DiscoveryRegister,\n type Hcs26DiscoveryRegisterLegacy,\n type Hcs26SkillManifest,\n type Hcs26VersionRegister,\n type Hcs26VersionRegisterLegacy,\n type Hcs26VersionUpdate,\n} from './types';\n\ntype Hcs26ResolverDeps = {\n network: HCS26Network;\n logger?: ILogger;\n mirrorNode?: MirrorNodeConfig;\n};\n\ntype ParsedSemver = {\n major: number;\n minor: number;\n patch: number;\n prerelease: (string | number)[];\n};\n\nfunction parseSemver(versionRaw: string): ParsedSemver | null {\n const trimmed = versionRaw.trim().replace(/^v/i, '');\n const match = trimmed.match(\n /^(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?(?:\\+[0-9A-Za-z.-]+)?$/,\n );\n if (!match) {\n return null;\n }\n\n const major = Number(match[1]);\n const minor = Number(match[2]);\n const patch = Number(match[3]);\n if (![major, minor, patch].every(Number.isFinite)) {\n return null;\n }\n\n const prereleaseRaw = match[4];\n const prerelease = prereleaseRaw\n ? prereleaseRaw.split('.').map(part => {\n if (/^(0|[1-9]\\d*)$/.test(part)) {\n return Number(part);\n }\n return part;\n })\n : [];\n\n return { major, minor, patch, prerelease };\n}\n\nfunction compareSemver(a: ParsedSemver, b: ParsedSemver): number {\n if (a.major !== b.major) return a.major - b.major;\n if (a.minor !== b.minor) return a.minor - b.minor;\n if (a.patch !== b.patch) return a.patch - b.patch;\n\n const aHasPre = a.prerelease.length > 0;\n const bHasPre = b.prerelease.length > 0;\n if (!aHasPre && bHasPre) return 1;\n if (aHasPre && !bHasPre) return -1;\n if (!aHasPre && !bHasPre) return 0;\n\n const len = Math.max(a.prerelease.length, b.prerelease.length);\n for (let index = 0; index < len; index += 1) {\n const aId = a.prerelease[index];\n const bId = b.prerelease[index];\n if (aId === undefined && bId !== undefined) return -1;\n if (aId !== undefined && bId === undefined) return 1;\n if (aId === bId) continue;\n\n if (typeof aId === 'number' && typeof bId === 'number') {\n return aId - bId;\n }\n if (typeof aId === 'number' && typeof bId === 'string') {\n return -1;\n }\n if (typeof aId === 'string' && typeof bId === 'number') {\n return 1;\n }\n if (typeof aId === 'string' && typeof bId === 'string') {\n return aId < bId ? -1 : 1;\n }\n }\n\n return 0;\n}\n\nfunction isActiveStatus(\n status: (Hcs26VersionRegister | Hcs26VersionRegisterLegacy)['status'],\n): boolean {\n return !status || status === 'active';\n}\n\nfunction normalizeUidString(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction resolveSequenceNumber(\n primary: unknown,\n fallback: unknown,\n): number | null {\n if (typeof primary === 'number') {\n return primary;\n }\n if (typeof fallback === 'number') {\n return fallback;\n }\n return null;\n}\n\nfunction parseSequenceFromUid(uid: string): number | null {\n if (!/^\\d+$/.test(uid)) {\n return null;\n }\n const parsed = Number(uid);\n return Number.isSafeInteger(parsed) ? parsed : null;\n}\n\nfunction ensureNonEmptyString(value: unknown, field: string): string {\n if (typeof value !== 'string') {\n throw new Error(`Expected ${field} to be a string`);\n }\n const trimmed = value.trim();\n if (!trimmed) {\n throw new Error(`Expected ${field} to be a non-empty string`);\n }\n return trimmed;\n}\n\ntype NormalizedDiscoveryRegister = {\n p: 'hcs-26';\n op: 'register';\n t_id: string;\n account_id: string;\n metadata: Record<string, unknown>;\n m?: string;\n sequence_number?: number;\n};\n\ntype NormalizedDiscoveryRegisterRaw = Omit<\n NormalizedDiscoveryRegister,\n 'metadata'\n> & {\n metadata: Record<string, unknown> | string;\n};\n\nfunction mergeDiscoveryMetadata(\n base: Record<string, unknown>,\n update?: Record<string, unknown>,\n): Record<string, unknown> {\n if (!update) {\n return base;\n }\n return { ...base, ...update };\n}\n\nfunction normalizeDiscoveryRegister(\n input: Hcs26DiscoveryRegister | Hcs26DiscoveryRegisterLegacy,\n messageSequenceNumber?: number,\n): NormalizedDiscoveryRegisterRaw {\n const seq =\n typeof input.sequence_number === 'number'\n ? input.sequence_number\n : typeof messageSequenceNumber === 'number'\n ? messageSequenceNumber\n : undefined;\n\n if ('t_id' in input) {\n return {\n p: 'hcs-26',\n op: 'register',\n t_id: ensureNonEmptyString(input.t_id, 't_id'),\n account_id: ensureNonEmptyString(input.account_id, 'account_id'),\n metadata: input.metadata,\n ...(input.m ? { m: input.m } : {}),\n ...(typeof seq === 'number' ? { sequence_number: seq } : {}),\n };\n }\n\n return {\n p: 'hcs-26',\n op: 'register',\n t_id: ensureNonEmptyString(input.version_registry, 'version_registry'),\n account_id: ensureNonEmptyString(input.publisher, 'publisher'),\n metadata: input.metadata,\n ...(input.m ? { m: input.m } : {}),\n ...(typeof seq === 'number' ? { sequence_number: seq } : {}),\n };\n}\n\nexport class Hcs26SkillRegistryResolver {\n private readonly logger: ILogger;\n private readonly mirrorNode: HederaMirrorNode;\n private readonly hrlResolver: HRLResolver;\n private readonly network: HCS26Network;\n\n constructor(deps: Hcs26ResolverDeps) {\n this.network = deps.network;\n this.logger =\n deps.logger ??\n Logger.getInstance({\n module: 'HCS26Resolver',\n level: 'info',\n });\n this.mirrorNode = new HederaMirrorNode(\n deps.network,\n this.logger,\n deps.mirrorNode,\n );\n this.hrlResolver = new HRLResolver('warn');\n }\n\n private async resolveDiscoveryMetadataHrl(\n metadataHrl: string,\n mode: 'full' | 'patch',\n ): Promise<Record<string, unknown>> {\n const resolved = await this.hrlResolver.resolve(metadataHrl, {\n network: this.network,\n returnRaw: true,\n });\n\n const bytes =\n resolved.content instanceof ArrayBuffer\n ? Buffer.from(resolved.content)\n : Buffer.from(String(resolved.content), 'utf8');\n\n let raw: unknown;\n try {\n raw = JSON.parse(bytes.toString('utf8'));\n } catch {\n throw new Error('Discovery metadata HRL content is not valid JSON');\n }\n\n const schema =\n mode === 'full'\n ? hcs26DiscoveryMetadataSchema\n : hcs26DiscoveryMetadataPatchSchema;\n const parsed = schema.safeParse(raw);\n if (!parsed.success) {\n throw new Error(`Invalid discovery metadata: ${parsed.error.message}`);\n }\n return this.normalizeDiscoveryMetadataObject(\n parsed.data as unknown as Record<string, unknown>,\n );\n }\n\n private normalizeDiscoveryMetadataObject(\n metadata: Record<string, unknown>,\n ): Record<string, unknown> {\n if (\n typeof metadata.icon !== 'string' ||\n metadata.icon.trim().length === 0\n ) {\n const iconLegacy = metadata.icon_hcs1;\n if (typeof iconLegacy === 'string' && iconLegacy.trim().length > 0) {\n return { ...metadata, icon: iconLegacy };\n }\n }\n return metadata;\n }\n\n private async resolveDiscoveryMetadataUri(\n metadataUri: string,\n mode: 'full' | 'patch',\n ): Promise<Record<string, unknown>> {\n const trimmed = metadataUri.trim();\n if (trimmed.startsWith('hcs://1/')) {\n return this.resolveDiscoveryMetadataHrl(trimmed, mode);\n }\n throw new Error(`Unsupported discovery metadata URI: ${trimmed}`);\n }\n\n private resolveDiscoveryMetadataObject(params: {\n metadata: unknown;\n mode: 'full' | 'patch';\n }): Promise<Record<string, unknown>> {\n if (typeof params.metadata === 'string') {\n return this.resolveDiscoveryMetadataUri(params.metadata, params.mode);\n }\n\n const schema =\n params.mode === 'full'\n ? hcs26DiscoveryMetadataSchema\n : hcs26DiscoveryMetadataPatchSchema;\n const parsed = schema.safeParse(params.metadata);\n if (!parsed.success) {\n throw new Error(`Invalid discovery metadata: ${parsed.error.message}`);\n }\n return Promise.resolve(\n this.normalizeDiscoveryMetadataObject(\n parsed.data as unknown as Record<string, unknown>,\n ),\n );\n }\n\n async getDiscoveryRegister(params: {\n directoryTopicId: string;\n skillUid: number;\n }): Promise<NormalizedDiscoveryRegister | null> {\n const messages = await this.mirrorNode.getTopicMessages(\n params.directoryTopicId,\n {\n sequenceNumber: `eq:${params.skillUid}`,\n limit: 5,\n order: 'asc',\n },\n );\n\n for (const message of messages) {\n const parsedNew = hcs26DiscoveryRegisterSchema.safeParse(message);\n const parsedLegacy = parsedNew.success\n ? null\n : hcs26DiscoveryRegisterLegacySchema.safeParse(message);\n const parsed = parsedNew.success\n ? parsedNew\n : parsedLegacy && parsedLegacy.success\n ? parsedLegacy\n : null;\n if (!parsed) {\n continue;\n }\n\n const normalized = normalizeDiscoveryRegister(\n parsed.data as Hcs26DiscoveryRegister | Hcs26DiscoveryRegisterLegacy,\n message.sequence_number,\n );\n const seq = normalized.sequence_number;\n if (typeof seq === 'number' && seq === params.skillUid) {\n const metadata = await this.resolveDiscoveryMetadataObject({\n metadata: normalized.metadata,\n mode: 'full',\n });\n return { ...normalized, metadata };\n }\n }\n\n return null;\n }\n\n async resolveDiscoveryRecord(params: {\n directoryTopicId: string;\n skillUid: number;\n scanLimit?: number;\n }): Promise<NormalizedDiscoveryRegister | null> {\n const register = await this.getDiscoveryRegister({\n directoryTopicId: params.directoryTopicId,\n skillUid: params.skillUid,\n });\n if (!register) {\n return null;\n }\n\n const scanLimit =\n typeof params.scanLimit === 'number' && params.scanLimit > 0\n ? Math.min(5000, Math.floor(params.scanLimit))\n : 1000;\n\n const messages = await this.mirrorNode.getTopicMessages(\n params.directoryTopicId,\n {\n limit: scanLimit,\n order: 'asc',\n },\n );\n\n const uid = String(params.skillUid);\n const registerSequence = resolveSequenceNumber(\n register.sequence_number,\n params.skillUid,\n );\n\n let current: NormalizedDiscoveryRegister = register;\n for (const message of messages) {\n const messageSequence = resolveSequenceNumber(\n undefined,\n message.sequence_number,\n );\n const deleteParsed = hcs26DiscoveryDeleteSchema.safeParse(message);\n if (deleteParsed.success && deleteParsed.data.uid === uid) {\n const deleteSequence = resolveSequenceNumber(\n deleteParsed.data.sequence_number,\n messageSequence,\n );\n if (\n registerSequence !== null &&\n deleteSequence !== null &&\n deleteSequence <= registerSequence\n ) {\n continue;\n }\n return null;\n }\n\n const updateParsedNew = hcs26DiscoveryUpdateSchema.safeParse(message);\n const updateParsedLegacy = updateParsedNew.success\n ? null\n : hcs26DiscoveryUpdateLegacySchema.safeParse(message);\n const updateParsed = updateParsedNew.success\n ? updateParsedNew\n : updateParsedLegacy && updateParsedLegacy.success\n ? updateParsedLegacy\n : null;\n if (!updateParsed || updateParsed.data.uid !== uid) {\n continue;\n }\n const updateSequence = resolveSequenceNumber(\n updateParsed.data.sequence_number,\n messageSequence,\n );\n if (\n registerSequence !== null &&\n updateSequence !== null &&\n updateSequence <= registerSequence\n ) {\n continue;\n }\n\n const nextAccountId =\n 'account_id' in updateParsed.data\n ? normalizeUidString(updateParsed.data.account_id)\n : normalizeUidString(updateParsed.data.publisher);\n const nextMetadataRaw = updateParsed.data.metadata;\n const nextMetadata =\n nextMetadataRaw !== undefined\n ? await this.resolveDiscoveryMetadataObject({\n metadata: nextMetadataRaw,\n mode: 'patch',\n })\n : undefined;\n current = {\n ...current,\n ...(nextAccountId ? { account_id: nextAccountId } : {}),\n metadata: mergeDiscoveryMetadata(current.metadata, nextMetadata),\n };\n }\n\n return current;\n }\n\n async listVersionRegisters(params: {\n versionRegistryTopicId: string;\n skillUid: number;\n limit?: number;\n }): Promise<Array<Hcs26VersionRegister | Hcs26VersionRegisterLegacy>> {\n const limit =\n typeof params.limit === 'number' && params.limit > 0\n ? Math.min(1000, params.limit)\n : 500;\n const messages = await this.mirrorNode.getTopicMessages(\n params.versionRegistryTopicId,\n {\n limit,\n order: 'desc',\n },\n );\n\n const registersByUid = new Map<\n string,\n {\n register: Hcs26VersionRegister | Hcs26VersionRegisterLegacy;\n sequenceNumber: number | null;\n }\n >();\n const updatesByUid = new Map<\n string,\n Array<{ update: Hcs26VersionUpdate; sequenceNumber: number | null }>\n >();\n const deletedByUid = new Map<string, number[]>();\n\n for (const message of messages) {\n const parsedNew = hcs26VersionRegisterSchema.safeParse(message);\n const parsedLegacy = parsedNew.success\n ? null\n : hcs26VersionRegisterLegacySchema.safeParse(message);\n const registerParsed = parsedNew.success\n ? parsedNew\n : parsedLegacy && parsedLegacy.success\n ? parsedLegacy\n : null;\n\n if (registerParsed) {\n if (registerParsed.data.skill_uid !== params.skillUid) {\n continue;\n }\n const uid =\n typeof registerParsed.data.sequence_number === 'number'\n ? String(registerParsed.data.sequence_number)\n : typeof message.sequence_number === 'number'\n ? String(message.sequence_number)\n : null;\n if (uid) {\n const registerSequence = resolveSequenceNumber(\n registerParsed.data.sequence_number,\n message.sequence_number,\n );\n registersByUid.set(uid, {\n register: registerParsed.data as\n | Hcs26VersionRegister\n | Hcs26VersionRegisterLegacy,\n sequenceNumber: registerSequence,\n });\n }\n continue;\n }\n\n const updateParsed = hcs26VersionUpdateSchema.safeParse(message);\n if (updateParsed.success) {\n const uid = updateParsed.data.uid.trim();\n const list = updatesByUid.get(uid) ?? [];\n list.push({\n update: updateParsed.data,\n sequenceNumber: resolveSequenceNumber(\n updateParsed.data.sequence_number,\n message.sequence_number,\n ),\n });\n updatesByUid.set(uid, list);\n continue;\n }\n\n const deleteParsed = hcs26VersionDeleteSchema.safeParse(message);\n if (deleteParsed.success) {\n const uid = deleteParsed.data.uid.trim();\n const list = deletedByUid.get(uid) ?? [];\n const sequenceNumber = resolveSequenceNumber(\n deleteParsed.data.sequence_number,\n message.sequence_number,\n );\n if (sequenceNumber !== null) {\n list.push(sequenceNumber);\n deletedByUid.set(uid, list);\n }\n }\n }\n\n const entries: Array<Hcs26VersionRegister | Hcs26VersionRegisterLegacy> =\n [];\n for (const [uid, registerState] of registersByUid.entries()) {\n const registerSequence =\n registerState.sequenceNumber ?? parseSequenceFromUid(uid);\n const deleteSequences = deletedByUid.get(uid) ?? [];\n const hasDeleteAfterRegister = deleteSequences.some(sequence =>\n registerSequence === null ? true : sequence > registerSequence,\n );\n if (hasDeleteAfterRegister) {\n continue;\n }\n\n const updates = updatesByUid.get(uid);\n if (!updates || updates.length === 0) {\n entries.push(registerState.register);\n continue;\n }\n\n const sorted = [...updates]\n .filter(update =>\n registerSequence === null\n ? true\n : update.sequenceNumber !== null &&\n update.sequenceNumber > registerSequence,\n )\n .sort((a, b) => {\n const aSeq = a.sequenceNumber ?? 0;\n const bSeq = b.sequenceNumber ?? 0;\n return aSeq - bSeq;\n });\n if (sorted.length === 0) {\n entries.push(registerState.register);\n continue;\n }\n\n const final = sorted.reduce<\n Hcs26VersionRegister | Hcs26VersionRegisterLegacy\n >((acc, updateState) => {\n if (updateState.update.status) {\n return { ...acc, status: updateState.update.status };\n }\n return acc;\n }, registerState.register);\n entries.push(final);\n }\n\n return entries;\n }\n\n async getLatestVersionRegister(params: {\n versionRegistryTopicId: string;\n skillUid: number;\n }): Promise<(Hcs26VersionRegister | Hcs26VersionRegisterLegacy) | null> {\n const entries = await this.listVersionRegisters({\n versionRegistryTopicId: params.versionRegistryTopicId,\n skillUid: params.skillUid,\n limit: 100,\n });\n const active = entries.filter(entry => isActiveStatus(entry.status));\n if (active.length === 0) {\n return null;\n }\n\n let best = active[0];\n let bestParsed = parseSemver(best.version);\n\n for (let index = 1; index < active.length; index += 1) {\n const candidate = active[index];\n const candidateParsed = parseSemver(candidate.version);\n\n if (!bestParsed && candidateParsed) {\n best = candidate;\n bestParsed = candidateParsed;\n continue;\n }\n\n if (bestParsed && candidateParsed) {\n const cmp = compareSemver(candidateParsed, bestParsed);\n if (cmp > 0) {\n best = candidate;\n bestParsed = candidateParsed;\n continue;\n }\n\n if (cmp === 0) {\n const bestSeq =\n typeof best.sequence_number === 'number' ? best.sequence_number : 0;\n const candSeq =\n typeof candidate.sequence_number === 'number'\n ? candidate.sequence_number\n : 0;\n if (candSeq > bestSeq) {\n best = candidate;\n bestParsed = candidateParsed;\n }\n }\n }\n }\n\n return best;\n }\n\n async resolveManifest(params: {\n manifestHrl?: string;\n manifestTopicId?: string;\n }): Promise<{\n manifest: Hcs26SkillManifest;\n raw: unknown;\n sha256Hex: string;\n }> {\n const manifestHrl =\n typeof params.manifestHrl === 'string' &&\n params.manifestHrl.trim().length > 0\n ? params.manifestHrl.trim()\n : typeof params.manifestTopicId === 'string' &&\n params.manifestTopicId.trim().length > 0\n ? `hcs://1/${params.manifestTopicId.trim()}`\n : null;\n if (!manifestHrl) {\n throw new Error('Manifest HRL or topic id is required');\n }\n\n const resolved = await this.hrlResolver.resolve(manifestHrl, {\n network: this.network,\n returnRaw: true,\n });\n\n const contentType = resolved.contentType ?? '';\n if (!contentType.toLowerCase().startsWith('application/json')) {\n throw new Error(\n `Expected application/json for manifest, got ${resolved.contentType ?? 'unknown'}`,\n );\n }\n\n const bytes =\n resolved.content instanceof ArrayBuffer\n ? Buffer.from(resolved.content)\n : Buffer.from(String(resolved.content), 'utf8');\n\n const sha256Hex = await hash(bytes, 'sha256');\n\n let raw: unknown;\n try {\n raw = JSON.parse(bytes.toString('utf8'));\n } catch {\n throw new Error('Manifest content is not valid JSON');\n }\n\n const parsed = hcs26SkillManifestSchema.safeParse(raw);\n if (!parsed.success) {\n throw new Error(`Invalid HCS-26 manifest: ${parsed.error.message}`);\n }\n\n const hasSkillMd = parsed.data.files.some(file => file.path === 'SKILL.md');\n if (!hasSkillMd) {\n throw new Error(\n 'HCS-26 manifest must include SKILL.md at path \"SKILL.md\"',\n );\n }\n\n return { manifest: parsed.data, raw, sha256Hex };\n }\n\n async verifyVersionRegisterMatchesManifest(params: {\n versionRegister: Hcs26VersionRegister | Hcs26VersionRegisterLegacy;\n manifestSha256Hex: string;\n }): Promise<void> {\n const checksumRaw = params.versionRegister.checksum;\n if (!checksumRaw) {\n this.logger.warn(\n 'HCS-26 version register is missing checksum; skipping manifest verification.',\n );\n return;\n }\n\n const checksum = checksumRaw.trim();\n if (!checksum.startsWith('sha256:')) {\n throw new Error(`Unsupported checksum: ${checksum}`);\n }\n const expectedHex = checksum.slice('sha256:'.length);\n if (params.manifestSha256Hex !== expectedHex) {\n throw new Error(\n `Manifest checksum mismatch (expected ${expectedHex}, got ${params.manifestSha256Hex})`,\n );\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"standards-sdk.es118.js","sources":["../../src/hcs-25/types.ts"],"sourcesContent":["import { z } from 'zod';\n\nimport { isValidSignalId } from './identifiers';\n\n/**\n * JSON-compatible value carried by a trust signal.\n */\nexport type Hcs25JsonValue =\n | string\n | number\n | boolean\n | null\n | Hcs25JsonValue[]\n | { [key: string]: Hcs25JsonValue };\n\nexport const hcs25JsonValueSchema: z.ZodType<Hcs25JsonValue> = z.lazy(() =>\n z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.null(),\n z.array(hcs25JsonValueSchema),\n z.record(z.string(), hcs25JsonValueSchema),\n ]),\n);\n\n/**\n * Signal status codes defined by HCS-25.\n */\nexport const hcs25SignalStatusSchema = z.enum([\n 'ok',\n 'missing',\n 'timeout',\n 'error',\n 'stale',\n]);\n\nexport type Hcs25SignalStatus = z.infer<typeof hcs25SignalStatusSchema>;\n\n/**\n * Optional provenance describing where a signal came from.\n */\nexport const hcs25SignalProvenanceSchema = z\n .object({\n source: z.string().min(1).optional(),\n sourceUrl: z.string().min(1).optional(),\n subjectId: z.string().min(1).optional(),\n fetchedAt: z.string().min(1).optional(),\n params: z.record(z.string(), hcs25JsonValueSchema).optional(),\n })\n .passthrough();\n\nexport type Hcs25SignalProvenance = z.infer<typeof hcs25SignalProvenanceSchema>;\n\n/**\n * A single trust signal: a stable identifier-keyed measurement with a status\n * and optional provenance.\n */\nexport const hcs25SignalSchema = z\n .object({\n status: hcs25SignalStatusSchema,\n value: hcs25JsonValueSchema.optional(),\n fetchedAt: z.string().min(1).optional(),\n provenance: hcs25SignalProvenanceSchema.optional(),\n })\n .passthrough();\n\nexport type Hcs25Signal = z.infer<typeof hcs25SignalSchema>;\n\n/**\n * The set of trust signals currently known for a subject, keyed by namespaced\n * signal identifier.\n */\nexport const hcs25SignalSnapshotSchema = z\n .record(z.string(), hcs25SignalSchema)\n .superRefine((snapshot, ctx) => {\n for (const key of Object.keys(snapshot)) {\n if (!isValidSignalId(key)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `invalid signal identifier \"${key}\": signal identifiers must be namespaced, e.g. \"provider.metric\"`,\n });\n }\n }\n });\n\nexport type Hcs25SignalSnapshot = Record<string, Hcs25Signal>;\n\n/**\n * The AI system being scored.\n */\nexport const hcs25SubjectSchema = z\n .object({\n id: z.string().min(1),\n registry: z.string().min(1).optional(),\n protocol: z.string().min(1).optional(),\n class: z.string().min(1).optional(),\n metadata: z.record(z.string(), hcs25JsonValueSchema).optional(),\n })\n .passthrough();\n\nexport type Hcs25Subject = z.infer<typeof hcs25SubjectSchema>;\n\n/**\n * Adapter participation policy in the composite denominator.\n */\nexport type Hcs25ContributionMode = 'universal' | 'scoped' | 'conditional';\n\n/**\n * Output of an adapter component normalization function.\n */\nexport interface Hcs25NormalizedValue {\n value: number;\n status: Hcs25SignalStatus;\n}\n\n/**\n * Inputs available to adapter normalization functions.\n */\nexport interface Hcs25NormalizationContext {\n subject: Hcs25Subject;\n snapshot: Hcs25SignalSnapshot;\n config: Hcs25ScoringConfig;\n}\n\n/**\n * Applicability constraints shared by adapters.\n */\nexport interface Hcs25ApplicabilityRule {\n includeRegistries?: readonly string[];\n excludeRegistries?: readonly string[];\n appliesTo?: (subject: Hcs25Subject) => boolean;\n}\n\n/**\n * A deterministic scoring function that maps one signal into one normalized\n * component.\n */\nexport interface Hcs25ComponentDefinition {\n name: string;\n weight?: number;\n nonScorableWhenUnavailable?: boolean;\n normalize: (context: Hcs25NormalizationContext) => Hcs25NormalizedValue;\n}\n\n/**\n * A trust score adapter: deterministic, CPU-bound, and explainable.\n */\nexport interface Hcs25AdapterDefinition extends Hcs25ApplicabilityRule {\n id: string;\n weight?: number;\n contributionMode?: Hcs25ContributionMode;\n defaultComponentKey?: string;\n components: readonly Hcs25ComponentDefinition[];\n}\n\n/**\n * Scoring configuration as provided by the caller; defaults are resolved by\n * {@link compileScoringConfig}.\n */\nexport interface Hcs25ScoringConfigInput {\n version: number;\n adapters: readonly Hcs25AdapterDefinition[];\n staleMultiplier?: number;\n roundingDecimals?: number;\n computeConfidence?: boolean;\n}\n\n/**\n * Validated scoring configuration with defaults resolved.\n */\nexport interface Hcs25ScoringConfig {\n version: number;\n adapters: readonly Hcs25AdapterDefinition[];\n staleMultiplier: number;\n roundingDecimals: number;\n computeConfidence: boolean;\n}\n\nexport const HCS25_DEFAULT_WEIGHT = 1;\nexport const HCS25_DEFAULT_CONTRIBUTION_MODE: Hcs25ContributionMode =\n 'conditional';\nexport const HCS25_DEFAULT_STALE_MULTIPLIER = 1;\nexport const HCS25_DEFAULT_ROUNDING_DECIMALS = 2;\n\n/**\n * One normalized component emitted by an adapter.\n */\nexport interface Hcs25ComponentResult {\n key: string;\n value: number;\n status: Hcs25SignalStatus;\n weight: number;\n}\n\n/**\n * Per-adapter scoring breakdown.\n */\nexport interface Hcs25AdapterScore {\n adapterId: string;\n contributionMode: Hcs25ContributionMode;\n applicable: boolean;\n inDenominator: boolean;\n weight: number;\n components: Hcs25ComponentResult[];\n unavailable: string[];\n total: number;\n}\n\n/**\n * The HCS-25 score record emitted for a subject.\n */\nexport interface Hcs25TrustScoreRecord {\n trustScore: number;\n trustScores: Record<string, number>;\n trustScoreConfigVersion: number;\n trustScoreUpdatedAt: string;\n trustConfidence?: number;\n breakdown: {\n adapters: Hcs25AdapterScore[];\n };\n}\n"],"names":[],"mappings":";;AAeO,MAAM,uBAAkD,EAAE;AAAA,EAAK,MACpE,EAAE,MAAM;AAAA,IACN,EAAE,OAAA;AAAA,IACF,EAAE,OAAA;AAAA,IACF,EAAE,QAAA;AAAA,IACF,EAAE,KAAA;AAAA,IACF,EAAE,MAAM,oBAAoB;AAAA,IAC5B,EAAE,OAAO,EAAE,OAAA,GAAU,oBAAoB;AAAA,EAAA,CAC1C;AACH;AAKO,MAAM,0BAA0B,EAAE,KAAK;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAOM,MAAM,8BAA8B,EACxC,OAAO;AAAA,EACN,QAAQ,EAAE,OAAA,EAAS,IAAI,CAAC,EAAE,SAAA;AAAA,EAC1B,WAAW,EAAE,OAAA,EAAS,IAAI,CAAC,EAAE,SAAA;AAAA,EAC7B,WAAW,EAAE,OAAA,EAAS,IAAI,CAAC,EAAE,SAAA;AAAA,EAC7B,WAAW,EAAE,OAAA,EAAS,IAAI,CAAC,EAAE,SAAA;AAAA,EAC7B,QAAQ,EAAE,OAAO,EAAE,UAAU,oBAAoB,EAAE,SAAA;AACrD,CAAC,EACA,YAAA;AAQI,MAAM,oBAAoB,EAC9B,OAAO;AAAA,EACN,QAAQ;AAAA,EACR,OAAO,qBAAqB,SAAA;AAAA,EAC5B,WAAW,EAAE,OAAA,EAAS,IAAI,CAAC,EAAE,SAAA;AAAA,EAC7B,YAAY,4BAA4B,SAAA;AAC1C,CAAC,EACA,YAAA;AAQI,MAAM,4BAA4B,EACtC,OAAO,EAAE,OAAA,GAAU,iBAAiB,EACpC,YAAY,CAAC,UAAU,QAAQ;AAC9B,aAAW,OAAO,OAAO,KAAK,QAAQ,GAAG;AACvC,QAAI,CAAC,gBAAgB,GAAG,GAAG;AACzB,UAAI,SAAS;AAAA,QACX,MAAM,EAAE,aAAa;AAAA,QACrB,SAAS,8BAA8B,GAAG;AAAA,MAAA,CAC3C;AAAA,IACH;AAAA,EACF;AACF,CAAC;AAOI,MAAM,qBAAqB,EAC/B,OAAO;AAAA,EACN,IAAI,EAAE,SAAS,IAAI,CAAC;AAAA,EACpB,UAAU,EAAE,OAAA,EAAS,IAAI,CAAC,EAAE,SAAA;AAAA,EAC5B,UAAU,EAAE,OAAA,EAAS,IAAI,CAAC,EAAE,SAAA;AAAA,EAC5B,OAAO,EAAE,OAAA,EAAS,IAAI,CAAC,EAAE,SAAA;AAAA,EACzB,UAAU,EAAE,OAAO,EAAE,UAAU,oBAAoB,EAAE,SAAA;AACvD,CAAC,EACA,YAAA;AAgFI,MAAM,uBAAuB;AAC7B,MAAM,kCACX;AACK,MAAM,iCAAiC;AACvC,MAAM,kCAAkC;"}
|