@veraanchor/verifier 0.0.0-stage → 0.1.0
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/CHANGELOG.md +22 -0
- package/CONTRIBUTING.md +33 -0
- package/LICENSE +21 -0
- package/NOTICE +4 -0
- package/README.md +263 -2
- package/SECURITY.md +21 -0
- package/dist/cli/commandV1.d.ts +5 -0
- package/dist/cli/commandV1.d.ts.map +1 -0
- package/dist/cli/commandV1.js +440 -0
- package/dist/cli/commandV1.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +5 -0
- package/dist/cli.js.map +1 -0
- package/dist/contracts/verification.d.ts +77 -0
- package/dist/contracts/verification.d.ts.map +1 -0
- package/dist/contracts/verification.js +6 -0
- package/dist/contracts/verification.js.map +1 -0
- package/dist/crypto/sha3.d.ts +15 -0
- package/dist/crypto/sha3.d.ts.map +1 -0
- package/dist/crypto/sha3.js +27 -0
- package/dist/crypto/sha3.js.map +1 -0
- package/dist/crypto/streamSha3.d.ts +26 -0
- package/dist/crypto/streamSha3.d.ts.map +1 -0
- package/dist/crypto/streamSha3.js +52 -0
- package/dist/crypto/streamSha3.js.map +1 -0
- package/dist/hf/hashContractV1.d.ts +48 -0
- package/dist/hf/hashContractV1.d.ts.map +1 -0
- package/dist/hf/hashContractV1.js +185 -0
- package/dist/hf/hashContractV1.js.map +1 -0
- package/dist/index.d.ts +80 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/merkle/membership.d.ts +30 -0
- package/dist/merkle/membership.d.ts.map +1 -0
- package/dist/merkle/membership.js +105 -0
- package/dist/merkle/membership.js.map +1 -0
- package/dist/policy/contractV1.d.ts +37 -0
- package/dist/policy/contractV1.d.ts.map +1 -0
- package/dist/policy/contractV1.js +2 -0
- package/dist/policy/contractV1.js.map +1 -0
- package/dist/policy/evaluateV1.d.ts +24 -0
- package/dist/policy/evaluateV1.d.ts.map +1 -0
- package/dist/policy/evaluateV1.js +320 -0
- package/dist/policy/evaluateV1.js.map +1 -0
- package/dist/profiles/dataset/sourceV1.d.ts +22 -0
- package/dist/profiles/dataset/sourceV1.d.ts.map +1 -0
- package/dist/profiles/dataset/sourceV1.js +73 -0
- package/dist/profiles/dataset/sourceV1.js.map +1 -0
- package/dist/profiles/dataset/v1.d.ts +39 -0
- package/dist/profiles/dataset/v1.d.ts.map +1 -0
- package/dist/profiles/dataset/v1.js +362 -0
- package/dist/profiles/dataset/v1.js.map +1 -0
- package/dist/profiles/execution/contractV1.d.ts +279 -0
- package/dist/profiles/execution/contractV1.d.ts.map +1 -0
- package/dist/profiles/execution/contractV1.js +364 -0
- package/dist/profiles/execution/contractV1.js.map +1 -0
- package/dist/profiles/execution/independentStandardsV1.d.ts +44 -0
- package/dist/profiles/execution/independentStandardsV1.d.ts.map +1 -0
- package/dist/profiles/execution/independentStandardsV1.js +336 -0
- package/dist/profiles/execution/independentStandardsV1.js.map +1 -0
- package/dist/profiles/execution/reasonCodesV1.d.ts +30 -0
- package/dist/profiles/execution/reasonCodesV1.d.ts.map +1 -0
- package/dist/profiles/execution/reasonCodesV1.js +20 -0
- package/dist/profiles/execution/reasonCodesV1.js.map +1 -0
- package/dist/profiles/execution/recomputationV1.d.ts +11 -0
- package/dist/profiles/execution/recomputationV1.d.ts.map +1 -0
- package/dist/profiles/execution/recomputationV1.js +144 -0
- package/dist/profiles/execution/recomputationV1.js.map +1 -0
- package/dist/profiles/execution/rulesV1.d.ts +6 -0
- package/dist/profiles/execution/rulesV1.d.ts.map +1 -0
- package/dist/profiles/execution/rulesV1.js +855 -0
- package/dist/profiles/execution/rulesV1.js.map +1 -0
- package/dist/profiles/execution/standardsPlanV1.d.ts +18 -0
- package/dist/profiles/execution/standardsPlanV1.d.ts.map +1 -0
- package/dist/profiles/execution/standardsPlanV1.js +16 -0
- package/dist/profiles/execution/standardsPlanV1.js.map +1 -0
- package/dist/profiles/execution/verificationV1.d.ts +28 -0
- package/dist/profiles/execution/verificationV1.d.ts.map +1 -0
- package/dist/profiles/execution/verificationV1.js +188 -0
- package/dist/profiles/execution/verificationV1.js.map +1 -0
- package/dist/profiles/ingest/sourceV1.d.ts +36 -0
- package/dist/profiles/ingest/sourceV1.d.ts.map +1 -0
- package/dist/profiles/ingest/sourceV1.js +99 -0
- package/dist/profiles/ingest/sourceV1.js.map +1 -0
- package/dist/profiles/ingest/v1.d.ts +65 -0
- package/dist/profiles/ingest/v1.d.ts.map +1 -0
- package/dist/profiles/ingest/v1.js +477 -0
- package/dist/profiles/ingest/v1.js.map +1 -0
- package/dist/profiles/sourceV1Helpers.d.ts +48 -0
- package/dist/profiles/sourceV1Helpers.d.ts.map +1 -0
- package/dist/profiles/sourceV1Helpers.js +141 -0
- package/dist/profiles/sourceV1Helpers.js.map +1 -0
- package/dist/reports/coreV1.d.ts +7 -0
- package/dist/reports/coreV1.d.ts.map +1 -0
- package/dist/reports/coreV1.js +195 -0
- package/dist/reports/coreV1.js.map +1 -0
- package/dist/reports/portableV1.d.ts +48 -0
- package/dist/reports/portableV1.d.ts.map +1 -0
- package/dist/reports/portableV1.js +279 -0
- package/dist/reports/portableV1.js.map +1 -0
- package/dist/reports/validationV1.d.ts +19 -0
- package/dist/reports/validationV1.d.ts.map +1 -0
- package/dist/reports/validationV1.js +441 -0
- package/dist/reports/validationV1.js.map +1 -0
- package/dist/resolvers/executionMirrorV1.d.ts +15 -0
- package/dist/resolvers/executionMirrorV1.d.ts.map +1 -0
- package/dist/resolvers/executionMirrorV1.js +206 -0
- package/dist/resolvers/executionMirrorV1.js.map +1 -0
- package/dist/resolvers/explorerExecutionV1.d.ts +17 -0
- package/dist/resolvers/explorerExecutionV1.d.ts.map +1 -0
- package/dist/resolvers/explorerExecutionV1.js +61 -0
- package/dist/resolvers/explorerExecutionV1.js.map +1 -0
- package/dist/resolvers/explorerPublicV1.d.ts +37 -0
- package/dist/resolvers/explorerPublicV1.d.ts.map +1 -0
- package/dist/resolvers/explorerPublicV1.js +210 -0
- package/dist/resolvers/explorerPublicV1.js.map +1 -0
- package/dist/resolvers/explorerPublicationV1.d.ts +20 -0
- package/dist/resolvers/explorerPublicationV1.d.ts.map +1 -0
- package/dist/resolvers/explorerPublicationV1.js +195 -0
- package/dist/resolvers/explorerPublicationV1.js.map +1 -0
- package/dist/resolvers/explorerTransportV1.d.ts +17 -0
- package/dist/resolvers/explorerTransportV1.d.ts.map +1 -0
- package/dist/resolvers/explorerTransportV1.js +112 -0
- package/dist/resolvers/explorerTransportV1.js.map +1 -0
- package/dist/resolvers/hcs11MirrorV1.d.ts +49 -0
- package/dist/resolvers/hcs11MirrorV1.d.ts.map +1 -0
- package/dist/resolvers/hcs11MirrorV1.js +293 -0
- package/dist/resolvers/hcs11MirrorV1.js.map +1 -0
- package/dist/resolvers/hcs13MirrorV1.d.ts +35 -0
- package/dist/resolvers/hcs13MirrorV1.d.ts.map +1 -0
- package/dist/resolvers/hcs13MirrorV1.js +72 -0
- package/dist/resolvers/hcs13MirrorV1.js.map +1 -0
- package/dist/resolvers/hcs1MirrorV1.d.ts +28 -0
- package/dist/resolvers/hcs1MirrorV1.d.ts.map +1 -0
- package/dist/resolvers/hcs1MirrorV1.js +220 -0
- package/dist/resolvers/hcs1MirrorV1.js.map +1 -0
- package/dist/resolvers/hcs26MirrorV1.d.ts +67 -0
- package/dist/resolvers/hcs26MirrorV1.d.ts.map +1 -0
- package/dist/resolvers/hcs26MirrorV1.js +218 -0
- package/dist/resolvers/hcs26MirrorV1.js.map +1 -0
- package/dist/resolvers/hcs26RegistryMirrorV1.d.ts +26 -0
- package/dist/resolvers/hcs26RegistryMirrorV1.d.ts.map +1 -0
- package/dist/resolvers/hcs26RegistryMirrorV1.js +200 -0
- package/dist/resolvers/hcs26RegistryMirrorV1.js.map +1 -0
- package/dist/resolvers/hcs2MirrorV1.d.ts +26 -0
- package/dist/resolvers/hcs2MirrorV1.d.ts.map +1 -0
- package/dist/resolvers/hcs2MirrorV1.js +196 -0
- package/dist/resolvers/hcs2MirrorV1.js.map +1 -0
- package/dist/resolvers/hederaMirrorV1.d.ts +22 -0
- package/dist/resolvers/hederaMirrorV1.d.ts.map +1 -0
- package/dist/resolvers/hederaMirrorV1.js +338 -0
- package/dist/resolvers/hederaMirrorV1.js.map +1 -0
- package/dist/standards/hcs/hcs11V1.d.ts +51 -0
- package/dist/standards/hcs/hcs11V1.d.ts.map +1 -0
- package/dist/standards/hcs/hcs11V1.js +289 -0
- package/dist/standards/hcs/hcs11V1.js.map +1 -0
- package/dist/standards/hcs/hcs13V1.d.ts +39 -0
- package/dist/standards/hcs/hcs13V1.d.ts.map +1 -0
- package/dist/standards/hcs/hcs13V1.js +114 -0
- package/dist/standards/hcs/hcs13V1.js.map +1 -0
- package/dist/standards/hcs/hcs14V1.d.ts +35 -0
- package/dist/standards/hcs/hcs14V1.d.ts.map +1 -0
- package/dist/standards/hcs/hcs14V1.js +168 -0
- package/dist/standards/hcs/hcs14V1.js.map +1 -0
- package/dist/standards/hcs/hcs1V1.d.ts +30 -0
- package/dist/standards/hcs/hcs1V1.d.ts.map +1 -0
- package/dist/standards/hcs/hcs1V1.js +140 -0
- package/dist/standards/hcs/hcs1V1.js.map +1 -0
- package/dist/standards/hcs/hcs26V1.d.ts +58 -0
- package/dist/standards/hcs/hcs26V1.d.ts.map +1 -0
- package/dist/standards/hcs/hcs26V1.js +339 -0
- package/dist/standards/hcs/hcs26V1.js.map +1 -0
- package/dist/standards/hcs/hcs2V1.d.ts +36 -0
- package/dist/standards/hcs/hcs2V1.d.ts.map +1 -0
- package/dist/standards/hcs/hcs2V1.js +181 -0
- package/dist/standards/hcs/hcs2V1.js.map +1 -0
- package/dist/standards/hcs/jsonCanonicalV1.d.ts +15 -0
- package/dist/standards/hcs/jsonCanonicalV1.d.ts.map +1 -0
- package/dist/standards/hcs/jsonCanonicalV1.js +160 -0
- package/dist/standards/hcs/jsonCanonicalV1.js.map +1 -0
- package/dist/triangulation/compareV1.d.ts +50 -0
- package/dist/triangulation/compareV1.d.ts.map +1 -0
- package/dist/triangulation/compareV1.js +236 -0
- package/dist/triangulation/compareV1.js.map +1 -0
- package/dist/triangulation/executionPlanV1.d.ts +39 -0
- package/dist/triangulation/executionPlanV1.d.ts.map +1 -0
- package/dist/triangulation/executionPlanV1.js +208 -0
- package/dist/triangulation/executionPlanV1.js.map +1 -0
- package/dist/triangulation/executionPublicV1.d.ts +22 -0
- package/dist/triangulation/executionPublicV1.d.ts.map +1 -0
- package/dist/triangulation/executionPublicV1.js +39 -0
- package/dist/triangulation/executionPublicV1.js.map +1 -0
- package/dist/triangulation/messageObservationV1.d.ts +26 -0
- package/dist/triangulation/messageObservationV1.d.ts.map +1 -0
- package/dist/triangulation/messageObservationV1.js +69 -0
- package/dist/triangulation/messageObservationV1.js.map +1 -0
- package/dist/triangulation/publicV1.d.ts +29 -0
- package/dist/triangulation/publicV1.d.ts.map +1 -0
- package/dist/triangulation/publicV1.js +170 -0
- package/dist/triangulation/publicV1.js.map +1 -0
- package/dist/verification/sourceIntentV1.d.ts +15 -0
- package/dist/verification/sourceIntentV1.d.ts.map +1 -0
- package/dist/verification/sourceIntentV1.js +206 -0
- package/dist/verification/sourceIntentV1.js.map +1 -0
- package/docs/cli-v0.1.md +237 -0
- package/docs/conformance.md +38 -0
- package/docs/threat-model.md +37 -0
- package/docs/verification-semantics.md +65 -0
- package/examples/README.md +35 -0
- package/examples/dataset-offline.mjs +58 -0
- package/examples/dataset-policy.mjs +59 -0
- package/package.json +65 -4
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
/** Pinned HCS-26 Draft v1.1: offline discovery/version/skill checks.
|
|
2
|
+
* Only supported registry operations and content supplied to this module are
|
|
3
|
+
* inspected. No Hedera lookup, ownership, execution, or current-state claim.
|
|
4
|
+
*/
|
|
5
|
+
import { createHash } from "node:crypto";
|
|
6
|
+
import { parseHcs1ReferenceV1 } from "./hcs1V1.js";
|
|
7
|
+
import { canonicalHcsJsonV1, cloneHcsJsonV1, HcsJsonV1Error, parseStrictHcsJsonV1 } from "./jsonCanonicalV1.js";
|
|
8
|
+
export const MAX_HCS26_V1_MANIFEST_BYTES = 256 * 1024;
|
|
9
|
+
const RAW_MANIFEST_BYTES = MAX_HCS26_V1_MANIFEST_BYTES + 64 * 1024;
|
|
10
|
+
const TOPIC = /^0\.0\.[0-9]+$/;
|
|
11
|
+
const SHA256 = /^[0-9a-f]{64}$/;
|
|
12
|
+
const COMMIT = /^[0-9a-f]{40}$/;
|
|
13
|
+
const SEMVER = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;
|
|
14
|
+
const KEYS_DISCOVERY = new Set(["p", "op", "t_id", "account_id", "metadata", "m"]);
|
|
15
|
+
const KEYS_UPDATE = new Set(["p", "op", "uid", "account_id", "metadata", "m"]);
|
|
16
|
+
const KEYS_VERSION = new Set(["p", "op", "skill_uid", "version", "t_id", "checksum", "status", "m"]);
|
|
17
|
+
const KEYS_METADATA = new Set(["name", "description", "author", "license", "tags", "languages", "capabilities", "homepage", "icon", "repo", "commit"]);
|
|
18
|
+
const KEYS_MANIFEST = new Set(["name", "description", "version", "license", "author", "tags", "languages", "homepage", "repo", "commit", "entrypoints", "files"]);
|
|
19
|
+
const KEYS_FILE = new Set(["path", "hrl", "sha256", "mime"]);
|
|
20
|
+
export class Hcs26V1Error extends Error {
|
|
21
|
+
code;
|
|
22
|
+
constructor(code) {
|
|
23
|
+
super(code);
|
|
24
|
+
this.code = code;
|
|
25
|
+
this.name = "Hcs26V1Error";
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function fail(code) { throw new Hcs26V1Error(code); }
|
|
29
|
+
function object(value, code = "HCS26_FIELD_INVALID") {
|
|
30
|
+
if (!value || typeof value !== "object" || Array.isArray(value) ||
|
|
31
|
+
![null, Object.prototype].includes(Object.getPrototypeOf(value)))
|
|
32
|
+
return fail(code);
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
function keys(value, allowed) {
|
|
36
|
+
for (const key of Object.keys(value))
|
|
37
|
+
if (!allowed.has(key))
|
|
38
|
+
return fail("HCS26_FIELD_UNSUPPORTED");
|
|
39
|
+
}
|
|
40
|
+
function text(value, max) {
|
|
41
|
+
if (typeof value !== "string")
|
|
42
|
+
return fail("HCS26_FIELD_INVALID");
|
|
43
|
+
const out = value.trim();
|
|
44
|
+
if (!out || out.length > max || /[\u0000-\u001f\u007f]/.test(out))
|
|
45
|
+
return fail("HCS26_FIELD_INVALID");
|
|
46
|
+
return out;
|
|
47
|
+
}
|
|
48
|
+
function optional(value, max) {
|
|
49
|
+
return value == null || value === "" || (typeof value === "string" && !value.trim()) ? null : text(value, max);
|
|
50
|
+
}
|
|
51
|
+
function topic(value) {
|
|
52
|
+
const out = text(value, 64);
|
|
53
|
+
if (!TOPIC.test(out))
|
|
54
|
+
return fail("HCS26_TOPIC_INVALID");
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
function version(value) {
|
|
58
|
+
const out = text(value, 64);
|
|
59
|
+
if (!SEMVER.test(out))
|
|
60
|
+
return fail("HCS26_VERSION_INVALID");
|
|
61
|
+
return out;
|
|
62
|
+
}
|
|
63
|
+
function sha(value) {
|
|
64
|
+
if (typeof value !== "string")
|
|
65
|
+
return fail("HCS26_CHECKSUM_INVALID");
|
|
66
|
+
const raw = value.startsWith("sha256:") ? value.slice(7) : value;
|
|
67
|
+
if (!SHA256.test(raw))
|
|
68
|
+
return fail("HCS26_CHECKSUM_INVALID");
|
|
69
|
+
return raw;
|
|
70
|
+
}
|
|
71
|
+
function positive(value) {
|
|
72
|
+
const n = Number(value);
|
|
73
|
+
if (value == null || value === "" || !Number.isSafeInteger(n) || n < 1)
|
|
74
|
+
return fail("HCS26_SKILL_UID_INVALID");
|
|
75
|
+
return n;
|
|
76
|
+
}
|
|
77
|
+
function uid(value) {
|
|
78
|
+
const out = text(value, 256);
|
|
79
|
+
if (!/^[1-9]\d*$/.test(out) || !Number.isSafeInteger(Number(out)))
|
|
80
|
+
return fail("HCS26_SKILL_UID_INVALID");
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
function hcs1ref(value) {
|
|
84
|
+
try {
|
|
85
|
+
return parseHcs1ReferenceV1(text(value, 256)).reference;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return fail("HCS1_REF_INVALID");
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function authors(value) {
|
|
92
|
+
if (typeof value === "string")
|
|
93
|
+
return text(value, 512);
|
|
94
|
+
const author = object(value);
|
|
95
|
+
keys(author, new Set(["name", "contact", "url"]));
|
|
96
|
+
return {
|
|
97
|
+
name: text(author.name, 256),
|
|
98
|
+
...(optional(author.contact, 512) == null ? {} : { contact: optional(author.contact, 512) }),
|
|
99
|
+
...(optional(author.url, 2048) == null ? {} : { url: optional(author.url, 2048) }),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function ints(value) {
|
|
103
|
+
if (!Array.isArray(value))
|
|
104
|
+
return fail("HCS26_FIELD_INVALID");
|
|
105
|
+
const result = value.map(Number);
|
|
106
|
+
if (result.some((n) => !Number.isSafeInteger(n) || n < 0))
|
|
107
|
+
return fail("HCS26_FIELD_INVALID");
|
|
108
|
+
return [...new Set(result)].sort((a, b) => a - b);
|
|
109
|
+
}
|
|
110
|
+
function strings(value) {
|
|
111
|
+
if (!Array.isArray(value))
|
|
112
|
+
return fail("HCS26_FIELD_INVALID");
|
|
113
|
+
return value.map((v) => text(v, 256));
|
|
114
|
+
}
|
|
115
|
+
function metadata(value, update = false) {
|
|
116
|
+
if (typeof value === "string")
|
|
117
|
+
return hcs1ref(value);
|
|
118
|
+
const obj = object(value);
|
|
119
|
+
keys(obj, KEYS_METADATA);
|
|
120
|
+
if (update && Object.keys(obj).length === 0)
|
|
121
|
+
return fail("HCS26_FIELD_INVALID");
|
|
122
|
+
const out = {};
|
|
123
|
+
for (const [key, limit] of [["name", 256], ["description", 4096], ["license", 128]]) {
|
|
124
|
+
if (!update || Object.hasOwn(obj, key))
|
|
125
|
+
out[key] = text(obj[key], limit);
|
|
126
|
+
}
|
|
127
|
+
if (!update || Object.hasOwn(obj, "author"))
|
|
128
|
+
out.author = authors(obj.author);
|
|
129
|
+
for (const key of ["tags", "languages", "capabilities"]) {
|
|
130
|
+
if (!Object.hasOwn(obj, key))
|
|
131
|
+
continue;
|
|
132
|
+
const val = obj[key];
|
|
133
|
+
if (val == null && !update)
|
|
134
|
+
continue;
|
|
135
|
+
out[key] = val == null ? [] : key === "tags" ? ints(val) : strings(val);
|
|
136
|
+
}
|
|
137
|
+
for (const [key, limit] of [["homepage", 2048], ["icon", 4096], ["repo", 4096]]) {
|
|
138
|
+
if (!Object.hasOwn(obj, key))
|
|
139
|
+
continue;
|
|
140
|
+
const val = update ? text(obj[key], limit) : optional(obj[key], limit);
|
|
141
|
+
if (val != null)
|
|
142
|
+
out[key] = val;
|
|
143
|
+
}
|
|
144
|
+
if (Object.hasOwn(obj, "commit")) {
|
|
145
|
+
const value = text(obj.commit, 40);
|
|
146
|
+
if (!COMMIT.test(value))
|
|
147
|
+
return fail("HCS26_COMMIT_INVALID");
|
|
148
|
+
out.commit = value;
|
|
149
|
+
}
|
|
150
|
+
return out;
|
|
151
|
+
}
|
|
152
|
+
function parseWire(value) {
|
|
153
|
+
let parsed;
|
|
154
|
+
try {
|
|
155
|
+
parsed = parseStrictHcsJsonV1(value, 1024);
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
if (error instanceof HcsJsonV1Error && error.code === "JSON_TOO_LARGE")
|
|
159
|
+
return fail("HCS26_MESSAGE_TOO_LARGE");
|
|
160
|
+
return fail("HCS26_MESSAGE_INVALID");
|
|
161
|
+
}
|
|
162
|
+
return object(parsed, "HCS26_MESSAGE_INVALID");
|
|
163
|
+
}
|
|
164
|
+
function wireSize(value) {
|
|
165
|
+
if (Buffer.byteLength(JSON.stringify(value), "utf8") > 1024)
|
|
166
|
+
return fail("HCS26_MESSAGE_TOO_LARGE");
|
|
167
|
+
}
|
|
168
|
+
function memoText(value) { return optional(value, 500) == null ? {} : { m: optional(value, 500) }; }
|
|
169
|
+
export function parseHcs26MemoV1(value) {
|
|
170
|
+
const match = typeof value === "string" ? /^hcs-26:(0|1):(\d+):(0|1)$/.exec(value.trim()) : null;
|
|
171
|
+
if (!match)
|
|
172
|
+
return fail("HCS26_MEMO_INVALID");
|
|
173
|
+
const ttl = Number(match[2]);
|
|
174
|
+
if (!Number.isSafeInteger(ttl) || ttl > 31_536_000)
|
|
175
|
+
return fail("HCS26_TTL_INVALID");
|
|
176
|
+
const type_code = Number(match[3]);
|
|
177
|
+
return Object.freeze({ memo: value.trim(), indexed: match[1] === "0", ttl,
|
|
178
|
+
type: type_code === 0 ? "discovery" : "version", type_code });
|
|
179
|
+
}
|
|
180
|
+
/** Supplied historical raw registry message; not a read of current registry state. */
|
|
181
|
+
export function parseHcs26DiscoveryRegisterV1(raw) {
|
|
182
|
+
const obj = parseWire(raw);
|
|
183
|
+
if (obj.p !== "hcs-26" || obj.op !== "register" || obj.skill_uid != null || obj.version != null)
|
|
184
|
+
return fail("HCS26_OPERATION_INVALID");
|
|
185
|
+
keys(obj, KEYS_DISCOVERY);
|
|
186
|
+
const record = { p: "hcs-26", op: "register", t_id: topic(obj.t_id), account_id: topic(obj.account_id),
|
|
187
|
+
metadata: metadata(obj.metadata), ...memoText(obj.m) };
|
|
188
|
+
wireSize(record);
|
|
189
|
+
return Object.freeze(record);
|
|
190
|
+
}
|
|
191
|
+
export function parseHcs26DiscoveryUpdateV1(raw) {
|
|
192
|
+
const obj = parseWire(raw);
|
|
193
|
+
if (obj.p !== "hcs-26" || obj.op !== "update" || obj.uid == null)
|
|
194
|
+
return fail("HCS26_OPERATION_INVALID");
|
|
195
|
+
keys(obj, KEYS_UPDATE);
|
|
196
|
+
if (obj.account_id == null && obj.metadata == null)
|
|
197
|
+
return fail("HCS26_UPDATE_EMPTY");
|
|
198
|
+
const record = { p: "hcs-26", op: "update", uid: uid(obj.uid),
|
|
199
|
+
...(obj.account_id == null ? {} : { account_id: topic(obj.account_id) }),
|
|
200
|
+
...(obj.metadata == null ? {} : { metadata: metadata(obj.metadata, true) }), ...memoText(obj.m) };
|
|
201
|
+
wireSize(record);
|
|
202
|
+
return Object.freeze(record);
|
|
203
|
+
}
|
|
204
|
+
export function parseHcs26VersionRegisterV1(raw) {
|
|
205
|
+
const obj = parseWire(raw);
|
|
206
|
+
if (obj.p !== "hcs-26" || obj.op !== "register" || obj.skill_uid == null || obj.version == null)
|
|
207
|
+
return fail("HCS26_OPERATION_INVALID");
|
|
208
|
+
keys(obj, KEYS_VERSION);
|
|
209
|
+
const status = obj.status == null ? "active" : text(obj.status, 40).toLowerCase();
|
|
210
|
+
if (status !== "active" && status !== "deprecated" && status !== "yanked")
|
|
211
|
+
return fail("HCS26_STATUS_INVALID");
|
|
212
|
+
const record = { p: "hcs-26", op: "register", skill_uid: positive(obj.skill_uid),
|
|
213
|
+
version: version(obj.version), t_id: topic(obj.t_id), checksum: `sha256:${sha(obj.checksum)}`,
|
|
214
|
+
status, ...memoText(obj.m) };
|
|
215
|
+
wireSize(record);
|
|
216
|
+
return Object.freeze(record);
|
|
217
|
+
}
|
|
218
|
+
function filePath(value) {
|
|
219
|
+
const path = text(value, 512).replace(/\\/g, "/");
|
|
220
|
+
const parts = path.split("/");
|
|
221
|
+
if (path.startsWith("/") || /^[A-Za-z]:/.test(path) || parts.some((p) => !p || p === "." || p === "..")) {
|
|
222
|
+
return fail("HCS26_PATH_INVALID");
|
|
223
|
+
}
|
|
224
|
+
return path;
|
|
225
|
+
}
|
|
226
|
+
function manifestFile(value) {
|
|
227
|
+
const obj = object(value);
|
|
228
|
+
keys(obj, KEYS_FILE);
|
|
229
|
+
const path = filePath(obj.path);
|
|
230
|
+
const digest = text(obj.sha256, 64).toLowerCase();
|
|
231
|
+
if (!SHA256.test(digest))
|
|
232
|
+
return fail("HCS26_FILE_HASH_INVALID");
|
|
233
|
+
return { path, hrl: hcs1ref(obj.hrl), sha256: digest, mime: text(obj.mime, 256) };
|
|
234
|
+
}
|
|
235
|
+
export function finalizeHcs26SkillManifestV1(value) {
|
|
236
|
+
const obj = object(value);
|
|
237
|
+
keys(obj, KEYS_MANIFEST);
|
|
238
|
+
if (!Array.isArray(obj.files) || obj.files.length < 1 || obj.files.length > 256)
|
|
239
|
+
return fail("HCS26_FILES_INVALID");
|
|
240
|
+
const files = obj.files.map(manifestFile);
|
|
241
|
+
const paths = new Set();
|
|
242
|
+
for (const file of files) {
|
|
243
|
+
if (paths.has(file.path))
|
|
244
|
+
return fail("HCS26_PATH_DUPLICATE");
|
|
245
|
+
paths.add(file.path);
|
|
246
|
+
}
|
|
247
|
+
if (!paths.has("SKILL.md"))
|
|
248
|
+
return fail("HCS26_SKILL_MD_REQUIRED");
|
|
249
|
+
files.sort((a, b) => Buffer.compare(Buffer.from(a.path), Buffer.from(b.path)));
|
|
250
|
+
const normalized = {
|
|
251
|
+
name: text(obj.name, 256), description: text(obj.description, 4096),
|
|
252
|
+
version: version(obj.version), license: text(obj.license, 128), author: authors(obj.author),
|
|
253
|
+
};
|
|
254
|
+
if (obj.tags != null)
|
|
255
|
+
normalized.tags = ints(obj.tags);
|
|
256
|
+
if (obj.languages != null)
|
|
257
|
+
normalized.languages = strings(obj.languages);
|
|
258
|
+
for (const [key, limit] of [["homepage", 2048], ["repo", 4096]]) {
|
|
259
|
+
const val = optional(obj[key], limit);
|
|
260
|
+
if (val != null)
|
|
261
|
+
normalized[key] = val;
|
|
262
|
+
}
|
|
263
|
+
if (obj.commit != null) {
|
|
264
|
+
const commit = text(obj.commit, 40);
|
|
265
|
+
if (!COMMIT.test(commit))
|
|
266
|
+
return fail("HCS26_COMMIT_INVALID");
|
|
267
|
+
normalized.commit = commit;
|
|
268
|
+
}
|
|
269
|
+
if (obj.entrypoints != null) {
|
|
270
|
+
if (!Array.isArray(obj.entrypoints))
|
|
271
|
+
return fail("HCS26_FIELD_INVALID");
|
|
272
|
+
normalized.entrypoints = obj.entrypoints;
|
|
273
|
+
}
|
|
274
|
+
normalized.files = files;
|
|
275
|
+
let canonical;
|
|
276
|
+
try {
|
|
277
|
+
canonical = canonicalHcsJsonV1(normalized, MAX_HCS26_V1_MANIFEST_BYTES);
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
if (error instanceof HcsJsonV1Error) {
|
|
281
|
+
return fail(error.code === "JSON_TOO_LARGE" ? "HCS26_MANIFEST_TOO_LARGE" : "HCS26_CANONICALIZATION_FAILED");
|
|
282
|
+
}
|
|
283
|
+
throw error;
|
|
284
|
+
}
|
|
285
|
+
const bytes = Buffer.from(canonical, "utf8");
|
|
286
|
+
return Object.freeze({ manifest: cloneHcsJsonV1(normalized), canonical_payload: canonical,
|
|
287
|
+
sha256: createHash("sha256").update(bytes).digest("hex"), byte_length: bytes.byteLength });
|
|
288
|
+
}
|
|
289
|
+
export function parseHcs26SkillManifestV1(raw) {
|
|
290
|
+
let parsed;
|
|
291
|
+
try {
|
|
292
|
+
parsed = parseStrictHcsJsonV1(raw, RAW_MANIFEST_BYTES);
|
|
293
|
+
}
|
|
294
|
+
catch (error) {
|
|
295
|
+
if (error instanceof HcsJsonV1Error) {
|
|
296
|
+
return fail(error.code === "JSON_TOO_LARGE" ? "HCS26_MANIFEST_TOO_LARGE" : "HCS26_MANIFEST_JSON_INVALID");
|
|
297
|
+
}
|
|
298
|
+
throw error;
|
|
299
|
+
}
|
|
300
|
+
return finalizeHcs26SkillManifestV1(parsed);
|
|
301
|
+
}
|
|
302
|
+
/** Cross-check a supplied historical version register against actual SKILL.json
|
|
303
|
+
* canonical content. This does not authenticate where the register came from.
|
|
304
|
+
*/
|
|
305
|
+
export function verifyHcs26SkillVersionV1(input) {
|
|
306
|
+
let register = null;
|
|
307
|
+
let sha256 = null;
|
|
308
|
+
let checksumMatch = "not_checked";
|
|
309
|
+
const result = (status, reason) => Object.freeze({ status, reason_code: reason, skill_uid: register?.skill_uid ?? null,
|
|
310
|
+
version: register?.version ?? null, manifest_topic_id: register?.t_id ?? null,
|
|
311
|
+
version_status: register?.status ?? null, checksum_match: checksumMatch, sha256 });
|
|
312
|
+
try {
|
|
313
|
+
if (!input || typeof input !== "object")
|
|
314
|
+
return fail("HCS26_INPUT_INVALID");
|
|
315
|
+
register = parseHcs26VersionRegisterV1(input.version_register);
|
|
316
|
+
if (input.expected_skill_uid != null && positive(input.expected_skill_uid) !== register.skill_uid)
|
|
317
|
+
return fail("HCS26_SKILL_UID_MISMATCH");
|
|
318
|
+
if (input.expected_version != null && version(input.expected_version) !== register.version)
|
|
319
|
+
return fail("HCS26_VERSION_MISMATCH");
|
|
320
|
+
if (input.expected_manifest_topic_id != null && topic(input.expected_manifest_topic_id) !== register.t_id)
|
|
321
|
+
return fail("HCS26_TOPIC_MISMATCH");
|
|
322
|
+
const manifest = parseHcs26SkillManifestV1(input.manifest);
|
|
323
|
+
sha256 = manifest.sha256;
|
|
324
|
+
checksumMatch = sha256 === register.checksum.slice(7) ? "match" : "mismatch";
|
|
325
|
+
if (checksumMatch === "mismatch")
|
|
326
|
+
return fail("HCS26_CHECKSUM_MISMATCH");
|
|
327
|
+
if (manifest.manifest.version !== register.version)
|
|
328
|
+
return fail("HCS26_VERSION_MISMATCH");
|
|
329
|
+
if (input.expected_sha256 != null && sha(input.expected_sha256) !== sha256)
|
|
330
|
+
return fail("HCS26_EXPECTED_CHECKSUM_MISMATCH");
|
|
331
|
+
return result("pass", null);
|
|
332
|
+
}
|
|
333
|
+
catch (error) {
|
|
334
|
+
if (error instanceof Hcs26V1Error)
|
|
335
|
+
return result("fail", error.code);
|
|
336
|
+
throw error;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=hcs26V1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hcs26V1.js","sourceRoot":"","sources":["../../../src/standards/hcs/hcs26V1.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/** Pinned HCS-2 registry memo and historical register verification. Pure; no network I/O. */
|
|
2
|
+
export type Hcs2V1Memo = Readonly<{
|
|
3
|
+
memo: string;
|
|
4
|
+
indexed: boolean;
|
|
5
|
+
ttl: number;
|
|
6
|
+
}>;
|
|
7
|
+
export type Hcs2V1Register = Readonly<{
|
|
8
|
+
p: "hcs-2";
|
|
9
|
+
op: "register";
|
|
10
|
+
t_id: string;
|
|
11
|
+
metadata?: string;
|
|
12
|
+
m?: string;
|
|
13
|
+
}>;
|
|
14
|
+
export type Hcs2V1VerificationInput = Readonly<{
|
|
15
|
+
/** Unauthenticated in offline mode, unless independently established by caller. */
|
|
16
|
+
memo: unknown;
|
|
17
|
+
/** Original registry message bytes. A single register operation is supported. */
|
|
18
|
+
message: string | Uint8Array;
|
|
19
|
+
/** Independent relying-party expectation, not extracted from the register itself. */
|
|
20
|
+
expected_t_id?: string | null;
|
|
21
|
+
}>;
|
|
22
|
+
export type Hcs2V1VerificationResult = Readonly<{
|
|
23
|
+
status: "pass" | "fail";
|
|
24
|
+
reason_code: string | null;
|
|
25
|
+
memo: Hcs2V1Memo | null;
|
|
26
|
+
register: Hcs2V1Register | null;
|
|
27
|
+
target_match: "match" | "not_checked" | "mismatch";
|
|
28
|
+
}>;
|
|
29
|
+
export declare class Hcs2V1Error extends Error {
|
|
30
|
+
readonly code: string;
|
|
31
|
+
constructor(code: string);
|
|
32
|
+
}
|
|
33
|
+
export declare function parseHcs2MemoV1(value: unknown): Hcs2V1Memo;
|
|
34
|
+
export declare function parseHcs2RegisterV1(message: unknown): Hcs2V1Register;
|
|
35
|
+
export declare function verifyHcs2RegisterV1(input: Hcs2V1VerificationInput): Hcs2V1VerificationResult;
|
|
36
|
+
//# sourceMappingURL=hcs2V1.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hcs2V1.d.ts","sourceRoot":"","sources":["../../../src/standards/hcs/hcs2V1.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAS7F,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IACpC,CAAC,EAAE,OAAO,CAAC;IACX,EAAE,EAAE,UAAU,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ,CAAC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,QAAQ,CAAC;IAC7C,mFAAmF;IACnF,IAAI,EAAE,OAAO,CAAC;IACd,iFAAiF;IACjF,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC;IAC7B,qFAAqF;IACrF,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,QAAQ,CAAC;IAC9C,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;IAChC,YAAY,EAAE,OAAO,GAAG,aAAa,GAAG,UAAU,CAAC;CACpD,CAAC,CAAC;AAEH,qBAAa,WAAY,SAAQ,KAAK;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM;CAClC;AAID,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAQ1D;AAuFD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CAapE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,uBAAuB,GAAG,wBAAwB,CAiB7F"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/** Pinned HCS-2 registry memo and historical register verification. Pure; no network I/O. */
|
|
2
|
+
const TOPIC_ID = /^0\.0\.[0-9]+$/;
|
|
3
|
+
const MEMO = /^hcs-2:(0|1):([0-9]+)$/;
|
|
4
|
+
const CONTROL = /[\u0000-\u001f\u007f]/;
|
|
5
|
+
const MAX_MESSAGE_BYTES = 1024;
|
|
6
|
+
const MAX_TTL = 31_536_000;
|
|
7
|
+
const ALLOWED_KEYS = new Set(["p", "op", "t_id", "metadata", "m"]);
|
|
8
|
+
export class Hcs2V1Error extends Error {
|
|
9
|
+
code;
|
|
10
|
+
constructor(code) {
|
|
11
|
+
super(code);
|
|
12
|
+
this.code = code;
|
|
13
|
+
this.name = "Hcs2V1Error";
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function invalid(code) { throw new Hcs2V1Error(code); }
|
|
17
|
+
export function parseHcs2MemoV1(value) {
|
|
18
|
+
if (typeof value !== "string" || value.length > 256)
|
|
19
|
+
invalid("HCS2_MEMO_INVALID");
|
|
20
|
+
const memo = value.trim();
|
|
21
|
+
const match = MEMO.exec(memo);
|
|
22
|
+
if (!match)
|
|
23
|
+
invalid("HCS2_MEMO_INVALID");
|
|
24
|
+
const ttl = Number(match[2]);
|
|
25
|
+
if (!Number.isSafeInteger(ttl) || ttl > MAX_TTL)
|
|
26
|
+
invalid("HCS2_TTL_INVALID");
|
|
27
|
+
return Object.freeze({ memo, indexed: match[1] === "0", ttl });
|
|
28
|
+
}
|
|
29
|
+
function topicId(value) {
|
|
30
|
+
if (typeof value !== "string" || value.length > 128 || !TOPIC_ID.test(value.trim())) {
|
|
31
|
+
invalid("HCS2_TOPIC_INVALID");
|
|
32
|
+
}
|
|
33
|
+
return value.trim();
|
|
34
|
+
}
|
|
35
|
+
function optionalText(value, max) {
|
|
36
|
+
if (value == null)
|
|
37
|
+
return null;
|
|
38
|
+
if (typeof value !== "string")
|
|
39
|
+
invalid("HCS2_TEXT_INVALID");
|
|
40
|
+
const text = value.trim();
|
|
41
|
+
if (!text)
|
|
42
|
+
return null;
|
|
43
|
+
if (text.length > max || CONTROL.test(text))
|
|
44
|
+
invalid("HCS2_TEXT_INVALID");
|
|
45
|
+
return text;
|
|
46
|
+
}
|
|
47
|
+
/** Scan JSON strings to reject ambiguous duplicate top-level keys (including escaped aliases). */
|
|
48
|
+
function readString(text, offset) {
|
|
49
|
+
if (text[offset] !== '"')
|
|
50
|
+
invalid("HCS2_MESSAGE_INVALID");
|
|
51
|
+
let end = offset + 1;
|
|
52
|
+
while (end < text.length) {
|
|
53
|
+
if (text[end] === "\\") {
|
|
54
|
+
end += 2;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (text[end] === '"') {
|
|
58
|
+
let value;
|
|
59
|
+
try {
|
|
60
|
+
value = JSON.parse(text.slice(offset, end + 1));
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
invalid("HCS2_MESSAGE_INVALID");
|
|
64
|
+
}
|
|
65
|
+
if (typeof value !== "string")
|
|
66
|
+
invalid("HCS2_MESSAGE_INVALID");
|
|
67
|
+
return { value, end: end + 1 };
|
|
68
|
+
}
|
|
69
|
+
end++;
|
|
70
|
+
}
|
|
71
|
+
return invalid("HCS2_MESSAGE_INVALID");
|
|
72
|
+
}
|
|
73
|
+
function parseFlatRegister(message) {
|
|
74
|
+
if (!(message instanceof Uint8Array) && typeof message !== "string") {
|
|
75
|
+
invalid("HCS2_MESSAGE_INVALID");
|
|
76
|
+
}
|
|
77
|
+
if (typeof message === "string" && message.length > MAX_MESSAGE_BYTES) {
|
|
78
|
+
invalid("HCS2_MESSAGE_TOO_LARGE");
|
|
79
|
+
}
|
|
80
|
+
const bytes = typeof message === "string" ? Buffer.from(message, "utf8") : message;
|
|
81
|
+
if (bytes.byteLength > MAX_MESSAGE_BYTES)
|
|
82
|
+
invalid("HCS2_MESSAGE_TOO_LARGE");
|
|
83
|
+
if (bytes.byteLength < 2)
|
|
84
|
+
invalid("HCS2_MESSAGE_INVALID");
|
|
85
|
+
let text;
|
|
86
|
+
try {
|
|
87
|
+
text = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
invalid("HCS2_MESSAGE_INVALID");
|
|
91
|
+
}
|
|
92
|
+
let json;
|
|
93
|
+
try {
|
|
94
|
+
json = JSON.parse(text);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
invalid("HCS2_MESSAGE_INVALID");
|
|
98
|
+
}
|
|
99
|
+
if (!json || typeof json !== "object" || Array.isArray(json))
|
|
100
|
+
invalid("HCS2_MESSAGE_INVALID");
|
|
101
|
+
// All supported register values are strings or optional null. Reject nested
|
|
102
|
+
// objects, ambiguous duplicate properties, and non-string coercions.
|
|
103
|
+
let i = 0;
|
|
104
|
+
const skip = () => { while (/\s/.test(text[i] ?? "") && i < text.length)
|
|
105
|
+
i++; };
|
|
106
|
+
skip();
|
|
107
|
+
if (text[i++] !== "{")
|
|
108
|
+
invalid("HCS2_MESSAGE_INVALID");
|
|
109
|
+
const seen = new Set();
|
|
110
|
+
skip();
|
|
111
|
+
if (text[i] === "}")
|
|
112
|
+
invalid("HCS2_MESSAGE_INVALID");
|
|
113
|
+
while (i < text.length) {
|
|
114
|
+
skip();
|
|
115
|
+
const key = readString(text, i);
|
|
116
|
+
if (seen.has(key.value) || !ALLOWED_KEYS.has(key.value))
|
|
117
|
+
invalid("HCS2_MESSAGE_INVALID");
|
|
118
|
+
seen.add(key.value);
|
|
119
|
+
i = key.end;
|
|
120
|
+
skip();
|
|
121
|
+
if (text[i++] !== ":")
|
|
122
|
+
invalid("HCS2_MESSAGE_INVALID");
|
|
123
|
+
skip();
|
|
124
|
+
if (text[i] === '"') {
|
|
125
|
+
i = readString(text, i).end;
|
|
126
|
+
}
|
|
127
|
+
else if (text.slice(i, i + 4) === "null") {
|
|
128
|
+
i += 4;
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
invalid("HCS2_MESSAGE_INVALID");
|
|
132
|
+
}
|
|
133
|
+
skip();
|
|
134
|
+
if (text[i] === "}") {
|
|
135
|
+
i++;
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
if (text[i++] !== ",")
|
|
139
|
+
invalid("HCS2_MESSAGE_INVALID");
|
|
140
|
+
}
|
|
141
|
+
skip();
|
|
142
|
+
if (i !== text.length)
|
|
143
|
+
invalid("HCS2_MESSAGE_INVALID");
|
|
144
|
+
return json;
|
|
145
|
+
}
|
|
146
|
+
export function parseHcs2RegisterV1(message) {
|
|
147
|
+
const record = parseFlatRegister(message);
|
|
148
|
+
if (record.p !== "hcs-2" || record.op !== "register")
|
|
149
|
+
invalid("HCS2_OPERATION_INVALID");
|
|
150
|
+
const t_id = topicId(record.t_id);
|
|
151
|
+
const metadata = optionalText(record.metadata, 4096);
|
|
152
|
+
const m = optionalText(record.m, 500);
|
|
153
|
+
// The pinned publisher's 1024-byte ceiling applies to the normalized wire form.
|
|
154
|
+
const normalized = { p: "hcs-2", op: "register", t_id,
|
|
155
|
+
...(metadata === null ? {} : { metadata }), ...(m === null ? {} : { m }) };
|
|
156
|
+
if (Buffer.byteLength(JSON.stringify(normalized), "utf8") > MAX_MESSAGE_BYTES) {
|
|
157
|
+
invalid("HCS2_MESSAGE_TOO_LARGE");
|
|
158
|
+
}
|
|
159
|
+
return Object.freeze(normalized);
|
|
160
|
+
}
|
|
161
|
+
export function verifyHcs2RegisterV1(input) {
|
|
162
|
+
let memo = null;
|
|
163
|
+
let register = null;
|
|
164
|
+
try {
|
|
165
|
+
memo = parseHcs2MemoV1(input?.memo);
|
|
166
|
+
register = parseHcs2RegisterV1(input?.message);
|
|
167
|
+
if (input.expected_t_id != null && topicId(input.expected_t_id) !== register.t_id) {
|
|
168
|
+
return Object.freeze({ status: "fail", reason_code: "HCS2_TARGET_MISMATCH", memo,
|
|
169
|
+
register, target_match: "mismatch" });
|
|
170
|
+
}
|
|
171
|
+
return Object.freeze({ status: "pass", reason_code: null, memo, register,
|
|
172
|
+
target_match: input.expected_t_id == null ? "not_checked" : "match" });
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
if (!(error instanceof Hcs2V1Error))
|
|
176
|
+
throw error;
|
|
177
|
+
return Object.freeze({ status: "fail", reason_code: error.code, memo, register,
|
|
178
|
+
target_match: "not_checked" });
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=hcs2V1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hcs2V1.js","sourceRoot":"","sources":["../../../src/standards/hcs/hcs2V1.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Internal bounded, strict I-JSON/JCS substrate for pinned open HCS schemas/skills.
|
|
2
|
+
* Do not use this as a generic JSON Schema evaluator or as an authenticated source.
|
|
3
|
+
*/
|
|
4
|
+
export declare class HcsJsonV1Error extends Error {
|
|
5
|
+
readonly code: "JSON_INVALID" | "JSON_AMBIGUOUS" | "JSON_TOO_LARGE";
|
|
6
|
+
constructor(code: "JSON_INVALID" | "JSON_AMBIGUOUS" | "JSON_TOO_LARGE");
|
|
7
|
+
}
|
|
8
|
+
/** Canonical JSON ordering uses ECMAScript UTF-16 code-unit order as required by RFC 8785. */
|
|
9
|
+
export declare function canonicalHcsJsonV1(value: unknown, maxBytes: number): string;
|
|
10
|
+
/** Parse after strict UTF-8 decoding and before any canonicalization.
|
|
11
|
+
* Duplicate property names (including Unicode escape aliases) are rejected.
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseStrictHcsJsonV1(value: Uint8Array | string, maxBytes: number): unknown;
|
|
14
|
+
export declare function cloneHcsJsonV1<T>(item: T): T;
|
|
15
|
+
//# sourceMappingURL=jsonCanonicalV1.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonCanonicalV1.d.ts","sourceRoot":"","sources":["../../../src/standards/hcs/jsonCanonicalV1.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,cAAe,SAAQ,KAAK;IAC3B,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,gBAAgB,GAAG,gBAAgB;gBAA1D,IAAI,EAAE,cAAc,GAAG,gBAAgB,GAAG,gBAAgB;CAIhF;AAcD,8FAA8F;AAC9F,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA+B3E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAsD1F;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAI5C"}
|