mneme-ai 2.129.0 → 2.131.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/dist/commands/firewall.d.ts +12 -0
- package/dist/commands/firewall.d.ts.map +1 -0
- package/dist/commands/firewall.js +80 -0
- package/dist/commands/firewall.js.map +1 -0
- package/dist/commands/rail.d.ts +14 -0
- package/dist/commands/rail.d.ts.map +1 -0
- package/dist/commands/rail.js +293 -0
- package/dist/commands/rail.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mneme firewall` (v2.130.0) — Structural Context Firewall against Indirect
|
|
3
|
+
* Prompt Injection (OWASP LLM01). Scan content an agent is about to read; detect
|
|
4
|
+
* + neutralize known injection patterns hidden in comments/strings, and wrap it
|
|
5
|
+
* in an untrusted-data boundary so the model treats it as DATA, never commands.
|
|
6
|
+
*
|
|
7
|
+
* cat suspect.ts | mneme firewall scan # verdict + findings
|
|
8
|
+
* cat external-dep.ts | mneme firewall fortify # → safe-to-read content (neutralized + wrapped)
|
|
9
|
+
*/
|
|
10
|
+
import type { Command } from "commander";
|
|
11
|
+
export declare function registerFirewallCommands(program: Command): void;
|
|
12
|
+
//# sourceMappingURL=firewall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firewall.d.ts","sourceRoot":"","sources":["../../src/commands/firewall.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBzC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+B/D"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mneme firewall` (v2.130.0) — Structural Context Firewall against Indirect
|
|
3
|
+
* Prompt Injection (OWASP LLM01). Scan content an agent is about to read; detect
|
|
4
|
+
* + neutralize known injection patterns hidden in comments/strings, and wrap it
|
|
5
|
+
* in an untrusted-data boundary so the model treats it as DATA, never commands.
|
|
6
|
+
*
|
|
7
|
+
* cat suspect.ts | mneme firewall scan # verdict + findings
|
|
8
|
+
* cat external-dep.ts | mneme firewall fortify # → safe-to-read content (neutralized + wrapped)
|
|
9
|
+
*/
|
|
10
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
11
|
+
import { firewall } from "@mneme-ai/core";
|
|
12
|
+
function out(s) { process.stdout.write(s + "\n"); }
|
|
13
|
+
function readStdin() {
|
|
14
|
+
return new Promise((resolve) => {
|
|
15
|
+
if (process.stdin.isTTY)
|
|
16
|
+
return resolve("");
|
|
17
|
+
let d = "";
|
|
18
|
+
let done = false;
|
|
19
|
+
const fin = () => { if (!done) {
|
|
20
|
+
done = true;
|
|
21
|
+
resolve(d);
|
|
22
|
+
} };
|
|
23
|
+
process.stdin.setEncoding("utf8");
|
|
24
|
+
process.stdin.on("data", (c) => { d += c; if (d.length > 8_000_000)
|
|
25
|
+
fin(); });
|
|
26
|
+
process.stdin.on("end", fin);
|
|
27
|
+
process.stdin.on("error", fin);
|
|
28
|
+
setTimeout(fin, 4000);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
async function getPayload(opts) {
|
|
32
|
+
if (typeof opts.text === "string")
|
|
33
|
+
return opts.text;
|
|
34
|
+
if (opts.file && existsSync(opts.file)) {
|
|
35
|
+
try {
|
|
36
|
+
return readFileSync(opts.file, "utf8");
|
|
37
|
+
}
|
|
38
|
+
catch { /* */ }
|
|
39
|
+
}
|
|
40
|
+
return readStdin();
|
|
41
|
+
}
|
|
42
|
+
export function registerFirewallCommands(program) {
|
|
43
|
+
const fw = program.command("firewall").description("🧱 STRUCTURAL CONTEXT FIREWALL — defend against Indirect Prompt Injection (OWASP LLM01): scan content for injection hidden in comments/strings + neutralize it, and wrap it as untrusted DATA so the model never obeys instructions buried in a file. Defense-in-depth, not a 100% guarantee against unknown attacks.");
|
|
44
|
+
fw.command("scan")
|
|
45
|
+
.description("Scan content (stdin/--file/--text). Verdict clean | flagged | blocked + findings (line, category). Exit 2 on blocked.")
|
|
46
|
+
.option("--text <t>", "inline content.")
|
|
47
|
+
.option("--file <p>", "read from a file.")
|
|
48
|
+
.option("--json", "JSON output.")
|
|
49
|
+
.action(async (opts) => {
|
|
50
|
+
const r = firewall.scanInjection(await getPayload(opts));
|
|
51
|
+
if (opts.json) {
|
|
52
|
+
process.stdout.write(JSON.stringify(r, null, 2) + "\n");
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
const icon = r.verdict === "blocked" ? "🛑" : r.verdict === "flagged" ? "⚠️" : "✓";
|
|
56
|
+
out(`${icon} FIREWALL ${r.verdict.toUpperCase()} — ${r.findings.length} finding(s), ${r.neutralizedCount} neutralized`);
|
|
57
|
+
for (const f of r.findings.slice(0, 12))
|
|
58
|
+
out(` • L${f.line} [${f.severity}] ${f.category}: ${f.snippet}`);
|
|
59
|
+
if (r.verdict !== "clean")
|
|
60
|
+
out(` → read the FORTIFIED form (mneme firewall fortify) instead of the raw file.`);
|
|
61
|
+
}
|
|
62
|
+
if (r.verdict === "blocked")
|
|
63
|
+
process.exitCode = 2;
|
|
64
|
+
});
|
|
65
|
+
fw.command("fortify")
|
|
66
|
+
.description("Emit the safe-to-read form: known injections neutralized + content wrapped in an untrusted-data boundary (the always-on, attack-agnostic separation). Read THIS instead of the raw file.")
|
|
67
|
+
.option("--text <t>", "inline content.")
|
|
68
|
+
.option("--file <p>", "read from a file.")
|
|
69
|
+
.option("--json", "JSON output (fortified + findings).")
|
|
70
|
+
.action(async (opts) => {
|
|
71
|
+
const r = firewall.fortify(await getPayload(opts), opts.file ? { path: opts.file } : undefined);
|
|
72
|
+
if (opts.json) {
|
|
73
|
+
process.stdout.write(JSON.stringify(r, null, 2) + "\n");
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
process.stdout.write(r.fortified + "\n");
|
|
77
|
+
process.stderr.write(`🧱 firewall: ${r.verdict} · ${r.neutralizedCount} injection(s) neutralized · wrapped as untrusted data\n`);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=firewall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firewall.js","sourceRoot":"","sources":["../../src/commands/firewall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mneme rail` + `mneme policy` (v2.131.0) — THE CONTEXT RAIL.
|
|
3
|
+
* The single governed pipe every payload crosses between a local workspace and a
|
|
4
|
+
* hosted model — the "Visa rail" of AI context. Composes policy · firewall ·
|
|
5
|
+
* blind (ingress) and egress · settlement (egress) into one signed receipt.
|
|
6
|
+
*
|
|
7
|
+
* cat src/billing.ts | mneme rail ingress --path src/billing.ts # safe-to-send form + local map
|
|
8
|
+
* echo "$MODEL_OUTPUT" | mneme rail egress # leak-screened + metered to the ledger
|
|
9
|
+
* mneme policy check --path config/.env # ALLOW | DENY (deterministic gate)
|
|
10
|
+
* mneme policy init # write a default mneme.policy.json
|
|
11
|
+
*/
|
|
12
|
+
import type { Command } from "commander";
|
|
13
|
+
export declare function registerRailCommands(program: Command): void;
|
|
14
|
+
//# sourceMappingURL=rail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rail.d.ts","sourceRoot":"","sources":["../../src/commands/rail.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyEzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqI3D"}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mneme rail` + `mneme policy` (v2.131.0) — THE CONTEXT RAIL.
|
|
3
|
+
* The single governed pipe every payload crosses between a local workspace and a
|
|
4
|
+
* hosted model — the "Visa rail" of AI context. Composes policy · firewall ·
|
|
5
|
+
* blind (ingress) and egress · settlement (egress) into one signed receipt.
|
|
6
|
+
*
|
|
7
|
+
* cat src/billing.ts | mneme rail ingress --path src/billing.ts # safe-to-send form + local map
|
|
8
|
+
* echo "$MODEL_OUTPUT" | mneme rail egress # leak-screened + metered to the ledger
|
|
9
|
+
* mneme policy check --path config/.env # ALLOW | DENY (deterministic gate)
|
|
10
|
+
* mneme policy init # write a default mneme.policy.json
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync, readFileSync, writeFileSync, appendFileSync, mkdirSync, rmdirSync, statSync } from "node:fs";
|
|
13
|
+
import { resolve, join, dirname } from "node:path";
|
|
14
|
+
import { rail, policy, settlement, notary } from "@mneme-ai/core";
|
|
15
|
+
const SETTLEMENT_LEDGER = ".mneme/settlement/ledger.jsonl";
|
|
16
|
+
const GENESIS = "0".repeat(64);
|
|
17
|
+
function readSettlementLedger(cwd) {
|
|
18
|
+
try {
|
|
19
|
+
const p = join(cwd, SETTLEMENT_LEDGER);
|
|
20
|
+
if (!existsSync(p))
|
|
21
|
+
return [];
|
|
22
|
+
return readFileSync(p, "utf8").split(/\r?\n/).filter(Boolean).map((l) => JSON.parse(l));
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return [];
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function appendSettlementLedger(cwd, rec) {
|
|
29
|
+
const p = join(cwd, SETTLEMENT_LEDGER);
|
|
30
|
+
if (!existsSync(dirname(p)))
|
|
31
|
+
mkdirSync(dirname(p), { recursive: true });
|
|
32
|
+
appendFileSync(p, JSON.stringify(rec) + "\n");
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Run a critical section under a best-effort atomic mutex (mkdir is atomic on
|
|
36
|
+
* every OS). Closes the read-then-append race between two concurrent
|
|
37
|
+
* `rail egress` processes that would otherwise fork the chain. Total: a stale
|
|
38
|
+
* lock (>10s) is reclaimed, and any failure falls back to running unlocked
|
|
39
|
+
* rather than hanging (metering is never allowed to block the verdict).
|
|
40
|
+
*/
|
|
41
|
+
function withLedgerLock(cwd, fn) {
|
|
42
|
+
const lockDir = join(cwd, ".mneme/settlement/.ledger.lock");
|
|
43
|
+
try {
|
|
44
|
+
if (!existsSync(dirname(lockDir)))
|
|
45
|
+
mkdirSync(dirname(lockDir), { recursive: true });
|
|
46
|
+
}
|
|
47
|
+
catch { /* */ }
|
|
48
|
+
let held = false;
|
|
49
|
+
for (let i = 0; i < 100; i++) {
|
|
50
|
+
try {
|
|
51
|
+
mkdirSync(lockDir);
|
|
52
|
+
held = true;
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
try {
|
|
57
|
+
const age = Date.now() - statSync(lockDir).mtimeMs;
|
|
58
|
+
if (age > 10_000) {
|
|
59
|
+
rmdirSync(lockDir);
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch { /* */ }
|
|
64
|
+
// brief synchronous spin (≤~50ms total); never blocks indefinitely.
|
|
65
|
+
const until = Date.now() + 5;
|
|
66
|
+
while (Date.now() < until) { /* spin */ }
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
return fn();
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
if (held) {
|
|
74
|
+
try {
|
|
75
|
+
rmdirSync(lockDir);
|
|
76
|
+
}
|
|
77
|
+
catch { /* */ }
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function out(s) { process.stdout.write(s + "\n"); }
|
|
82
|
+
function err(s) { process.stderr.write(s + "\n"); }
|
|
83
|
+
const STDIN_CAP = 64_000_000; // 64MB — a security scan must not silently drop the tail.
|
|
84
|
+
function readStdin() {
|
|
85
|
+
return new Promise((res) => {
|
|
86
|
+
if (process.stdin.isTTY)
|
|
87
|
+
return res("");
|
|
88
|
+
let d = "";
|
|
89
|
+
let done = false;
|
|
90
|
+
let truncated = false;
|
|
91
|
+
const fin = () => {
|
|
92
|
+
if (done)
|
|
93
|
+
return;
|
|
94
|
+
done = true;
|
|
95
|
+
if (truncated)
|
|
96
|
+
err(`⚠️ rail: stdin exceeded ${STDIN_CAP / 1_000_000}MB and was truncated — the scan is PARTIAL; pass --file for a complete scan of large inputs.`);
|
|
97
|
+
res(d);
|
|
98
|
+
};
|
|
99
|
+
process.stdin.setEncoding("utf8");
|
|
100
|
+
process.stdin.on("data", (c) => { d += c; if (d.length > STDIN_CAP) {
|
|
101
|
+
truncated = true;
|
|
102
|
+
fin();
|
|
103
|
+
} });
|
|
104
|
+
process.stdin.on("end", fin);
|
|
105
|
+
process.stdin.on("error", fin);
|
|
106
|
+
setTimeout(fin, 4000);
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
async function getPayload(opts) {
|
|
110
|
+
if (typeof opts.text === "string")
|
|
111
|
+
return opts.text;
|
|
112
|
+
if (opts.file && existsSync(opts.file)) {
|
|
113
|
+
try {
|
|
114
|
+
return readFileSync(opts.file, "utf8");
|
|
115
|
+
}
|
|
116
|
+
catch { /* */ }
|
|
117
|
+
}
|
|
118
|
+
return readStdin();
|
|
119
|
+
}
|
|
120
|
+
function loadPolicy(cwd) {
|
|
121
|
+
try {
|
|
122
|
+
const p = resolve(cwd, "mneme.policy.json");
|
|
123
|
+
if (existsSync(p))
|
|
124
|
+
return policy.normalizePolicy(JSON.parse(readFileSync(p, "utf8")));
|
|
125
|
+
}
|
|
126
|
+
catch { /* fall through to default */ }
|
|
127
|
+
return policy.defaultPolicy();
|
|
128
|
+
}
|
|
129
|
+
export function registerRailCommands(program) {
|
|
130
|
+
// ───────────────────────────── mneme rail ─────────────────────────────
|
|
131
|
+
const r = program.command("rail").description("🛤 THE CONTEXT RAIL — the single governed pipe between your workspace and a model (the 'Visa rail' of AI context). ingress = policy→firewall→blind before sending; egress = leak-guard→settlement before writing. Each crossing leaves a signed receipt.");
|
|
132
|
+
r.command("ingress")
|
|
133
|
+
.description("Local context → wire. Policy-gate, neutralize injection + wrap as untrusted data, blind names/secrets. Prints the safe-to-send payload; the reverse map stays local. Exit 2 if the policy gate BLOCKs.")
|
|
134
|
+
.option("--text <t>", "inline content.")
|
|
135
|
+
.option("--file <p>", "read from a file.")
|
|
136
|
+
.option("--path <p>", "logical path for the policy gate (e.g. src/billing.ts).")
|
|
137
|
+
.option("--agent <id>", "agent id (for an allow-list policy).")
|
|
138
|
+
.option("--aggressive", "mask ALL user identifiers (default: sensitive only).")
|
|
139
|
+
.option("--map <p>", "write the local reverse map to this file (NEVER send it).")
|
|
140
|
+
.option("--json", "JSON output (full receipt).")
|
|
141
|
+
.action(async (opts) => {
|
|
142
|
+
const cwd = process.cwd();
|
|
143
|
+
const payload = await getPayload(opts);
|
|
144
|
+
const rec = rail.traverseIngress(payload, {
|
|
145
|
+
...(opts.path ? { path: opts.path } : {}),
|
|
146
|
+
...(opts.agent ? { agent: opts.agent } : {}),
|
|
147
|
+
policy: loadPolicy(cwd),
|
|
148
|
+
blindMode: opts.aggressive ? "aggressive" : "sensitive",
|
|
149
|
+
});
|
|
150
|
+
const receipt = notary.issueReceipt(cwd, { kind: "claim-verdict", subject: "rail.ingress", payload: { contentHash: rec.contentHash, safeHash: rec.safeHash, verdict: rec.verdict }, includePayload: true });
|
|
151
|
+
if (opts.map && rec.map) {
|
|
152
|
+
try {
|
|
153
|
+
writeFileSync(resolve(cwd, opts.map), JSON.stringify(rec.map, null, 2));
|
|
154
|
+
}
|
|
155
|
+
catch { /* */ }
|
|
156
|
+
}
|
|
157
|
+
if (opts.json) {
|
|
158
|
+
out(JSON.stringify({ ...rec, receipt }, null, 2));
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
if (rec.allowed)
|
|
162
|
+
out(rec.safePayload);
|
|
163
|
+
const icon = rec.verdict === "BLOCK" ? "🛑" : rec.verdict === "REDACT" ? "🛡" : "✓";
|
|
164
|
+
err(`${icon} rail ingress: ${rec.verdict} — ${rec.layers.map((l) => `${l.layer}${l.ok ? "✓" : "✗"}`).join(" · ")}`);
|
|
165
|
+
err(` ${rec.note}`);
|
|
166
|
+
if (rec.map && Object.keys(rec.map).length)
|
|
167
|
+
err(` ${Object.keys(rec.map).length} name(s) masked${opts.map ? ` → map written to ${opts.map}` : " (use --map to save the reverse map)"}`);
|
|
168
|
+
err(` receipt ${receipt.receiptId ?? "(signed)"}`);
|
|
169
|
+
}
|
|
170
|
+
if (rec.verdict === "BLOCK")
|
|
171
|
+
process.exitCode = 2;
|
|
172
|
+
});
|
|
173
|
+
r.command("egress")
|
|
174
|
+
.description("Model output → local disk. Screen for secret leakage (canary/bloom/pattern/entropy), then meter the transaction into the signed settlement ledger. Exit 2 if a leak BLOCKs the write.")
|
|
175
|
+
.option("--text <t>", "inline content.")
|
|
176
|
+
.option("--file <p>", "read from a file.")
|
|
177
|
+
.option("--agent <id>", "agent id.")
|
|
178
|
+
.option("--canary <list>", "comma-separated honeytoken canaries to trip on.")
|
|
179
|
+
.option("--verified", "mark that a LOCAL verify (compile/test) passed.")
|
|
180
|
+
.option("--json", "JSON output (full receipt).")
|
|
181
|
+
.action(async (opts) => {
|
|
182
|
+
const cwd = process.cwd();
|
|
183
|
+
const payload = await getPayload(opts);
|
|
184
|
+
const canaries = (opts.canary ?? "").split(",").map((s) => s.trim()).filter(Boolean);
|
|
185
|
+
const rec = rail.traverseEgress(payload, {
|
|
186
|
+
...(canaries.length ? { canaries } : {}),
|
|
187
|
+
...(opts.agent ? { agent: opts.agent } : {}),
|
|
188
|
+
localVerified: opts.verified === true,
|
|
189
|
+
});
|
|
190
|
+
// settle the transaction into the signed hash-chained ledger (side-effect).
|
|
191
|
+
let settled = null;
|
|
192
|
+
if (rec.allowed && rec.txDraft) {
|
|
193
|
+
try {
|
|
194
|
+
const draft = rec.txDraft;
|
|
195
|
+
settled = withLedgerLock(cwd, () => {
|
|
196
|
+
const records = readSettlementLedger(cwd);
|
|
197
|
+
const prev = records.length ? records[records.length - 1].chainHash : GENESIS;
|
|
198
|
+
// seq = records.length + 1 to match settlement's own convention
|
|
199
|
+
// (settlement CLI + buildLedger start at 1) so the SHARED ledger chain
|
|
200
|
+
// verifies. map localVerified: boolean → "pass"/"na" (never "fail" —
|
|
201
|
+
// an unverified op is not a known failure).
|
|
202
|
+
const r2 = settlement.recordTx(prev, {
|
|
203
|
+
kind: draft.kind,
|
|
204
|
+
sentHash: draft.sentHash,
|
|
205
|
+
namesHidden: draft.namesHidden,
|
|
206
|
+
secretsRemoved: draft.secretsRemoved,
|
|
207
|
+
localVerified: draft.localVerified ? "pass" : "na",
|
|
208
|
+
tokensSent: draft.tokensSent,
|
|
209
|
+
tokensSaved: draft.tokensSaved,
|
|
210
|
+
}, records.length + 1);
|
|
211
|
+
appendSettlementLedger(cwd, r2);
|
|
212
|
+
return { seq: records.length + 1, chainHash: r2.chainHash };
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
catch { /* metering is best-effort; never block the verdict */ }
|
|
216
|
+
}
|
|
217
|
+
const receipt = notary.issueReceipt(cwd, { kind: "claim-verdict", subject: "rail.egress", payload: { contentHash: rec.contentHash, verdict: rec.verdict, settledSeq: settled?.seq ?? -1 }, includePayload: true });
|
|
218
|
+
if (opts.json) {
|
|
219
|
+
out(JSON.stringify({ ...rec, settled, receipt }, null, 2));
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
if (rec.allowed)
|
|
223
|
+
out(rec.safePayload);
|
|
224
|
+
const icon = rec.verdict === "BLOCK" ? "🛑" : rec.verdict === "REDACT" ? "🛡" : "✓";
|
|
225
|
+
err(`${icon} rail egress: ${rec.verdict} — ${rec.layers.map((l) => `${l.layer}${l.ok ? "✓" : "✗"}`).join(" · ")}`);
|
|
226
|
+
err(` ${rec.note}`);
|
|
227
|
+
if (settled)
|
|
228
|
+
err(` settled → ledger seq ${settled.seq} (${settled.chainHash.slice(0, 12)}…)`);
|
|
229
|
+
err(` receipt ${receipt.receiptId ?? "(signed)"}`);
|
|
230
|
+
}
|
|
231
|
+
if (rec.verdict === "BLOCK")
|
|
232
|
+
process.exitCode = 2;
|
|
233
|
+
});
|
|
234
|
+
// ──────────────────────────── mneme policy ────────────────────────────
|
|
235
|
+
const p = program.command("policy").description("📜 DYNAMIC POLICY ENFORCEMENT — the deterministic access gate the rail consults before any context crosses. Configured via mneme.policy.json (deny-path globs, deny-content patterns, agent allow-list, byte cap). Fail-closed.");
|
|
236
|
+
p.command("check")
|
|
237
|
+
.description("Check a path/content/agent against the active policy. Verdict ALLOW | DENY + violations. Exit 2 on DENY.")
|
|
238
|
+
.option("--path <p>", "path to test.")
|
|
239
|
+
.option("--text <t>", "inline content to test.")
|
|
240
|
+
.option("--file <p>", "file whose path AND content to test.")
|
|
241
|
+
.option("--agent <id>", "agent id to test against the allow-list.")
|
|
242
|
+
.option("--json", "JSON output.")
|
|
243
|
+
.action(async (opts) => {
|
|
244
|
+
const cwd = process.cwd();
|
|
245
|
+
let content = typeof opts.text === "string" ? opts.text : "";
|
|
246
|
+
let path = opts.path;
|
|
247
|
+
if (opts.file) {
|
|
248
|
+
path = path ?? opts.file;
|
|
249
|
+
if (existsSync(opts.file)) {
|
|
250
|
+
try {
|
|
251
|
+
content = readFileSync(opts.file, "utf8");
|
|
252
|
+
}
|
|
253
|
+
catch { /* */ }
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
const d = policy.checkPolicy({ ...(path ? { path } : {}), ...(content ? { content } : {}), ...(opts.agent ? { agent: opts.agent } : {}) }, loadPolicy(cwd));
|
|
257
|
+
if (opts.json) {
|
|
258
|
+
out(JSON.stringify(d, null, 2));
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
out(`${d.verdict === "ALLOW" ? "✓ ALLOW" : "🛑 DENY"} — ${d.reason}`);
|
|
262
|
+
for (const v of d.violations)
|
|
263
|
+
out(` • [${v.kind}] ${v.detail} (rule: ${v.rule})`);
|
|
264
|
+
}
|
|
265
|
+
if (!d.allowed)
|
|
266
|
+
process.exitCode = 2;
|
|
267
|
+
});
|
|
268
|
+
p.command("init")
|
|
269
|
+
.description("Write a default mneme.policy.json to the repo root (denies .env / secrets / keys / PII content). Edit to taste.")
|
|
270
|
+
.option("--force", "overwrite an existing policy file.")
|
|
271
|
+
.action((opts) => {
|
|
272
|
+
const cwd = process.cwd();
|
|
273
|
+
const dest = resolve(cwd, "mneme.policy.json");
|
|
274
|
+
if (existsSync(dest) && !opts.force) {
|
|
275
|
+
err(`mneme.policy.json already exists — pass --force to overwrite.`);
|
|
276
|
+
process.exitCode = 1;
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
try {
|
|
280
|
+
writeFileSync(dest, JSON.stringify(policy.defaultPolicy(), null, 2) + "\n");
|
|
281
|
+
out(`✓ wrote ${dest}`);
|
|
282
|
+
err(` the rail will consult this on every ingress crossing. Add agent allow-lists / size caps as needed.`);
|
|
283
|
+
}
|
|
284
|
+
catch (e) {
|
|
285
|
+
err(`failed to write policy: ${e.message}`);
|
|
286
|
+
process.exitCode = 1;
|
|
287
|
+
}
|
|
288
|
+
});
|
|
289
|
+
p.command("show")
|
|
290
|
+
.description("Print the active policy (the loaded mneme.policy.json, or the built-in default).")
|
|
291
|
+
.action(() => { out(JSON.stringify(loadPolicy(process.cwd()), null, 2)); });
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=rail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rail.js","sourceRoot":"","sources":["../../src/commands/rail.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA4JA,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8gNvD"}
|
package/dist/index.js
CHANGED
|
@@ -87,6 +87,8 @@ import { registerScaffoldCommands } from "./commands/scaffold.js";
|
|
|
87
87
|
import { registerBlindCommands } from "./commands/blind.js";
|
|
88
88
|
import { registerChannelCommands } from "./commands/channel.js";
|
|
89
89
|
import { registerSettlementCommands } from "./commands/settlement.js";
|
|
90
|
+
import { registerFirewallCommands } from "./commands/firewall.js";
|
|
91
|
+
import { registerRailCommands } from "./commands/rail.js";
|
|
90
92
|
import { registerTrustCommands } from "./commands/trust.js";
|
|
91
93
|
import { registerNuclearCommands } from "./commands/nuclear-cli.js";
|
|
92
94
|
import { registerOvernightCommand } from "./commands/overnight.js";
|
|
@@ -4719,6 +4721,8 @@ export async function run(argv) {
|
|
|
4719
4721
|
registerBlindCommands(program);
|
|
4720
4722
|
registerChannelCommands(program);
|
|
4721
4723
|
registerSettlementCommands(program);
|
|
4724
|
+
registerFirewallCommands(program);
|
|
4725
|
+
registerRailCommands(program);
|
|
4722
4726
|
// ─── Trust calibrator (v1.31.0) -- per-subsystem precision/recall/band
|
|
4723
4727
|
registerTrustCommands(program);
|
|
4724
4728
|
// ─── Wisdom reactor (v1.33.0) -- five nuclear-physics formulas as Mneme metrics
|