@smartmemory/stratum 0.3.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.
Files changed (81) hide show
  1. package/dist/cli/guard.js +91 -0
  2. package/dist/cli/guard.js.map +1 -0
  3. package/dist/cli/mcp_install.js +302 -0
  4. package/dist/cli/mcp_install.js.map +1 -0
  5. package/dist/cli/query_gate.js +316 -0
  6. package/dist/cli/query_gate.js.map +1 -0
  7. package/dist/cli/stratum.js +291 -0
  8. package/dist/cli/stratum.js.map +1 -0
  9. package/dist/connectors/background.js +531 -0
  10. package/dist/connectors/background.js.map +1 -0
  11. package/dist/connectors/base.js +12 -0
  12. package/dist/connectors/base.js.map +1 -0
  13. package/dist/connectors/claude-bg-worker.js +99 -0
  14. package/dist/connectors/claude-bg-worker.js.map +1 -0
  15. package/dist/connectors/claude.js +170 -0
  16. package/dist/connectors/claude.js.map +1 -0
  17. package/dist/connectors/codex.js +319 -0
  18. package/dist/connectors/codex.js.map +1 -0
  19. package/dist/connectors/index.js +7 -0
  20. package/dist/connectors/index.js.map +1 -0
  21. package/dist/connectors/proc_identity.js +90 -0
  22. package/dist/connectors/proc_identity.js.map +1 -0
  23. package/dist/connectors/runner.js +63 -0
  24. package/dist/connectors/runner.js.map +1 -0
  25. package/dist/contracts/events.json +65 -0
  26. package/dist/contracts/mcp-surface.json +215 -0
  27. package/dist/engine/checkpoint.js +50 -0
  28. package/dist/engine/checkpoint.js.map +1 -0
  29. package/dist/engine/engine.js +2356 -0
  30. package/dist/engine/engine.js.map +1 -0
  31. package/dist/engine/ledger.js +36 -0
  32. package/dist/engine/ledger.js.map +1 -0
  33. package/dist/engine/state.js +42 -0
  34. package/dist/engine/state.js.map +1 -0
  35. package/dist/eval/expr.js +679 -0
  36. package/dist/eval/expr.js.map +1 -0
  37. package/dist/eval/files.js +130 -0
  38. package/dist/eval/files.js.map +1 -0
  39. package/dist/guard/canonical.js +116 -0
  40. package/dist/guard/canonical.js.map +1 -0
  41. package/dist/guard/errors.js +80 -0
  42. package/dist/guard/errors.js.map +1 -0
  43. package/dist/guard/evidence.js +475 -0
  44. package/dist/guard/evidence.js.map +1 -0
  45. package/dist/guard/fingerprint.js +13 -0
  46. package/dist/guard/fingerprint.js.map +1 -0
  47. package/dist/guard/lock.js +360 -0
  48. package/dist/guard/lock.js.map +1 -0
  49. package/dist/guard/store.js +396 -0
  50. package/dist/guard/store.js.map +1 -0
  51. package/dist/guard/transition.js +477 -0
  52. package/dist/guard/transition.js.map +1 -0
  53. package/dist/ir/refs.js +69 -0
  54. package/dist/ir/refs.js.map +1 -0
  55. package/dist/ir/schema.js +123 -0
  56. package/dist/ir/schema.js.map +1 -0
  57. package/dist/ir/validate.js +595 -0
  58. package/dist/ir/validate.js.map +1 -0
  59. package/dist/judge/codex_judged.js +85 -0
  60. package/dist/judge/codex_judged.js.map +1 -0
  61. package/dist/judge/fixture_judged.js +62 -0
  62. package/dist/judge/fixture_judged.js.map +1 -0
  63. package/dist/judge/judged.js +89 -0
  64. package/dist/judge/judged.js.map +1 -0
  65. package/dist/judge/pricing.js +22 -0
  66. package/dist/judge/pricing.js.map +1 -0
  67. package/dist/mcp/contracts.js +162 -0
  68. package/dist/mcp/contracts.js.map +1 -0
  69. package/dist/mcp/main.js +7 -0
  70. package/dist/mcp/main.js.map +1 -0
  71. package/dist/mcp/server.js +370 -0
  72. package/dist/mcp/server.js.map +1 -0
  73. package/dist/migrate/check.js +164 -0
  74. package/dist/migrate/check.js.map +1 -0
  75. package/dist/parallel/certificate.js +37 -0
  76. package/dist/parallel/certificate.js.map +1 -0
  77. package/dist/parallel/evaluate.js +73 -0
  78. package/dist/parallel/evaluate.js.map +1 -0
  79. package/dist/speckit/compiler.js +162 -0
  80. package/dist/speckit/compiler.js.map +1 -0
  81. package/package.json +47 -0
@@ -0,0 +1,475 @@
1
+ /**
2
+ * Server-side evaluator for the four trusted guard-evidence builtins.
3
+ *
4
+ * This module intentionally handles only trusted predicates. Callers route
5
+ * `verified` and `judged` predicates to the judge backend before/after this
6
+ * evaluation; `evaluateEvidence` skips those tiers defensively for that split.
7
+ */
8
+ import { spawn } from "node:child_process";
9
+ import { realpath, stat } from "node:fs/promises";
10
+ import { basename, dirname, isAbsolute, relative, resolve, sep } from "node:path";
11
+ import { EvidenceParseError } from "./errors.js";
12
+ export { EvidenceParseError } from "./errors.js";
13
+ export const TRUSTED_BUILTINS = new Set([
14
+ "server_file_exists",
15
+ "git_commit_exists",
16
+ "command_exit_zero",
17
+ "verdict_receipt_clean",
18
+ ]);
19
+ const DEFAULT_COMMAND_TIMEOUT_SECONDS = 120;
20
+ const NO_WORKSPACE_ROOT_REASON = "no workspace_root registered for trusted file/command/git evidence";
21
+ /** Match Python's opt-in command gate exactly. */
22
+ export function commandsAllowed(env = process.env) {
23
+ return env.STRATUM_GUARD_ALLOW_COMMANDS === "1";
24
+ }
25
+ /** Match Python's `int(env or default)` fallback for malformed values. */
26
+ export function commandTimeoutSeconds(env = process.env) {
27
+ const value = env.STRATUM_GUARD_CMD_TIMEOUT_S;
28
+ if (value === undefined || value.trim() === "")
29
+ return DEFAULT_COMMAND_TIMEOUT_SECONDS;
30
+ const parsed = Number(value);
31
+ return Number.isInteger(parsed) ? parsed : DEFAULT_COMMAND_TIMEOUT_SECONDS;
32
+ }
33
+ /** Enough of Python's `str.__repr__` for the evidence messages it exposes. */
34
+ function pythonStringRepr(value) {
35
+ let encoded = "'";
36
+ for (let index = 0; index < value.length; index += 1) {
37
+ const char = value[index];
38
+ const code = char.charCodeAt(0);
39
+ if (char === "\\")
40
+ encoded += "\\\\";
41
+ else if (char === "'")
42
+ encoded += "\\'";
43
+ else if (char === "\n")
44
+ encoded += "\\n";
45
+ else if (char === "\r")
46
+ encoded += "\\r";
47
+ else if (char === "\t")
48
+ encoded += "\\t";
49
+ else if (code < 0x20 || code === 0x7f)
50
+ encoded += `\\x${code.toString(16).padStart(2, "0")}`;
51
+ else
52
+ encoded += char;
53
+ }
54
+ return `${encoded}'`;
55
+ }
56
+ function pythonStringListRepr(values) {
57
+ return `[${values.map(pythonStringRepr).join(", ")}]`;
58
+ }
59
+ function isIdentifierStart(char) {
60
+ return (char >= "A" && char <= "Z") || (char >= "a" && char <= "z") || char === "_";
61
+ }
62
+ function isWhitespace(char) {
63
+ return char === " " || char === "\t" || char === "\n" || char === "\r" || char === "\v" || char === "\f";
64
+ }
65
+ function isTrustedBuiltin(name) {
66
+ return TRUSTED_BUILTINS.has(name);
67
+ }
68
+ function isIdentifierPart(char) {
69
+ return isIdentifierStart(char) || (char >= "0" && char <= "9");
70
+ }
71
+ function isHex(char) {
72
+ return (char >= "0" && char <= "9") || (char >= "a" && char <= "f") || (char >= "A" && char <= "F");
73
+ }
74
+ /** Hand-rolled grammar for the deliberately tiny trusted-evidence language. */
75
+ class PredicateStatementParser {
76
+ index = 0;
77
+ statement;
78
+ constructor(statement) { this.statement = statement; }
79
+ parse() {
80
+ this.skipWhitespace();
81
+ const name = this.parseIdentifier();
82
+ if (name === undefined)
83
+ this.singleCallError();
84
+ this.skipWhitespace();
85
+ if (this.current() !== "(")
86
+ this.singleCallError();
87
+ this.index += 1;
88
+ if (!isTrustedBuiltin(name)) {
89
+ throw new EvidenceParseError(`unknown trusted builtin ${pythonStringRepr(name)} in ${pythonStringRepr(this.statement)}`);
90
+ }
91
+ const args = [];
92
+ this.skipWhitespace();
93
+ if (this.current() !== ")") {
94
+ while (true) {
95
+ if (this.isKeywordArgument()) {
96
+ throw new EvidenceParseError(`keyword args not allowed: ${pythonStringRepr(this.statement)}`);
97
+ }
98
+ args.push(this.parseLiteral());
99
+ this.skipWhitespace();
100
+ if (this.current() === ")")
101
+ break;
102
+ if (this.current() !== ",")
103
+ this.literalError();
104
+ this.index += 1;
105
+ this.skipWhitespace();
106
+ // Python accepts a trailing comma in a call.
107
+ if (this.current() === ")")
108
+ break;
109
+ }
110
+ }
111
+ this.index += 1;
112
+ this.skipWhitespace();
113
+ if (this.index !== this.statement.length)
114
+ this.singleCallError();
115
+ return { name, args };
116
+ }
117
+ current() {
118
+ return this.statement[this.index];
119
+ }
120
+ skipWhitespace() {
121
+ while (this.current() !== undefined && isWhitespace(this.current()))
122
+ this.index += 1;
123
+ }
124
+ parseIdentifier() {
125
+ const first = this.current();
126
+ if (first === undefined || !isIdentifierStart(first))
127
+ return undefined;
128
+ const start = this.index;
129
+ this.index += 1;
130
+ while (this.current() !== undefined && isIdentifierPart(this.current()))
131
+ this.index += 1;
132
+ return this.statement.slice(start, this.index);
133
+ }
134
+ isKeywordArgument() {
135
+ const saved = this.index;
136
+ const name = this.parseIdentifier();
137
+ if (name === undefined)
138
+ return false;
139
+ this.skipWhitespace();
140
+ const keyword = this.current() === "=";
141
+ this.index = saved;
142
+ return keyword;
143
+ }
144
+ parseLiteral() {
145
+ const char = this.current();
146
+ if (char === "'" || char === '"')
147
+ return this.parseString();
148
+ if (char === "[")
149
+ return this.parseStringArray();
150
+ // Decision 4 deliberately accepts only strings and arrays of strings.
151
+ // Unlike Python's literal_eval, other literal forms fail closed as
152
+ // evidence_parse_error rather than being interpreted by this trusted DSL.
153
+ this.literalError();
154
+ }
155
+ parseStringArray() {
156
+ this.index += 1;
157
+ const values = [];
158
+ this.skipWhitespace();
159
+ if (this.current() !== "]") {
160
+ while (true) {
161
+ const char = this.current();
162
+ if (char !== "'" && char !== '"')
163
+ this.literalError();
164
+ values.push(this.parseString());
165
+ this.skipWhitespace();
166
+ if (this.current() === "]")
167
+ break;
168
+ if (this.current() !== ",")
169
+ this.literalError();
170
+ this.index += 1;
171
+ this.skipWhitespace();
172
+ // Python accepts a trailing comma in a list literal.
173
+ if (this.current() === "]")
174
+ break;
175
+ }
176
+ }
177
+ this.index += 1;
178
+ return values;
179
+ }
180
+ parseString() {
181
+ const quote = this.current();
182
+ if (quote !== "'" && quote !== '"')
183
+ this.literalError();
184
+ this.index += 1;
185
+ let value = "";
186
+ while (true) {
187
+ const char = this.current();
188
+ if (char === undefined || char === "\n" || char === "\r")
189
+ this.literalError();
190
+ if (char === quote) {
191
+ this.index += 1;
192
+ return value;
193
+ }
194
+ if (char !== "\\") {
195
+ value += char;
196
+ this.index += 1;
197
+ continue;
198
+ }
199
+ this.index += 1;
200
+ value += this.parseEscape();
201
+ }
202
+ }
203
+ parseEscape() {
204
+ const escaped = this.current();
205
+ if (escaped === undefined)
206
+ this.literalError();
207
+ this.index += 1;
208
+ const simple = {
209
+ a: "\u0007", b: "\b", f: "\f", n: "\n", r: "\r", t: "\t", v: "\v",
210
+ "\\": "\\", "'": "'", '"': '"',
211
+ };
212
+ const mapped = simple[escaped];
213
+ if (mapped !== undefined)
214
+ return mapped;
215
+ if (escaped === "\n")
216
+ return "";
217
+ if (escaped === "\r") {
218
+ if (this.current() === "\n")
219
+ this.index += 1;
220
+ return "";
221
+ }
222
+ if (escaped === "x")
223
+ return String.fromCodePoint(this.parseHexValue(2));
224
+ if (escaped === "u")
225
+ return String.fromCodePoint(this.parseHexValue(4));
226
+ if (escaped === "U") {
227
+ const codePoint = this.parseHexValue(8);
228
+ if (codePoint > 0x10ffff)
229
+ this.literalError();
230
+ return String.fromCodePoint(codePoint);
231
+ }
232
+ if (escaped >= "0" && escaped <= "7") {
233
+ let digits = escaped;
234
+ while (digits.length < 3) {
235
+ const next = this.current();
236
+ if (next === undefined || next < "0" || next > "7")
237
+ break;
238
+ digits += next;
239
+ this.index += 1;
240
+ }
241
+ return String.fromCharCode(Number.parseInt(digits, 8));
242
+ }
243
+ // Python preserves unknown escape sequences (and emits a warning), rather
244
+ // than interpreting them as JavaScript escapes.
245
+ return `\\${escaped}`;
246
+ }
247
+ parseHexValue(length) {
248
+ const start = this.index;
249
+ for (let offset = 0; offset < length; offset += 1) {
250
+ const char = this.current();
251
+ if (char === undefined || !isHex(char))
252
+ this.literalError();
253
+ this.index += 1;
254
+ }
255
+ return Number.parseInt(this.statement.slice(start, this.index), 16);
256
+ }
257
+ singleCallError() {
258
+ throw new EvidenceParseError(`predicate must be a single call: ${pythonStringRepr(this.statement)}`);
259
+ }
260
+ literalError() {
261
+ throw new EvidenceParseError(`predicate args must be literals: ${pythonStringRepr(this.statement)}`);
262
+ }
263
+ }
264
+ /** Parse `name(literal, ...)` without evaluating arbitrary JavaScript. */
265
+ export function parsePredicateStatement(statement) {
266
+ return new PredicateStatementParser(statement).parse();
267
+ }
268
+ export function statementIsTrusted(statement) {
269
+ try {
270
+ parsePredicateStatement(statement);
271
+ return true;
272
+ }
273
+ catch (error) {
274
+ if (error instanceof EvidenceParseError)
275
+ return false;
276
+ throw error;
277
+ }
278
+ }
279
+ export function statementUsesCommand(statement) {
280
+ try {
281
+ return parsePredicateStatement(statement).name === "command_exit_zero";
282
+ }
283
+ catch (error) {
284
+ if (error instanceof EvidenceParseError)
285
+ return false;
286
+ throw error;
287
+ }
288
+ }
289
+ function isInside(base, target) {
290
+ const path = relative(base, target);
291
+ return path === "" || (path !== ".." && !path.startsWith(`..${sep}`) && !isAbsolute(path));
292
+ }
293
+ /**
294
+ * Resolve a possibly-missing target as Python's `(base / rel).resolve()` does:
295
+ * resolve every extant parent symlink, then refuse a resolved target outside
296
+ * the resolved workspace base.
297
+ */
298
+ async function resolveUnder(workspaceRoot, rel) {
299
+ let base;
300
+ try {
301
+ base = await realpath(workspaceRoot);
302
+ }
303
+ catch {
304
+ // Path.resolve(strict=False) still produces a usable lexical base when a
305
+ // registered root has disappeared; the later stat simply reports missing.
306
+ base = resolve(workspaceRoot);
307
+ }
308
+ let candidate;
309
+ try {
310
+ candidate = resolve(base, rel);
311
+ }
312
+ catch {
313
+ return undefined;
314
+ }
315
+ if (!isInside(base, candidate))
316
+ return undefined;
317
+ const suffix = [];
318
+ let existing = candidate;
319
+ while (true) {
320
+ try {
321
+ const realExisting = await realpath(existing);
322
+ const target = resolve(realExisting, ...suffix);
323
+ return isInside(base, target) ? target : undefined;
324
+ }
325
+ catch {
326
+ const parent = dirname(existing);
327
+ if (parent === existing)
328
+ return undefined;
329
+ suffix.unshift(basename(existing));
330
+ existing = parent;
331
+ }
332
+ }
333
+ }
334
+ async function evaluateServerFileExists(workspaceRoot, args) {
335
+ if (args.length !== 1 || typeof args[0] !== "string") {
336
+ return [false, "server_file_exists expects one string path"];
337
+ }
338
+ const rel = args[0];
339
+ const target = await resolveUnder(workspaceRoot, rel);
340
+ if (target === undefined)
341
+ return [false, `path escapes workspace_root: ${pythonStringRepr(rel)}`];
342
+ try {
343
+ const exists = (await stat(target)).isFile();
344
+ return [exists, `${rel} ${exists ? "exists" : "missing"}`];
345
+ }
346
+ catch {
347
+ return [false, `${rel} missing`];
348
+ }
349
+ }
350
+ async function runCommand(command, args, cwd, timeoutSeconds) {
351
+ return new Promise((resolveOutcome) => {
352
+ let settled = false;
353
+ let timedOut = false;
354
+ let timer;
355
+ const finish = (outcome) => {
356
+ if (settled)
357
+ return;
358
+ settled = true;
359
+ if (timer !== undefined)
360
+ clearTimeout(timer);
361
+ resolveOutcome(outcome);
362
+ };
363
+ let child;
364
+ try {
365
+ child = spawn(command, args, { cwd, detached: true, stdio: "ignore" });
366
+ }
367
+ catch (error) {
368
+ finish({ kind: "error", error: error instanceof Error ? error.message : String(error) });
369
+ return;
370
+ }
371
+ timer = setTimeout(() => {
372
+ timedOut = true;
373
+ // Python's subprocess timeout path calls Popen.kill(), which is SIGKILL
374
+ // on POSIX. Kill the detached child's whole group so background
375
+ // descendants do not survive the timeout.
376
+ try {
377
+ if (child.pid === undefined)
378
+ throw new Error("child has no pid");
379
+ process.kill(-child.pid, "SIGKILL");
380
+ }
381
+ catch (error) {
382
+ const code = error.code;
383
+ if (code === "ESRCH" || code === "EPERM") {
384
+ try {
385
+ child.kill("SIGKILL");
386
+ }
387
+ catch {
388
+ // The child has already exited or cannot be signaled.
389
+ }
390
+ }
391
+ }
392
+ }, Math.max(0, timeoutSeconds) * 1000);
393
+ child.once("error", (error) => finish({ kind: "error", error: error.message }));
394
+ child.once("close", (code) => finish(timedOut
395
+ ? { kind: "timeout", command: [command, ...args], timeoutSeconds }
396
+ : { kind: "exit", code }));
397
+ });
398
+ }
399
+ async function evaluateGitCommitExists(workspaceRoot, args) {
400
+ if (args.length !== 1 || typeof args[0] !== "string") {
401
+ return [false, "git_commit_exists expects one sha string"];
402
+ }
403
+ const sha = args[0];
404
+ const outcome = await runCommand("git", ["rev-parse", "--verify", "--quiet", `${sha}^{commit}`], workspaceRoot, 5);
405
+ if (outcome.kind === "error")
406
+ return [false, `git rev-parse failed: ${outcome.error}`];
407
+ if (outcome.kind === "timeout") {
408
+ return [false, `git rev-parse failed: Command ${pythonStringListRepr(outcome.command)} timed out after ${outcome.timeoutSeconds} seconds`];
409
+ }
410
+ const met = outcome.code === 0;
411
+ return [met, `commit ${sha.slice(0, 12)} ${met ? "present" : "absent"}`];
412
+ }
413
+ async function evaluateCommandExitZero(workspaceRoot, args) {
414
+ if (!commandsAllowed())
415
+ return [false, "command execution disabled (set STRATUM_GUARD_ALLOW_COMMANDS=1)"];
416
+ if (args.length !== 1 || !Array.isArray(args[0]) || !args[0].every((value) => typeof value === "string")) {
417
+ return [false, "command_exit_zero expects one list[str]"];
418
+ }
419
+ const command = args[0];
420
+ if (command.length === 0)
421
+ return [false, "empty command"];
422
+ const outcome = await runCommand(command[0], command.slice(1), workspaceRoot, commandTimeoutSeconds());
423
+ if (outcome.kind === "error")
424
+ return [false, `command failed: ${outcome.error}`];
425
+ if (outcome.kind === "timeout") {
426
+ return [false, `command failed: Command ${pythonStringListRepr(outcome.command)} timed out after ${outcome.timeoutSeconds} seconds`];
427
+ }
428
+ const met = outcome.code === 0;
429
+ return [met, `${command[0]} exited ${String(outcome.code)}`];
430
+ }
431
+ function evaluateVerdictReceiptClean(args, ledgerEntries) {
432
+ if (args.length !== 1 || typeof args[0] !== "string") {
433
+ return [false, "verdict_receipt_clean expects one digest string"];
434
+ }
435
+ const digest = args[0];
436
+ const met = ledgerEntries.some((entry) => entry.entry_digest === digest && (entry.outcome === "applied" || entry.outcome === "review_clean"));
437
+ return [met, met ? `receipt ${digest.slice(0, 12)} found (clean)` : `no clean receipt for ${digest.slice(0, 12)}`];
438
+ }
439
+ /**
440
+ * Evaluate only trusted builtins, with AND semantics. `verified`/`judged`
441
+ * predicates are deliberately omitted because the transition caller routes
442
+ * them to the judge backend (the Python evaluator is normally called with
443
+ * only trusted predicates as well).
444
+ */
445
+ export async function evaluateEvidence(predicates, workspaceRoot, ledgerEntries) {
446
+ const perPredicate = [];
447
+ let met = true;
448
+ for (const predicate of predicates) {
449
+ if (predicate.type === "verified" || predicate.type === "judged")
450
+ continue;
451
+ const statement = typeof predicate.statement === "string" ? predicate.statement : "";
452
+ const { name, args } = parsePredicateStatement(statement);
453
+ let predicateMet;
454
+ let evidence;
455
+ if ((name === "server_file_exists" || name === "git_commit_exists" || name === "command_exit_zero") && !workspaceRoot) {
456
+ [predicateMet, evidence] = [false, NO_WORKSPACE_ROOT_REASON];
457
+ }
458
+ else if (name === "server_file_exists") {
459
+ [predicateMet, evidence] = await evaluateServerFileExists(workspaceRoot, args);
460
+ }
461
+ else if (name === "git_commit_exists") {
462
+ [predicateMet, evidence] = await evaluateGitCommitExists(workspaceRoot, args);
463
+ }
464
+ else if (name === "command_exit_zero") {
465
+ [predicateMet, evidence] = await evaluateCommandExitZero(workspaceRoot, args);
466
+ }
467
+ else {
468
+ [predicateMet, evidence] = evaluateVerdictReceiptClean(args, ledgerEntries);
469
+ }
470
+ perPredicate.push({ id: predicate.id, statement, met: predicateMet, evidence });
471
+ met = met && predicateMet;
472
+ }
473
+ return { met, perPredicate };
474
+ }
475
+ //# sourceMappingURL=evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../src/guard/evidence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /** Byte-compatible guard policy checksum. */
2
+ import { createHash } from "node:crypto";
3
+ import { canonicalJson } from "./canonical.js";
4
+ export function guardChecksum(graph, edgePredicates, terminal, stakes) {
5
+ const policy = {
6
+ graph: Object.fromEntries(Object.entries(graph).map(([key, targets]) => [key, [...targets]])),
7
+ edge_predicates: edgePredicates,
8
+ terminal: [...terminal].sort(),
9
+ stakes,
10
+ };
11
+ return createHash("sha256").update(canonicalJson(policy), "utf8").digest("hex");
12
+ }
13
+ //# sourceMappingURL=fingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../src/guard/fingerprint.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAE7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,MAAM,UAAU,aAAa,CAC3B,KAAiB,EACjB,cAA8B,EAC9B,QAAkB,EAClB,MAA8B;IAE9B,MAAM,MAAM,GAAG;QACb,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7F,eAAe,EAAE,cAAc;QAC/B,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE;QAC9B,MAAM;KACP,CAAC;IACF,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAClF,CAAC"}