@mikeargento/bitgraph-player 0.1.1 → 0.2.1
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 +31 -1
- package/SPEC.md +6 -1
- package/dist/__tests__/init-play.test.d.ts +2 -0
- package/dist/__tests__/init-play.test.d.ts.map +1 -0
- package/dist/__tests__/init-play.test.js +302 -0
- package/dist/__tests__/init-play.test.js.map +1 -0
- package/dist/cli.js +127 -60
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +26 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +104 -0
- package/dist/init.js.map +1 -0
- package/dist/play.d.ts +24 -0
- package/dist/play.d.ts.map +1 -0
- package/dist/play.js +61 -0
- package/dist/play.js.map +1 -0
- package/dist/verdict.d.ts +27 -1
- package/dist/verdict.d.ts.map +1 -1
- package/dist/verdict.js +11 -23
- package/dist/verdict.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/init-play.test.ts +358 -0
- package/src/cli.ts +137 -59
- package/src/index.ts +6 -2
- package/src/init.ts +118 -0
- package/src/play.ts +78 -0
- package/src/verdict.ts +12 -8
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,qFAAqF;AAErF
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Deterministic evaluation of causal rules over BitGraph proof bundles.
|
|
5
5
|
*
|
|
6
|
-
* BitGraph records. Player
|
|
6
|
+
* BitGraph records. Player evaluates.
|
|
7
7
|
*
|
|
8
8
|
* Player is a pure function over `runAudit()`'s output: same rule, same
|
|
9
9
|
* bundle, same verdict, on anyone's machine, with no network access at
|
|
@@ -13,10 +13,14 @@
|
|
|
13
13
|
export type { CastEntry, CastPin, Claim, DeclaredEntry, DerivedStep, EvidenceTier, OrderBasis, OrderResult, Resolution, Rule, ThreeValued, Verdict, } from "./types.js";
|
|
14
14
|
export { basisTier, meetsFloor } from "./types.js";
|
|
15
15
|
export { parseRule, normalizeDigest, RuleError } from "./rule.js";
|
|
16
|
+
export { play, playAudit, PlayError } from "./play.js";
|
|
17
|
+
export type { PlayResult, PlayStage } from "./play.js";
|
|
18
|
+
export { scaffoldRule, roleNameForFile, ORDERING_PLACEHOLDER } from "./init.js";
|
|
19
|
+
export type { ScaffoldEntry } from "./init.js";
|
|
16
20
|
export { resolveCast, resolveRole } from "./cast.js";
|
|
17
21
|
export { compare } from "./order.js";
|
|
18
22
|
export { kleeneAll, kleeneAny, kleeneNot } from "./logic.js";
|
|
19
23
|
export { evaluate } from "./evaluate.js";
|
|
20
24
|
export type { Evaluation } from "./evaluate.js";
|
|
21
|
-
export { buildVerdict, serializeVerdict, playerVersion } from "./verdict.js";
|
|
25
|
+
export { buildVerdict, serializeVerdict, playerVersion, PLAYER_VERSION } from "./verdict.js";
|
|
22
26
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,YAAY,EACV,SAAS,EACT,OAAO,EACP,KAAK,EACL,aAAa,EACb,WAAW,EACX,YAAY,EACZ,UAAU,EACV,WAAW,EACX,UAAU,EACV,IAAI,EACJ,WAAW,EACX,OAAO,GACR,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,YAAY,EACV,SAAS,EACT,OAAO,EACP,KAAK,EACL,aAAa,EACb,WAAW,EACX,YAAY,EACZ,UAAU,EACV,WAAW,EACX,UAAU,EACV,IAAI,EACJ,WAAW,EACX,OAAO,GACR,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACvD,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAChF,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
// Copyright (c) 2024-2026 Mike Argento. Licensed under the MIT License. See LICENSE.
|
|
2
2
|
export { basisTier, meetsFloor } from "./types.js";
|
|
3
3
|
export { parseRule, normalizeDigest, RuleError } from "./rule.js";
|
|
4
|
+
export { play, playAudit, PlayError } from "./play.js";
|
|
5
|
+
export { scaffoldRule, roleNameForFile, ORDERING_PLACEHOLDER } from "./init.js";
|
|
4
6
|
export { resolveCast, resolveRole } from "./cast.js";
|
|
5
7
|
export { compare } from "./order.js";
|
|
6
8
|
export { kleeneAll, kleeneAny, kleeneNot } from "./logic.js";
|
|
7
9
|
export { evaluate } from "./evaluate.js";
|
|
8
|
-
export { buildVerdict, serializeVerdict, playerVersion } from "./verdict.js";
|
|
10
|
+
export { buildVerdict, serializeVerdict, playerVersion, PLAYER_VERSION } from "./verdict.js";
|
|
9
11
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qFAAqF;AA6BrF,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qFAAqF;AA6BrF,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEhF,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/init.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare const ORDERING_PLACEHOLDER = "CHOOSE: hash-linked | assumption-dependent";
|
|
2
|
+
export interface ScaffoldEntry {
|
|
3
|
+
/** Filename (any path form; only the basename shapes the role name). */
|
|
4
|
+
name: string;
|
|
5
|
+
/** Lowercase hex SHA-256 of the file bytes. */
|
|
6
|
+
sha256Hex: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Derive a cast role name from a filename: basename, final extension
|
|
10
|
+
* dropped, characters outside [A-Za-z0-9_.-] folded to "-", runs
|
|
11
|
+
* collapsed, edges trimmed. Grammar guards from SPEC section 2: never
|
|
12
|
+
* empty ("file"), never pure-integer ("file-<digits>").
|
|
13
|
+
*
|
|
14
|
+
* Only "/" separates here. Backslash is an ordinary filename character
|
|
15
|
+
* on POSIX, and splitting on it fabricated wrong names for legal files;
|
|
16
|
+
* platform-correct basename extraction is the CLI's job (node:path),
|
|
17
|
+
* while this function stays byte-deterministic across platforms.
|
|
18
|
+
*/
|
|
19
|
+
export declare function roleNameForFile(name: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* Build the skeleton text. Roles keep input order; name collisions get
|
|
22
|
+
* "-2", "-3", … suffixes in input order. Serialization matches the house
|
|
23
|
+
* style: two-space indent, one trailing newline.
|
|
24
|
+
*/
|
|
25
|
+
export declare function scaffoldRule(entries: readonly ScaffoldEntry[]): string;
|
|
26
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,oBAAoB,+CAA+C,CAAC;AAEjF,MAAM,WAAW,aAAa;IAC5B,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWpD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,GAAG,MAAM,CAyDtE"}
|
package/dist/init.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Mike Argento. Licensed under the MIT License. See LICENSE.
|
|
2
|
+
/**
|
|
3
|
+
* Rule scaffolding: from a list of (filename, digest) pairs to a rule
|
|
4
|
+
* skeleton the author edits into a real rule.
|
|
5
|
+
*
|
|
6
|
+
* The skeleton is deliberately NOT a parseable rule: `requires.ordering`
|
|
7
|
+
* is emitted as a placeholder the author must replace. The trust floor is
|
|
8
|
+
* the rule's own security policy and has no default (SPEC section 2);
|
|
9
|
+
* scaffolding must not choose it either, or every scaffolded rule would
|
|
10
|
+
* silently carry the tool's policy instead of the author's.
|
|
11
|
+
*
|
|
12
|
+
* Everything else parses as written once the floor is chosen: cast roles
|
|
13
|
+
* in input order, each digest in the sha256:<hex> spelling, and an
|
|
14
|
+
* all-roles-exist claim as a working starting point.
|
|
15
|
+
*
|
|
16
|
+
* Deterministic: same entries in the same order produce identical bytes.
|
|
17
|
+
* The generated id is derived from the digests alone.
|
|
18
|
+
*/
|
|
19
|
+
import { createHash } from "node:crypto";
|
|
20
|
+
export const ORDERING_PLACEHOLDER = "CHOOSE: hash-linked | assumption-dependent";
|
|
21
|
+
/**
|
|
22
|
+
* Derive a cast role name from a filename: basename, final extension
|
|
23
|
+
* dropped, characters outside [A-Za-z0-9_.-] folded to "-", runs
|
|
24
|
+
* collapsed, edges trimmed. Grammar guards from SPEC section 2: never
|
|
25
|
+
* empty ("file"), never pure-integer ("file-<digits>").
|
|
26
|
+
*
|
|
27
|
+
* Only "/" separates here. Backslash is an ordinary filename character
|
|
28
|
+
* on POSIX, and splitting on it fabricated wrong names for legal files;
|
|
29
|
+
* platform-correct basename extraction is the CLI's job (node:path),
|
|
30
|
+
* while this function stays byte-deterministic across platforms.
|
|
31
|
+
*/
|
|
32
|
+
export function roleNameForFile(name) {
|
|
33
|
+
const base = name.split("/").pop();
|
|
34
|
+
const dot = base.lastIndexOf(".");
|
|
35
|
+
const stem = dot > 0 ? base.slice(0, dot) : base;
|
|
36
|
+
let role = stem
|
|
37
|
+
.replace(/[^A-Za-z0-9_.-]+/g, "-")
|
|
38
|
+
.replace(/-{2,}/g, "-")
|
|
39
|
+
.replace(/^[-.]+|[-.]+$/g, "");
|
|
40
|
+
if (role.length === 0)
|
|
41
|
+
role = "file";
|
|
42
|
+
if (/^[0-9]+$/.test(role))
|
|
43
|
+
role = `file-${role}`;
|
|
44
|
+
return role;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Build the skeleton text. Roles keep input order; name collisions get
|
|
48
|
+
* "-2", "-3", … suffixes in input order. Serialization matches the house
|
|
49
|
+
* style: two-space indent, one trailing newline.
|
|
50
|
+
*/
|
|
51
|
+
export function scaffoldRule(entries) {
|
|
52
|
+
if (entries.length === 0) {
|
|
53
|
+
throw new Error("scaffoldRule requires at least one entry");
|
|
54
|
+
}
|
|
55
|
+
for (const entry of entries) {
|
|
56
|
+
if (!/^[0-9a-f]{64}$/.test(entry.sha256Hex)) {
|
|
57
|
+
throw new Error(`scaffoldRule: sha256Hex for "${entry.name}" must be 64 lowercase hex characters`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Deterministic id from the digests alone, order-independent.
|
|
61
|
+
const idHash = createHash("sha256")
|
|
62
|
+
.update([...entries.map((e) => e.sha256Hex)].sort().join("\n"))
|
|
63
|
+
.digest("hex");
|
|
64
|
+
const id = `rule-${idHash.slice(0, 12)}`;
|
|
65
|
+
// A collision suffix must never equal another entry's NATURAL name:
|
|
66
|
+
// with photo.jpg, photo.png, photo-2.jpg, giving photo.png the role
|
|
67
|
+
// "photo-2" silently binds the wrong digest for an author who edits
|
|
68
|
+
// the claim by role name. Suffix candidates skip every base name;
|
|
69
|
+
// each base is still available to its own entry unsuffixed.
|
|
70
|
+
const bases = entries.map((entry) => roleNameForFile(entry.name));
|
|
71
|
+
const reserved = new Set(bases);
|
|
72
|
+
const taken = new Set();
|
|
73
|
+
const roles = [];
|
|
74
|
+
for (const base of bases) {
|
|
75
|
+
let role = base;
|
|
76
|
+
for (let n = 2; taken.has(role) || (role !== base && reserved.has(role)); n++) {
|
|
77
|
+
role = `${base}-${n}`;
|
|
78
|
+
}
|
|
79
|
+
taken.add(role);
|
|
80
|
+
roles.push(role);
|
|
81
|
+
}
|
|
82
|
+
// Null prototype for the same reason parseRule uses one: a file named
|
|
83
|
+
// "__proto__.jpg" must become an ordinary own key.
|
|
84
|
+
const cast = Object.create(null);
|
|
85
|
+
entries.forEach((entry, i) => {
|
|
86
|
+
const item = { digest: `sha256:${entry.sha256Hex}` };
|
|
87
|
+
// Omitted when degenerate ("photos/", ""): an empty means would ship
|
|
88
|
+
// a vacuous declared assertion into every verdict this rule produces.
|
|
89
|
+
const meansBase = entry.name.split("/").pop();
|
|
90
|
+
if (meansBase.length > 0)
|
|
91
|
+
item["means"] = meansBase;
|
|
92
|
+
cast[roles[i]] = item;
|
|
93
|
+
});
|
|
94
|
+
const skeleton = {
|
|
95
|
+
rule: "bitgraph-player/1",
|
|
96
|
+
id,
|
|
97
|
+
cast,
|
|
98
|
+
world: "closed",
|
|
99
|
+
requires: { ordering: ORDERING_PLACEHOLDER },
|
|
100
|
+
claim: { all: roles.map((role) => ({ exists: role })) },
|
|
101
|
+
};
|
|
102
|
+
return JSON.stringify(skeleton, null, 2) + "\n";
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=init.js.map
|
package/dist/init.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
|
package/dist/play.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AuditResult } from "@mikeargento/bitgraph-audit";
|
|
2
|
+
import type { Rule, Verdict } from "./types.js";
|
|
3
|
+
export type PlayStage = "rule-read" | "audit";
|
|
4
|
+
export declare class PlayError extends Error {
|
|
5
|
+
readonly stage: PlayStage;
|
|
6
|
+
constructor(stage: PlayStage, message: string, cause: unknown);
|
|
7
|
+
}
|
|
8
|
+
export interface PlayResult {
|
|
9
|
+
verdict: Verdict;
|
|
10
|
+
/** serializeVerdict(verdict): the byte-identical reproduction target. */
|
|
11
|
+
bytes: string;
|
|
12
|
+
/** SPEC section 8 mapping of verdict.result: 0 TRUE, 1 FALSE, 2 UNDETERMINED. */
|
|
13
|
+
exitCode: 0 | 1 | 2;
|
|
14
|
+
/** The audit the verdict was evaluated over, for callers that want the evidence. */
|
|
15
|
+
audit: AuditResult;
|
|
16
|
+
}
|
|
17
|
+
/** The pure tail of the pipeline: no filesystem, no network. */
|
|
18
|
+
export declare function playAudit(rule: Rule, ruleSha256Hex: string, audit: AuditResult): PlayResult;
|
|
19
|
+
/**
|
|
20
|
+
* Evaluate a rule file against a bundle (directory, .tar, .tar.gz, or
|
|
21
|
+
* .tgz). Offline past the filesystem reads; throws RuleError or PlayError.
|
|
22
|
+
*/
|
|
23
|
+
export declare function play(rulePath: string, bundlePath: string): Promise<PlayResult>;
|
|
24
|
+
//# sourceMappingURL=play.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"play.d.ts","sourceRoot":"","sources":["../src/play.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAI/D,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAGhD,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;AAE9C,qBAAa,SAAU,SAAQ,KAAK;IAClC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;gBACd,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;CAK9D;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpB,oFAAoF;IACpF,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,gEAAgE;AAChE,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,UAAU,CAM3F;AAED;;;GAGG;AACH,wBAAsB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAiBpF"}
|
package/dist/play.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Mike Argento. Licensed under the MIT License. See LICENSE.
|
|
2
|
+
/**
|
|
3
|
+
* One-call evaluation: play(rulePath, bundlePath) -> verdict.
|
|
4
|
+
*
|
|
5
|
+
* This is the whole pipeline in one place — read, parse, audit, resolve,
|
|
6
|
+
* evaluate, build, serialize — so the CLI and every embedder run the SAME
|
|
7
|
+
* composition and cannot drift apart. `playAudit` is the pure tail of the
|
|
8
|
+
* pipeline over an already-obtained AuditResult; `play` is the thin
|
|
9
|
+
* filesystem front.
|
|
10
|
+
*
|
|
11
|
+
* Errors are typed by stage so a caller can say exactly what failed:
|
|
12
|
+
* RuleError for an invalid rule, PlayError("rule-read") when the rule
|
|
13
|
+
* file cannot be read, PlayError("audit") when bundle ingest fails.
|
|
14
|
+
*/
|
|
15
|
+
import { createHash } from "node:crypto";
|
|
16
|
+
import { readFileSync } from "node:fs";
|
|
17
|
+
import { runAudit } from "@mikeargento/bitgraph-audit";
|
|
18
|
+
import { resolveCast } from "./cast.js";
|
|
19
|
+
import { evaluate } from "./evaluate.js";
|
|
20
|
+
import { parseRule } from "./rule.js";
|
|
21
|
+
import { buildVerdict, serializeVerdict } from "./verdict.js";
|
|
22
|
+
export class PlayError extends Error {
|
|
23
|
+
stage;
|
|
24
|
+
constructor(stage, message, cause) {
|
|
25
|
+
super(message, { cause });
|
|
26
|
+
this.name = "PlayError";
|
|
27
|
+
this.stage = stage;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** The pure tail of the pipeline: no filesystem, no network. */
|
|
31
|
+
export function playAudit(rule, ruleSha256Hex, audit) {
|
|
32
|
+
const resolutions = resolveCast(rule.cast, audit);
|
|
33
|
+
const evaluation = evaluate(rule, resolutions, audit);
|
|
34
|
+
const verdict = buildVerdict(rule, ruleSha256Hex, resolutions, evaluation, audit);
|
|
35
|
+
const exitCode = evaluation.result === "TRUE" ? 0 : evaluation.result === "FALSE" ? 1 : 2;
|
|
36
|
+
return { verdict, bytes: serializeVerdict(verdict), exitCode, audit };
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Evaluate a rule file against a bundle (directory, .tar, .tar.gz, or
|
|
40
|
+
* .tgz). Offline past the filesystem reads; throws RuleError or PlayError.
|
|
41
|
+
*/
|
|
42
|
+
export async function play(rulePath, bundlePath) {
|
|
43
|
+
let ruleBytes;
|
|
44
|
+
try {
|
|
45
|
+
ruleBytes = readFileSync(rulePath);
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
throw new PlayError("rule-read", `cannot read rule file: ${err.message}`, err);
|
|
49
|
+
}
|
|
50
|
+
const ruleSha256Hex = createHash("sha256").update(ruleBytes).digest("hex");
|
|
51
|
+
const rule = parseRule(ruleBytes.toString("utf8"));
|
|
52
|
+
let audit;
|
|
53
|
+
try {
|
|
54
|
+
audit = await runAudit(bundlePath);
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
throw new PlayError("audit", `bundle audit failed: ${err.message}`, err);
|
|
58
|
+
}
|
|
59
|
+
return playAudit(rule, ruleSha256Hex, audit);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=play.js.map
|
package/dist/play.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"play.js","sourceRoot":"","sources":["../src/play.ts"],"names":[],"mappings":"AAAA,qFAAqF;AAErF;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAI9D,MAAM,OAAO,SAAU,SAAQ,KAAK;IACzB,KAAK,CAAY;IAC1B,YAAY,KAAgB,EAAE,OAAe,EAAE,KAAc;QAC3D,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAYD,gEAAgE;AAChE,MAAM,UAAU,SAAS,CAAC,IAAU,EAAE,aAAqB,EAAE,KAAkB;IAC7E,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IAClF,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AACxE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,QAAgB,EAAE,UAAkB;IAC7D,IAAI,SAAiB,CAAC;IACtB,IAAI,CAAC;QACH,SAAS,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,SAAS,CAAC,WAAW,EAAE,0BAA2B,GAAa,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;IAC5F,CAAC;IACD,MAAM,aAAa,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAEnD,IAAI,KAAkB,CAAC;IACvB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,SAAS,CAAC,OAAO,EAAE,wBAAyB,GAAa,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;AAC/C,CAAC"}
|
package/dist/verdict.d.ts
CHANGED
|
@@ -1,7 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verdict construction and serialization.
|
|
3
|
+
*
|
|
4
|
+
* Determinism is the product claim, so this module is where it is
|
|
5
|
+
* enforced: no wall-clock reads, no random values, no filesystem paths,
|
|
6
|
+
* and a fixed field order. Two machines evaluating the same rule bytes
|
|
7
|
+
* over the same bundle contents must produce byte-identical verdicts.
|
|
8
|
+
*
|
|
9
|
+
* The verdict labels its own trust boundary. `derived` is what BitGraph
|
|
10
|
+
* established; `declared` is what a named party asserted and Player took
|
|
11
|
+
* on faith — including the closed world itself, which nothing in BitGraph
|
|
12
|
+
* establishes: "there is no cancellation before approval" and "among the
|
|
13
|
+
* recordings you told me to consider, none precedes approval" are
|
|
14
|
+
* different claims, and the closed-world entry is what keeps the verdict
|
|
15
|
+
* from passing the first off as the second.
|
|
16
|
+
*/
|
|
1
17
|
import type { AuditResult } from "@mikeargento/bitgraph-audit";
|
|
2
18
|
import type { Evaluation } from "./evaluate.js";
|
|
3
19
|
import type { Resolution, Rule, Verdict } from "./types.js";
|
|
4
|
-
/**
|
|
20
|
+
/**
|
|
21
|
+
* The player package's own version, as a source constant rather than a
|
|
22
|
+
* runtime package.json read. The read had two failure modes in bundled
|
|
23
|
+
* embedders (esbuild/webpack output): a foreign package.json one level
|
|
24
|
+
* up supplies the WRONG version, changing verdict bytes against the
|
|
25
|
+
* reference CLI, or no package.json at all throws ENOENT mid-evaluation.
|
|
26
|
+
* A unit test asserts this equals package.json's version, so the
|
|
27
|
+
* constant cannot drift silently across releases.
|
|
28
|
+
*/
|
|
29
|
+
export declare const PLAYER_VERSION = "0.2.1";
|
|
30
|
+
/** The player package's own version. */
|
|
5
31
|
export declare function playerVersion(): string;
|
|
6
32
|
export declare function buildVerdict(rule: Rule, ruleSha256Hex: string, resolutions: Map<string, Resolution>, evaluation: Evaluation, audit: AuditResult): Verdict;
|
|
7
33
|
/**
|
package/dist/verdict.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verdict.d.ts","sourceRoot":"","sources":["../src/verdict.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"verdict.d.ts","sourceRoot":"","sources":["../src/verdict.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,KAAK,EAAiB,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE3E;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,UAAU,CAAC;AAEtC,wCAAwC;AACxC,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAeD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EACpC,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,WAAW,GACjB,OAAO,CA6ET;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAkBzD"}
|
package/dist/verdict.js
CHANGED
|
@@ -1,30 +1,18 @@
|
|
|
1
1
|
// Copyright (c) 2024-2026 Mike Argento. Licensed under the MIT License. See LICENSE.
|
|
2
|
+
import { normalizeDigest } from "./rule.js";
|
|
2
3
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* The verdict labels its own trust boundary. `derived` is what BitGraph
|
|
11
|
-
* established; `declared` is what a named party asserted and Player took
|
|
12
|
-
* on faith — including the closed world itself, which nothing in BitGraph
|
|
13
|
-
* establishes: "there is no cancellation before approval" and "among the
|
|
14
|
-
* recordings you told me to consider, none precedes approval" are
|
|
15
|
-
* different claims, and the closed-world entry is what keeps the verdict
|
|
16
|
-
* from passing the first off as the second.
|
|
4
|
+
* The player package's own version, as a source constant rather than a
|
|
5
|
+
* runtime package.json read. The read had two failure modes in bundled
|
|
6
|
+
* embedders (esbuild/webpack output): a foreign package.json one level
|
|
7
|
+
* up supplies the WRONG version, changing verdict bytes against the
|
|
8
|
+
* reference CLI, or no package.json at all throws ENOENT mid-evaluation.
|
|
9
|
+
* A unit test asserts this equals package.json's version, so the
|
|
10
|
+
* constant cannot drift silently across releases.
|
|
17
11
|
*/
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
let cachedVersion;
|
|
21
|
-
/** The player package's own version, read once from its package.json. */
|
|
12
|
+
export const PLAYER_VERSION = "0.2.1";
|
|
13
|
+
/** The player package's own version. */
|
|
22
14
|
export function playerVersion() {
|
|
23
|
-
|
|
24
|
-
const raw = readFileSync(new URL("../package.json", import.meta.url), "utf8");
|
|
25
|
-
cachedVersion = JSON.parse(raw).version;
|
|
26
|
-
}
|
|
27
|
-
return cachedVersion;
|
|
15
|
+
return PLAYER_VERSION;
|
|
28
16
|
}
|
|
29
17
|
function resolutionLabel(res) {
|
|
30
18
|
switch (res.kind) {
|
package/dist/verdict.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verdict.js","sourceRoot":"","sources":["../src/verdict.ts"],"names":[],"mappings":"AAAA,qFAAqF;
|
|
1
|
+
{"version":3,"file":"verdict.js","sourceRoot":"","sources":["../src/verdict.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mikeargento/bitgraph-player",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Deterministic evaluation of causal rules over BitGraph proof bundles: a pure function from (rule, verified evidence) to a reproducible verdict.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|