qlm-measure 0.2.8 → 0.7.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/README.md +12 -0
- package/dist/cli.js +86 -2
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/schemes/index.d.ts +125 -0
- package/dist/schemes/index.d.ts.map +1 -0
- package/dist/schemes/index.js +309 -0
- package/dist/schemes/index.js.map +1 -0
- package/dist/schemes/node.d.ts +8 -0
- package/dist/schemes/node.d.ts.map +1 -0
- package/dist/schemes/node.js +15 -0
- package/dist/schemes/node.js.map +1 -0
- package/dist/schemes/products.d.ts +36 -0
- package/dist/schemes/products.d.ts.map +1 -0
- package/dist/schemes/products.js +629 -0
- package/dist/schemes/products.js.map +1 -0
- package/package.json +28 -8
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chain schemes — one implementation of every per-event hash chain a QLM
|
|
3
|
+
* product seals.
|
|
4
|
+
*
|
|
5
|
+
* Products store one row per event with a hash field and a link to the
|
|
6
|
+
* previous event's hash. Historically each product computed that hash with
|
|
7
|
+
* its own copy of the code; when one copy changed (TeachProof, 2026-09-10:
|
|
8
|
+
* 10 → 12 hashed fields) the standalone verifier did not, and every sealed
|
|
9
|
+
* chain read as "tampered". This module makes each scheme a named,
|
|
10
|
+
* versioned definition with a canonical serialization, so the sealer and
|
|
11
|
+
* every verifier — in TypeScript or Python — hash the same bytes.
|
|
12
|
+
*
|
|
13
|
+
* This file is pure: no Node or browser APIs. Hashing is injected, so the
|
|
14
|
+
* same code runs server-side (`./node.js`) and in a client component.
|
|
15
|
+
* Python twin: `python/qlm_measure/schemes.py`. Both are checked against
|
|
16
|
+
* `schema/vectors/chains/*.json`.
|
|
17
|
+
*/
|
|
18
|
+
import { PRODUCT_SCHEMES } from "./products.js";
|
|
19
|
+
export function linkOf(s) {
|
|
20
|
+
return s.link ?? (s.prevField ? "explicit" : "none");
|
|
21
|
+
}
|
|
22
|
+
// ── Built-in non-cryptographic digests (products that sealed with them) ───
|
|
23
|
+
/** UTF-16 code units, as JavaScript's charCodeAt yields them. */
|
|
24
|
+
function utf16Units(str) {
|
|
25
|
+
const out = [];
|
|
26
|
+
for (let i = 0; i < str.length; i++)
|
|
27
|
+
out.push(str.charCodeAt(i));
|
|
28
|
+
return out;
|
|
29
|
+
}
|
|
30
|
+
/** FNV-1a 64-bit over UTF-16 code units, 16 hex chars (qlm-games snapshot-commit hashSnapshotSync). */
|
|
31
|
+
export function fnv1a64Hex(str) {
|
|
32
|
+
let h = BigInt("0xcbf29ce484222325");
|
|
33
|
+
const prime = BigInt("0x100000001b3");
|
|
34
|
+
for (const c of utf16Units(str)) {
|
|
35
|
+
h ^= BigInt(c);
|
|
36
|
+
h = BigInt.asUintN(64, h * prime);
|
|
37
|
+
}
|
|
38
|
+
return h.toString(16).padStart(16, "0");
|
|
39
|
+
}
|
|
40
|
+
/** djb2, 32-bit wrap, unsigned hex padded to 8 (q-core evidence-chain hashString). */
|
|
41
|
+
export function djb2Hex(str) {
|
|
42
|
+
let hash = 5381;
|
|
43
|
+
for (const c of utf16Units(str))
|
|
44
|
+
hash = ((hash << 5) + hash + c) | 0;
|
|
45
|
+
return (hash >>> 0).toString(16).padStart(8, "0");
|
|
46
|
+
}
|
|
47
|
+
/** The digest a scheme seals with: built in for fnv/djb2, the injected function for sha256. */
|
|
48
|
+
export function digestFor(scheme, sha256) {
|
|
49
|
+
const base = scheme.digest === "fnv1a64" ? fnv1a64Hex : scheme.digest === "djb2-32" ? djb2Hex : sha256;
|
|
50
|
+
return scheme.truncate ? (c) => base(c).slice(0, scheme.truncate) : base;
|
|
51
|
+
}
|
|
52
|
+
// ── Canonical forms ───────────────────────────────────────────────────────
|
|
53
|
+
/** Recursively sorts object keys; arrays keep their order. Mirrors Play's residency canonicalize(). */
|
|
54
|
+
export function sortKeysDeep(value) {
|
|
55
|
+
if (value === null || value === undefined)
|
|
56
|
+
return value;
|
|
57
|
+
if (Array.isArray(value))
|
|
58
|
+
return value.map(sortKeysDeep);
|
|
59
|
+
if (typeof value === "object") {
|
|
60
|
+
const sorted = {};
|
|
61
|
+
for (const key of Object.keys(value).sort()) {
|
|
62
|
+
sorted[key] = sortKeysDeep(value[key]);
|
|
63
|
+
}
|
|
64
|
+
return sorted;
|
|
65
|
+
}
|
|
66
|
+
return value;
|
|
67
|
+
}
|
|
68
|
+
// ── TeachProof clinical evidence (tpc/clinical) ───────────────────────────
|
|
69
|
+
// Source of truth until this module: teachproof
|
|
70
|
+
// src/lib/clinical/longitudinal/events/evidence-schema.ts, computeEventHash().
|
|
71
|
+
// Canonical form is JSON.stringify of a positional array.
|
|
72
|
+
export const TPC_SIGNALS = ["demonstrated", "partial", "missed_opportunity", "not_observable"];
|
|
73
|
+
const TPC_BASE_FIELDS = [
|
|
74
|
+
"type", "learner", "encounter", "turn", "construct",
|
|
75
|
+
"signal", "scaffold", "extractor", "confidence", "prev_hash",
|
|
76
|
+
];
|
|
77
|
+
function tpcArray(event, variant) {
|
|
78
|
+
const arr = TPC_BASE_FIELDS.map((f) => event[f]);
|
|
79
|
+
if (variant >= 2)
|
|
80
|
+
arr.push(event.triage_class ?? null, event.engine_version ?? null);
|
|
81
|
+
if (variant === 3)
|
|
82
|
+
arr.push(event.mapping_version);
|
|
83
|
+
if (variant === 4)
|
|
84
|
+
arr.push(event.mapping_version ?? null, event.event_kind, sortKeysDeep(event.payload ?? {}));
|
|
85
|
+
return arr;
|
|
86
|
+
}
|
|
87
|
+
/** A schema 0.4 event: one with event_kind. Only tpc/clinical-v4 seals it, so its payload is always covered. */
|
|
88
|
+
const hasEventKind = (e) => e.event_kind !== undefined;
|
|
89
|
+
/** Commit/skip events share the clinical chain but have their own schemes (tpc/differential-commit-1 and -2). */
|
|
90
|
+
const isCommitEvent = (e) => e.type === "differential_commit" || e.type === "commit_skipped";
|
|
91
|
+
function tpcValidate(event) {
|
|
92
|
+
const errors = [];
|
|
93
|
+
if (event.type !== "clinical_evidence")
|
|
94
|
+
errors.push(`invalid type: ${String(event.type)}`);
|
|
95
|
+
if (!event.learner)
|
|
96
|
+
errors.push("missing learner");
|
|
97
|
+
if (!event.encounter)
|
|
98
|
+
errors.push("missing encounter");
|
|
99
|
+
if (typeof event.turn !== "number" || event.turn < 0)
|
|
100
|
+
errors.push(`invalid turn: ${String(event.turn)}`);
|
|
101
|
+
if (!event.construct)
|
|
102
|
+
errors.push("missing construct");
|
|
103
|
+
if (!TPC_SIGNALS.includes(event.signal))
|
|
104
|
+
errors.push(`invalid signal: ${String(event.signal)}`);
|
|
105
|
+
if (typeof event.scaffold !== "number" || event.scaffold < 0 || event.scaffold > 3)
|
|
106
|
+
errors.push(`invalid scaffold: ${String(event.scaffold)}`);
|
|
107
|
+
if (typeof event.confidence !== "number" || event.confidence < 0 || event.confidence > 1)
|
|
108
|
+
errors.push(`invalid confidence: ${String(event.confidence)}`);
|
|
109
|
+
return errors;
|
|
110
|
+
}
|
|
111
|
+
const tpcCommon = { family: "tpc/clinical", hashField: "hash", prevField: "prev_hash", genesis: "genesis", validate: tpcValidate };
|
|
112
|
+
export const TPC_CLINICAL_V1 = {
|
|
113
|
+
...tpcCommon, id: "tpc/clinical-v1", since: "2026-08-31",
|
|
114
|
+
applies: (e) => !hasEventKind(e) && !isCommitEvent(e),
|
|
115
|
+
canonical: (e) => JSON.stringify(tpcArray(e, 1)),
|
|
116
|
+
};
|
|
117
|
+
/** 2026-09-10 (teachproof ac9375b): triage_class and engine_version join the hash, null when absent. */
|
|
118
|
+
export const TPC_CLINICAL_V2 = {
|
|
119
|
+
...tpcCommon, id: "tpc/clinical-v2", since: "2026-09-10",
|
|
120
|
+
applies: (e) => !hasEventKind(e) && !isCommitEvent(e),
|
|
121
|
+
canonical: (e) => JSON.stringify(tpcArray(e, 2)),
|
|
122
|
+
};
|
|
123
|
+
/** 2026-09-14: mapping_version joins the hash on events that carry it. */
|
|
124
|
+
export const TPC_CLINICAL_V3 = {
|
|
125
|
+
...tpcCommon, id: "tpc/clinical-v3", since: "2026-09-14",
|
|
126
|
+
applies: (e) => e.mapping_version !== undefined && !hasEventKind(e) && !isCommitEvent(e),
|
|
127
|
+
canonical: (e) => JSON.stringify(tpcArray(e, 3)),
|
|
128
|
+
coexists: ["tpc/clinical-v4"],
|
|
129
|
+
};
|
|
130
|
+
const TPC_EVENT_KIND = /^[a-z]+\.[a-z_]+$/;
|
|
131
|
+
/**
|
|
132
|
+
* 2026-09-25 (teachproof schema 0.4, TPC-SPEC-002 A6): an event may carry
|
|
133
|
+
* event_kind ("chart.view", "chart.item", ...) and a per-kind payload. Both
|
|
134
|
+
* join the hash: the v3 fields (mapping_version null when absent), then
|
|
135
|
+
* event_kind, then the payload with its keys sorted at every depth. Only
|
|
136
|
+
* events with event_kind use it; the rest of the chain stays v3.
|
|
137
|
+
*/
|
|
138
|
+
export const TPC_CLINICAL_V4 = {
|
|
139
|
+
...tpcCommon, id: "tpc/clinical-v4", since: "2026-09-25",
|
|
140
|
+
applies: (e) => hasEventKind(e) && !isCommitEvent(e),
|
|
141
|
+
canonical: (e) => JSON.stringify(tpcArray(e, 4)),
|
|
142
|
+
validate: (e) => {
|
|
143
|
+
const errors = tpcValidate(e);
|
|
144
|
+
if (typeof e.event_kind !== "string" || !TPC_EVENT_KIND.test(e.event_kind))
|
|
145
|
+
errors.push(`invalid event_kind: ${String(e.event_kind)}`);
|
|
146
|
+
if (!e.payload || typeof e.payload !== "object" || Array.isArray(e.payload))
|
|
147
|
+
errors.push("payload must be an object");
|
|
148
|
+
return errors;
|
|
149
|
+
},
|
|
150
|
+
coexists: ["tpc/clinical-v3"],
|
|
151
|
+
};
|
|
152
|
+
// ── Play clinical events, schemaVersion "clin-1.0" (play/clinical) ────────
|
|
153
|
+
// Source of truth until this module: qlm-games
|
|
154
|
+
// src/lib/residency/clinical-event-schema.ts, computeEventHash().
|
|
155
|
+
// Canonical form is JSON.stringify of a recursively key-sorted object of the
|
|
156
|
+
// ten hashed fields. Genesis prevHash is the empty string.
|
|
157
|
+
const PLAY_HASHED_FIELDS = [
|
|
158
|
+
"eventId", "ts", "encounterId", "actor", "source", "type", "payload", "consentRef", "schemaVersion", "prevHash",
|
|
159
|
+
];
|
|
160
|
+
export const PLAY_CLINICAL_1_0 = {
|
|
161
|
+
id: "play/clinical-clin-1.0", family: "play/clinical", since: "2026-08-16",
|
|
162
|
+
hashField: "hash", prevField: "prevHash", genesis: "",
|
|
163
|
+
applies: (e) => e.schemaVersion === "clin-1.0",
|
|
164
|
+
canonical: (e) => {
|
|
165
|
+
const picked = {};
|
|
166
|
+
for (const f of PLAY_HASHED_FIELDS)
|
|
167
|
+
picked[f] = e[f];
|
|
168
|
+
return JSON.stringify(sortKeysDeep(picked));
|
|
169
|
+
},
|
|
170
|
+
validate: (e) => {
|
|
171
|
+
const errors = [];
|
|
172
|
+
if (e.schemaVersion !== "clin-1.0")
|
|
173
|
+
errors.push(`invalid schemaVersion: ${String(e.schemaVersion)}`);
|
|
174
|
+
for (const f of ["eventId", "ts", "encounterId", "type"]) {
|
|
175
|
+
if (typeof e[f] !== "string" || !e[f])
|
|
176
|
+
errors.push(`missing ${f}`);
|
|
177
|
+
}
|
|
178
|
+
return errors;
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
// ── Registry ──────────────────────────────────────────────────────────────
|
|
182
|
+
const ALL = [TPC_CLINICAL_V4, TPC_CLINICAL_V3, TPC_CLINICAL_V2, TPC_CLINICAL_V1, PLAY_CLINICAL_1_0, ...PRODUCT_SCHEMES];
|
|
183
|
+
export const SCHEMES = Object.freeze(Object.fromEntries(ALL.map((s) => [s.id, s])));
|
|
184
|
+
export function getScheme(id) {
|
|
185
|
+
const s = SCHEMES[id];
|
|
186
|
+
if (!s)
|
|
187
|
+
throw new Error(`unknown chain scheme: ${id} (known: ${Object.keys(SCHEMES).join(", ")})`);
|
|
188
|
+
return s;
|
|
189
|
+
}
|
|
190
|
+
/** Schemes of a family, newest first — the order detection tries them in. */
|
|
191
|
+
export function familySchemes(family) {
|
|
192
|
+
const out = ALL.filter((s) => s.family === family);
|
|
193
|
+
if (out.length === 0)
|
|
194
|
+
throw new Error(`unknown chain family: ${family}`);
|
|
195
|
+
return out;
|
|
196
|
+
}
|
|
197
|
+
export function listSchemes() {
|
|
198
|
+
return ALL.map((s) => ({ id: s.id, family: s.family, since: s.since, hashField: s.hashField, prevField: s.prevField, link: linkOf(s), digest: s.digest ?? "sha256" }));
|
|
199
|
+
}
|
|
200
|
+
// ── Sealing and detection ─────────────────────────────────────────────────
|
|
201
|
+
export function computeEventHashWith(hash, event, schemeId, prev) {
|
|
202
|
+
const scheme = getScheme(schemeId);
|
|
203
|
+
return digestFor(scheme, hash)(scheme.canonical(event, prev));
|
|
204
|
+
}
|
|
205
|
+
export async function computeEventHashAsyncWith(hash, event, schemeId, prev) {
|
|
206
|
+
const scheme = getScheme(schemeId);
|
|
207
|
+
if (scheme.digest && scheme.digest !== "sha256")
|
|
208
|
+
return digestFor(scheme, () => "")(scheme.canonical(event, prev));
|
|
209
|
+
const full = await hash(scheme.canonical(event, prev));
|
|
210
|
+
return scheme.truncate ? full.slice(0, scheme.truncate) : full;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Returns a copy of `event` with the scheme's hash field set. Never mutates the
|
|
214
|
+
* input. `prev` is required for implicit-link schemes (the previous record's
|
|
215
|
+
* hash, or the genesis value for the first record).
|
|
216
|
+
*/
|
|
217
|
+
export function sealEventWith(hash, event, schemeId, prev) {
|
|
218
|
+
const scheme = getScheme(schemeId);
|
|
219
|
+
if (linkOf(scheme) === "implicit" && prev === undefined)
|
|
220
|
+
throw new Error(`${schemeId}: prev is required (implicit link)`);
|
|
221
|
+
const { [scheme.hashField]: _drop, ...rest } = event;
|
|
222
|
+
void _drop;
|
|
223
|
+
return { ...rest, [scheme.hashField]: digestFor(scheme, hash)(scheme.canonical(rest, prev)) };
|
|
224
|
+
}
|
|
225
|
+
/** Which scheme of `family` the event's stored hash was sealed under, or null. Tries newest first. */
|
|
226
|
+
export function detectSchemeWith(hash, event, family, prev) {
|
|
227
|
+
for (const s of familySchemes(family)) {
|
|
228
|
+
if (!s.applies(event))
|
|
229
|
+
continue;
|
|
230
|
+
if (event[s.hashField] === digestFor(s, hash)(s.canonical(event, prev)))
|
|
231
|
+
return s.id;
|
|
232
|
+
}
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
const isAbsent = (v) => v === undefined || v === null;
|
|
236
|
+
export function verifyChainWith(hash, events, opts) {
|
|
237
|
+
if (!opts.scheme && !opts.family)
|
|
238
|
+
throw new Error("verifyChain: pass { family } or { scheme }");
|
|
239
|
+
const candidates = opts.scheme ? [getScheme(opts.scheme)] : familySchemes(opts.family);
|
|
240
|
+
const { hashField, prevField, genesis } = candidates[0];
|
|
241
|
+
const link = linkOf(candidates[0]);
|
|
242
|
+
const rejectMixed = opts.rejectMixed ?? true;
|
|
243
|
+
const errors = [];
|
|
244
|
+
const seen = new Set();
|
|
245
|
+
const perScheme = {};
|
|
246
|
+
let gaps = 0, duplicates = 0, tampered = 0, schemaErrors = 0;
|
|
247
|
+
events.forEach((e, i) => {
|
|
248
|
+
// The previous record's stored hash, threaded for implicit-link schemes.
|
|
249
|
+
const prev = i === 0 ? (genesis ?? "") : String(events[i - 1][hashField] ?? "");
|
|
250
|
+
let matched = null;
|
|
251
|
+
for (const s of candidates) {
|
|
252
|
+
if (!s.applies(e))
|
|
253
|
+
continue;
|
|
254
|
+
if (e[hashField] === digestFor(s, hash)(s.canonical(e, prev))) {
|
|
255
|
+
matched = s;
|
|
256
|
+
break;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
// Schema errors are reported under the matched scheme, or the family's newest applicable one.
|
|
260
|
+
const schemeForSchema = matched ?? candidates.find((s) => s.applies(e)) ?? candidates[candidates.length - 1];
|
|
261
|
+
for (const err of schemeForSchema.validate(e)) {
|
|
262
|
+
errors.push(`[${i}] ${err}`);
|
|
263
|
+
schemaErrors++;
|
|
264
|
+
}
|
|
265
|
+
if (matched)
|
|
266
|
+
perScheme[matched.id] = (perScheme[matched.id] ?? 0) + 1;
|
|
267
|
+
else {
|
|
268
|
+
errors.push(`[${i}] hash mismatch (tampered)`);
|
|
269
|
+
tampered++;
|
|
270
|
+
}
|
|
271
|
+
const h = e[hashField];
|
|
272
|
+
if (link === "explicit" && prevField) {
|
|
273
|
+
if (i === 0) {
|
|
274
|
+
const ok = genesis === null ? isAbsent(e[prevField]) : e[prevField] === genesis;
|
|
275
|
+
if (!ok) {
|
|
276
|
+
errors.push(`[${i}] first event ${prevField} must be ${genesis === null ? "absent" : JSON.stringify(genesis)}`);
|
|
277
|
+
gaps++;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
else if (e[prevField] !== events[i - 1][hashField]) {
|
|
281
|
+
errors.push(`[${i}] chain gap`);
|
|
282
|
+
gaps++;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
if (typeof h === "string") {
|
|
286
|
+
if (seen.has(h)) {
|
|
287
|
+
errors.push(`[${i}] duplicate hash`);
|
|
288
|
+
duplicates++;
|
|
289
|
+
}
|
|
290
|
+
seen.add(h);
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
const ids = Object.keys(perScheme);
|
|
294
|
+
// Schemes that declare they coexist do not make a chain mixed; the chain
|
|
295
|
+
// reports the newest of them (family order is newest first).
|
|
296
|
+
const coexist = (a, b) => (getScheme(a).coexists ?? []).includes(b) || (getScheme(b).coexists ?? []).includes(a);
|
|
297
|
+
const mixed = ids.some((a, i) => ids.slice(i + 1).some((b) => !coexist(a, b)));
|
|
298
|
+
const newest = candidates.find((s) => ids.includes(s.id))?.id;
|
|
299
|
+
const hashScheme = ids.length === 0 ? "none" : !mixed ? (ids.length === 1 ? ids[0] : newest) : "mixed";
|
|
300
|
+
if (mixed && rejectMixed) {
|
|
301
|
+
errors.push(`mixed hash schemes: ${ids.map((id) => `${perScheme[id]} ${id}`).join(", ")}`);
|
|
302
|
+
}
|
|
303
|
+
return {
|
|
304
|
+
clean: errors.length === 0,
|
|
305
|
+
errors,
|
|
306
|
+
stats: { total: events.length, gaps, duplicates, tampered, schema_errors: schemaErrors, hash_scheme: hashScheme, schemes: perScheme },
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schemes/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ChainEvent, type VerifyChainOptions, type ChainVerification } from "./index.js";
|
|
2
|
+
export declare const sha256Hex: (s: string) => string;
|
|
3
|
+
export declare const computeEventHash: (event: ChainEvent, schemeId: string, prev?: string) => string;
|
|
4
|
+
export declare const sealEvent: <E extends ChainEvent>(event: E, schemeId: string, prev?: string) => E;
|
|
5
|
+
export declare const detectScheme: (event: ChainEvent, family: string, prev?: string) => string | null;
|
|
6
|
+
export declare const verifyChain: (events: ChainEvent[], opts: VerifyChainOptions) => ChainVerification;
|
|
7
|
+
export * from "./index.js";
|
|
8
|
+
//# sourceMappingURL=node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/schemes/node.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,KAAK,UAAU,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EACjE,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,KAAG,MAAsD,CAAC;AAE7F,eAAO,MAAM,gBAAgB,GAAI,OAAO,UAAU,EAAE,UAAU,MAAM,EAAE,OAAO,MAAM,KAAG,MAC9B,CAAC;AAEzD,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,UAAU,EAAE,OAAO,CAAC,EAAE,UAAU,MAAM,EAAE,OAAO,MAAM,KAAG,CAC3C,CAAC;AAElD,eAAO,MAAM,YAAY,GAAI,OAAO,UAAU,EAAE,QAAQ,MAAM,EAAE,OAAO,MAAM,KAAG,MAAM,GAAG,IACvC,CAAC;AAEnD,eAAO,MAAM,WAAW,GAAI,QAAQ,UAAU,EAAE,EAAE,MAAM,kBAAkB,KAAG,iBACnC,CAAC;AAE3C,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node binding for the chain schemes: SHA-256 from `node:crypto`, and the
|
|
3
|
+
* sealing / detection / verification functions with the hash pre-bound.
|
|
4
|
+
* Client components import from "qlm-measure/schemes" and supply their own
|
|
5
|
+
* `HashFn` (e.g. Web Crypto) instead.
|
|
6
|
+
*/
|
|
7
|
+
import { createHash } from "crypto";
|
|
8
|
+
import { computeEventHashWith, sealEventWith, detectSchemeWith, verifyChainWith, } from "./index.js";
|
|
9
|
+
export const sha256Hex = (s) => createHash("sha256").update(s).digest("hex");
|
|
10
|
+
export const computeEventHash = (event, schemeId, prev) => computeEventHashWith(sha256Hex, event, schemeId, prev);
|
|
11
|
+
export const sealEvent = (event, schemeId, prev) => sealEventWith(sha256Hex, event, schemeId, prev);
|
|
12
|
+
export const detectScheme = (event, family, prev) => detectSchemeWith(sha256Hex, event, family, prev);
|
|
13
|
+
export const verifyChain = (events, opts) => verifyChainWith(sha256Hex, events, opts);
|
|
14
|
+
export * from "./index.js";
|
|
15
|
+
//# sourceMappingURL=node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/schemes/node.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EACL,oBAAoB,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,GAEvE,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAE7F,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAiB,EAAE,QAAgB,EAAE,IAAa,EAAU,EAAE,CAC7F,oBAAoB,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;AAEzD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAuB,KAAQ,EAAE,QAAgB,EAAE,IAAa,EAAK,EAAE,CAC9F,aAAa,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;AAElD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAiB,EAAE,MAAc,EAAE,IAAa,EAAiB,EAAE,CAC9F,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAEnD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAoB,EAAE,IAAwB,EAAqB,EAAE,CAC/F,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAE3C,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Product envelope schemes — the per-record hashes QLM products seal besides
|
|
3
|
+
* the clinical chains in ./index.ts. Each is a verbatim, named definition of
|
|
4
|
+
* what the product's own code hashed on the date given; the vectors in
|
|
5
|
+
* schema/vectors/chains were generated from the original functions.
|
|
6
|
+
*
|
|
7
|
+
* This file imports only types from ./index.ts so the two modules do not form
|
|
8
|
+
* a runtime cycle. Python twin: python/qlm_measure/schemes.py.
|
|
9
|
+
*/
|
|
10
|
+
import type { ChainScheme } from "./index.js";
|
|
11
|
+
export declare const PLAY_EMIT_1: ChainScheme;
|
|
12
|
+
export declare const PLAY_MEASURE_SESSION_1: ChainScheme;
|
|
13
|
+
export declare const PLAY_ENCOUNTER_FNV64_1: ChainScheme;
|
|
14
|
+
export declare const PLAY_RESEARCH_PROVENANCE_1: ChainScheme;
|
|
15
|
+
export declare const QCORE_QINVERSE_DJB2_1: ChainScheme;
|
|
16
|
+
export declare const STUDIO_LOOP_1: ChainScheme;
|
|
17
|
+
export declare function canonicalizeRfc8785(value: unknown): string;
|
|
18
|
+
export declare const DP_LEDGER_V3: ChainScheme;
|
|
19
|
+
export declare const TPC_DSE_JOURNAL_1: ChainScheme;
|
|
20
|
+
export declare const YARDSTICK_SPINE_1: ChainScheme;
|
|
21
|
+
export declare function sortObjectLocale(value: unknown): unknown;
|
|
22
|
+
export declare const LABPATH_LEARNING_EVIDENCE_V1: ChainScheme;
|
|
23
|
+
export declare const TPC_TRANSCRIPT_1: ChainScheme;
|
|
24
|
+
export declare const TPC_DIFFERENTIAL_COMMIT_1: ChainScheme;
|
|
25
|
+
export declare const TPC_DIFFERENTIAL_COMMIT_2: ChainScheme;
|
|
26
|
+
export declare const TPC_RCT_INPUT_1: ChainScheme;
|
|
27
|
+
export declare const PLAY_WORLD_TRACE_IDENTITY_1: ChainScheme;
|
|
28
|
+
export declare const PLAY_WORLD_TRACE_TSIM_1: ChainScheme;
|
|
29
|
+
export declare const PLAY_WORLD_TRACE_1: ChainScheme;
|
|
30
|
+
export declare const TPC_YARDSTICK_RECORD_2: ChainScheme;
|
|
31
|
+
export declare const TPC_YARDSTICK_RECORD_1: ChainScheme;
|
|
32
|
+
export declare const TPC_INTERVENTION_1: ChainScheme;
|
|
33
|
+
export declare const TPC_REHEARSAL_STAGE_1: ChainScheme;
|
|
34
|
+
export declare const YARDSTICK_ACTIVITY_1: ChainScheme;
|
|
35
|
+
export declare const PRODUCT_SCHEMES: ChainScheme[];
|
|
36
|
+
//# sourceMappingURL=products.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"products.d.ts","sourceRoot":"","sources":["../../src/schemes/products.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAc,WAAW,EAAE,MAAM,YAAY,CAAC;AAoB1D,eAAO,MAAM,WAAW,EAAE,WAazB,CAAC;AAQF,eAAO,MAAM,sBAAsB,EAAE,WAgBpC,CAAC;AAQF,eAAO,MAAM,sBAAsB,EAAE,WAapC,CAAC;AAQF,eAAO,MAAM,0BAA0B,EAAE,WAqBxC,CAAC;AAQF,eAAO,MAAM,qBAAqB,EAAE,WAWnC,CAAC;AAQF,eAAO,MAAM,aAAa,EAAE,WAe3B,CAAC;AAUF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAgB1D;AAQD,eAAO,MAAM,YAAY,EAAE,WAoB1B,CAAC;AAMF,eAAO,MAAM,iBAAiB,EAAE,WAW/B,CAAC;AAMF,eAAO,MAAM,iBAAiB,EAAE,WAc/B,CAAC;AAOF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQxD;AACD,eAAO,MAAM,4BAA4B,EAAE,WAc1C,CAAC;AAOF,eAAO,MAAM,gBAAgB,EAAE,WAS9B,CAAC;AA2CF,eAAO,MAAM,yBAAyB,EAAE,WASvC,CAAC;AAkEF,eAAO,MAAM,yBAAyB,EAAE,WAOvC,CAAC;AAOF,eAAO,MAAM,eAAe,EAAE,WAS7B,CAAC;AA8BF,eAAO,MAAM,2BAA2B,EAAE,WAKzC,CAAC;AACF,eAAO,MAAM,uBAAuB,EAAE,WAIrC,CAAC;AACF,eAAO,MAAM,kBAAkB,EAAE,WAIhC,CAAC;AA6BF,eAAO,MAAM,sBAAsB,EAAE,WAIpC,CAAC;AACF,eAAO,MAAM,sBAAsB,EAAE,WAIpC,CAAC;AAMF,eAAO,MAAM,kBAAkB,EAAE,WAUhC,CAAC;AAMF,eAAO,MAAM,qBAAqB,EAAE,WAYnC,CAAC;AAUF,eAAO,MAAM,oBAAoB,EAAE,WAelC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,WAAW,EAMxC,CAAC"}
|