mneme-ai 2.126.0 → 2.128.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/blind.d.ts +14 -0
- package/dist/commands/blind.d.ts.map +1 -0
- package/dist/commands/blind.js +95 -0
- package/dist/commands/blind.js.map +1 -0
- package/dist/commands/channel.d.ts +14 -0
- package/dist/commands/channel.d.ts.map +1 -0
- package/dist/commands/channel.js +167 -0
- package/dist/commands/channel.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,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mneme blind` (v2.127.0) — Context Blinding. Before code leaves for a hosted
|
|
3
|
+
* model, replace your real secret/identifier names with reversible local
|
|
4
|
+
* placeholders + remove secret literals, so the provider only ever sees
|
|
5
|
+
* structurally-valid but business-meaningless code. `mneme unblind` restores the
|
|
6
|
+
* real names from the local map. The honest, fast core of "code never leaks"
|
|
7
|
+
* (pseudonymization, NOT ZKP/FHE; no kernel hook).
|
|
8
|
+
*
|
|
9
|
+
* cat src/secret.ts | mneme blind --map /tmp/m.json # → send the output to the model
|
|
10
|
+
* echo "<model reply>" | mneme unblind --map /tmp/m.json # → restore real names
|
|
11
|
+
*/
|
|
12
|
+
import type { Command } from "commander";
|
|
13
|
+
export declare function registerBlindCommands(program: Command): void;
|
|
14
|
+
//# sourceMappingURL=blind.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blind.d.ts","sourceRoot":"","sources":["../../src/commands/blind.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqC5D"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mneme blind` (v2.127.0) — Context Blinding. Before code leaves for a hosted
|
|
3
|
+
* model, replace your real secret/identifier names with reversible local
|
|
4
|
+
* placeholders + remove secret literals, so the provider only ever sees
|
|
5
|
+
* structurally-valid but business-meaningless code. `mneme unblind` restores the
|
|
6
|
+
* real names from the local map. The honest, fast core of "code never leaks"
|
|
7
|
+
* (pseudonymization, NOT ZKP/FHE; no kernel hook).
|
|
8
|
+
*
|
|
9
|
+
* cat src/secret.ts | mneme blind --map /tmp/m.json # → send the output to the model
|
|
10
|
+
* echo "<model reply>" | mneme unblind --map /tmp/m.json # → restore real names
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
13
|
+
import { blind } from "@mneme-ai/core";
|
|
14
|
+
function readStdin() {
|
|
15
|
+
return new Promise((resolve) => {
|
|
16
|
+
if (process.stdin.isTTY)
|
|
17
|
+
return resolve("");
|
|
18
|
+
let d = "";
|
|
19
|
+
let done = false;
|
|
20
|
+
const fin = () => { if (!done) {
|
|
21
|
+
done = true;
|
|
22
|
+
resolve(d);
|
|
23
|
+
} };
|
|
24
|
+
process.stdin.setEncoding("utf8");
|
|
25
|
+
process.stdin.on("data", (c) => { d += c; if (d.length > 8_000_000)
|
|
26
|
+
fin(); });
|
|
27
|
+
process.stdin.on("end", fin);
|
|
28
|
+
process.stdin.on("error", fin);
|
|
29
|
+
setTimeout(fin, 4000);
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
export function registerBlindCommands(program) {
|
|
33
|
+
program
|
|
34
|
+
.command("blind")
|
|
35
|
+
.description("🕶 CONTEXT BLINDING — before code goes to a hosted model, remove secret literals + replace sensitive identifier names with reversible local placeholders (SecretFinancialEngine → MZ1). The model sees valid-but-meaningless code; the map stays on your machine. Pseudonymization (fast), NOT ZKP. Pair with `mneme unblind`.")
|
|
36
|
+
.option("--text <t>", "payload inline (else stdin).")
|
|
37
|
+
.option("--file <p>", "read payload from a file.")
|
|
38
|
+
.option("--mode <m>", "'sensitive' (default: secret/financial/internal names) or 'aggressive' (all user identifiers).", "sensitive")
|
|
39
|
+
.option("--protect <names>", "comma-separated identifier names to ALWAYS blind.")
|
|
40
|
+
.option("--map <path>", "write the LOCAL reverse map here (keep it on your machine; needed for unblind).")
|
|
41
|
+
.option("--json", "JSON output (blinded + map + stats).")
|
|
42
|
+
.action(async (opts) => {
|
|
43
|
+
let payload = typeof opts.text === "string" ? opts.text : "";
|
|
44
|
+
if (!payload && opts.file) {
|
|
45
|
+
try {
|
|
46
|
+
if (existsSync(opts.file))
|
|
47
|
+
payload = readFileSync(opts.file, "utf8");
|
|
48
|
+
}
|
|
49
|
+
catch { /* */ }
|
|
50
|
+
}
|
|
51
|
+
if (!payload)
|
|
52
|
+
payload = await readStdin();
|
|
53
|
+
const r = blind.blindContext(payload, {
|
|
54
|
+
mode: opts.mode === "aggressive" ? "aggressive" : "sensitive",
|
|
55
|
+
protect: opts.protect ? opts.protect.split(",").map((s) => s.trim()).filter(Boolean) : undefined,
|
|
56
|
+
});
|
|
57
|
+
if (opts.map) {
|
|
58
|
+
try {
|
|
59
|
+
writeFileSync(opts.map, JSON.stringify(r.map, null, 2));
|
|
60
|
+
}
|
|
61
|
+
catch (e) {
|
|
62
|
+
process.stderr.write(`⚠ could not write map: ${e.message}\n`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (opts.json) {
|
|
66
|
+
process.stdout.write(JSON.stringify(r, null, 2) + "\n");
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
process.stdout.write(r.blinded + "\n");
|
|
70
|
+
process.stderr.write(`🕶 blinded ${r.identifiersBlinded} identifier(s), redacted ${r.secretsRedacted} secret(s)${opts.map ? ` · map → ${opts.map}` : " · pass --map <path> to save the reverse map"}\n`);
|
|
71
|
+
if (!opts.map)
|
|
72
|
+
process.stderr.write(` (without the saved map you cannot unblind the model's reply — keep the map LOCAL, never send it)\n`);
|
|
73
|
+
});
|
|
74
|
+
program
|
|
75
|
+
.command("unblind")
|
|
76
|
+
.description("🕶 Restore real names in a model's reply using the LOCAL map written by `mneme blind --map`.")
|
|
77
|
+
.requiredOption("--map <path>", "the reverse map file from `mneme blind --map`.")
|
|
78
|
+
.option("--text <t>", "the model output inline (else stdin).")
|
|
79
|
+
.action(async (opts) => {
|
|
80
|
+
let map = {};
|
|
81
|
+
try {
|
|
82
|
+
map = JSON.parse(readFileSync(opts.map, "utf8"));
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
process.stderr.write(`✗ could not read map: ${e.message}\n`);
|
|
86
|
+
process.exitCode = 1;
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
let text = typeof opts.text === "string" ? opts.text : "";
|
|
90
|
+
if (!text)
|
|
91
|
+
text = await readStdin();
|
|
92
|
+
process.stdout.write(blind.unblindOutput(text, map) + "\n");
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=blind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blind.js","sourceRoot":"","sources":["../../src/commands/blind.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mneme channel` (v2.128.0) — Context-State Channel (the honest "L2 Lightning"
|
|
3
|
+
* for an AI edit/debug loop). Open a channel over files, send tiny diff ops, get
|
|
4
|
+
* compact deltas back (not the whole file), commit once. Composes with OUTLINE
|
|
5
|
+
* (orient) + BLIND (hide names) for an off-the-wire loop.
|
|
6
|
+
*
|
|
7
|
+
* mneme channel open src/a.ts src/b.ts # → channel id + cheap outlines
|
|
8
|
+
* mneme channel apply --channel <id> --op '{"kind":"replaceText","path":"src/a.ts","find":"foo","replace":"bar"}'
|
|
9
|
+
* mneme channel status --channel <id> # diff summary + measured savings
|
|
10
|
+
* mneme channel commit --channel <id> # settle: write working files to disk
|
|
11
|
+
*/
|
|
12
|
+
import type { Command } from "commander";
|
|
13
|
+
export declare function registerChannelCommands(program: Command): void;
|
|
14
|
+
//# sourceMappingURL=channel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/commands/channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYzC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyE9D"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mneme channel` (v2.128.0) — Context-State Channel (the honest "L2 Lightning"
|
|
3
|
+
* for an AI edit/debug loop). Open a channel over files, send tiny diff ops, get
|
|
4
|
+
* compact deltas back (not the whole file), commit once. Composes with OUTLINE
|
|
5
|
+
* (orient) + BLIND (hide names) for an off-the-wire loop.
|
|
6
|
+
*
|
|
7
|
+
* mneme channel open src/a.ts src/b.ts # → channel id + cheap outlines
|
|
8
|
+
* mneme channel apply --channel <id> --op '{"kind":"replaceText","path":"src/a.ts","find":"foo","replace":"bar"}'
|
|
9
|
+
* mneme channel status --channel <id> # diff summary + measured savings
|
|
10
|
+
* mneme channel commit --channel <id> # settle: write working files to disk
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync } from "node:fs";
|
|
13
|
+
import { resolve, join, dirname } from "node:path";
|
|
14
|
+
import { channel, outline } from "@mneme-ai/core";
|
|
15
|
+
const DIR = ".mneme/channel";
|
|
16
|
+
function out(s) { process.stdout.write(s + "\n"); }
|
|
17
|
+
function outJson(o) { process.stdout.write(JSON.stringify(o, null, 2) + "\n"); }
|
|
18
|
+
function statePath(cwd, id) { return join(cwd, DIR, `${id}.json`); }
|
|
19
|
+
function loadState(cwd, id) { try {
|
|
20
|
+
const p = statePath(cwd, id);
|
|
21
|
+
return existsSync(p) ? JSON.parse(readFileSync(p, "utf8")) : null;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null;
|
|
25
|
+
} }
|
|
26
|
+
function saveState(cwd, st) { try {
|
|
27
|
+
const d = join(cwd, DIR);
|
|
28
|
+
if (!existsSync(d))
|
|
29
|
+
mkdirSync(d, { recursive: true });
|
|
30
|
+
writeFileSync(statePath(cwd, st.id), JSON.stringify(st));
|
|
31
|
+
}
|
|
32
|
+
catch { /* */ } }
|
|
33
|
+
export function registerChannelCommands(program) {
|
|
34
|
+
const ch = program.command("channel").description("⚡ CONTEXT-STATE CHANNEL (L2) — open a channel over files, send tiny diff ops, get compact deltas (not the whole file re-streamed), commit once. Cuts the compounding token cost of an edit/debug loop. Composes with `mneme outline` + `mneme blind`.");
|
|
35
|
+
ch.command("open <files...>")
|
|
36
|
+
.description("Open a channel over one or more files; prints the channel id + a cheap outline of each.")
|
|
37
|
+
.option("--json", "JSON output.")
|
|
38
|
+
.action((files, opts) => {
|
|
39
|
+
const cwd = process.cwd();
|
|
40
|
+
const loaded = [];
|
|
41
|
+
for (const f of files) {
|
|
42
|
+
const p = resolve(cwd, f);
|
|
43
|
+
if (!existsSync(p)) {
|
|
44
|
+
out(`✗ not found: ${f}`);
|
|
45
|
+
process.exitCode = 1;
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
loaded.push({ path: f, content: readFileSync(p, "utf8") });
|
|
49
|
+
}
|
|
50
|
+
const st = channel.openChannel(loaded);
|
|
51
|
+
saveState(cwd, st);
|
|
52
|
+
if (opts.json) {
|
|
53
|
+
outJson({ channel: st.id, files: files });
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
out(`⚡ channel ${st.id} open over ${files.length} file(s):`);
|
|
57
|
+
for (const f of loaded) {
|
|
58
|
+
const o = outline.extractOutline(f.content, { path: f.path });
|
|
59
|
+
out(` ${f.path} — ${o.symbolCount} symbols, ${o.totalLines} lines`);
|
|
60
|
+
}
|
|
61
|
+
out(` send ops: mneme channel apply --channel ${st.id} --op '{"kind":"replaceText","path":"${files[0]}","find":"…","replace":"…"}'`);
|
|
62
|
+
});
|
|
63
|
+
ch.command("apply")
|
|
64
|
+
.description("Apply a diff op to the channel's local working copy; returns a COMPACT delta (ok + brief + structure check).")
|
|
65
|
+
.requiredOption("--channel <id>", "the channel id.")
|
|
66
|
+
.requiredOption("--op <json>", "the diff op: {kind:'replaceRegion'|'replaceText'|'insertAfter'|'appendFile', path, …}")
|
|
67
|
+
.option("--json", "JSON output.")
|
|
68
|
+
.action((opts) => {
|
|
69
|
+
const cwd = process.cwd();
|
|
70
|
+
const st = loadState(cwd, opts.channel);
|
|
71
|
+
if (!st) {
|
|
72
|
+
out(`✗ no channel ${opts.channel} (run \`mneme channel open …\`)`);
|
|
73
|
+
process.exitCode = 1;
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
let op;
|
|
77
|
+
try {
|
|
78
|
+
op = JSON.parse(opts.op);
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
out(`✗ invalid --op JSON: ${e.message}`);
|
|
82
|
+
process.exitCode = 1;
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const r = channel.applyOp(st, op);
|
|
86
|
+
saveState(cwd, r.state);
|
|
87
|
+
if (opts.json) {
|
|
88
|
+
outJson(r.result);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const icon = r.result.ok ? (r.result.structureOk ? "✓" : "⚠") : "✗";
|
|
92
|
+
out(`${icon} op#${r.result.opId} ${r.result.path}: ${r.result.brief}`);
|
|
93
|
+
if (r.result.ok && !r.result.structureOk) {
|
|
94
|
+
out(` structure BROKEN — fix before commit`);
|
|
95
|
+
process.exitCode = 2;
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
ch.command("status")
|
|
99
|
+
.description("Show the channel's diff summary + the measured token saving vs the naive re-stream loop.")
|
|
100
|
+
.requiredOption("--channel <id>", "the channel id.")
|
|
101
|
+
.option("--json", "JSON output.")
|
|
102
|
+
.action((opts) => {
|
|
103
|
+
const cwd = process.cwd();
|
|
104
|
+
const st = loadState(cwd, opts.channel);
|
|
105
|
+
if (!st) {
|
|
106
|
+
out(`✗ no channel ${opts.channel}`);
|
|
107
|
+
process.exitCode = 1;
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const diffs = Object.keys(st.files).map((p) => channel.diffSummary(st, p));
|
|
111
|
+
const sav = channel.channelSavings(st);
|
|
112
|
+
if (opts.json) {
|
|
113
|
+
outJson({ channel: st.id, ops: st.opCount, diffs, savings: sav });
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
out(`⚡ channel ${st.id} — ${st.opCount} op(s)`);
|
|
117
|
+
for (const d of diffs)
|
|
118
|
+
out(` ${d.path}: ${d.changed ? `changed (+${d.addedLines}/-${d.removedLines} near L${d.hunks[0]?.startLine})` : "unchanged"}`);
|
|
119
|
+
out(` 💰 ~${sav.channelTokens} channel tok vs ~${sav.naiveTokens} naive (${sav.reductionPct}% less). ${sav.note}`);
|
|
120
|
+
});
|
|
121
|
+
ch.command("commit")
|
|
122
|
+
.description("Settle the channel: write the working files to disk. Refuses if a file's structure is broken (override with --force).")
|
|
123
|
+
.requiredOption("--channel <id>", "the channel id.")
|
|
124
|
+
.option("--force", "write even if a quick structural check fails.")
|
|
125
|
+
.action((opts) => {
|
|
126
|
+
const cwd = process.cwd();
|
|
127
|
+
const st = loadState(cwd, opts.channel);
|
|
128
|
+
if (!st) {
|
|
129
|
+
out(`✗ no channel ${opts.channel}`);
|
|
130
|
+
process.exitCode = 1;
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const settle = channel.commitChannel(st);
|
|
134
|
+
for (const f of settle.files) {
|
|
135
|
+
if (!f.changed)
|
|
136
|
+
continue;
|
|
137
|
+
const chk = channel.quickCheck(f.content, f.path.toLowerCase().endsWith(".py"));
|
|
138
|
+
if (!chk.ok && !opts.force) {
|
|
139
|
+
out(`✗ ${f.path}: structure check failed (${chk.issue}) — fix or pass --force`);
|
|
140
|
+
process.exitCode = 2;
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
try {
|
|
144
|
+
const p = resolve(cwd, f.path);
|
|
145
|
+
if (!existsSync(dirname(p)))
|
|
146
|
+
mkdirSync(dirname(p), { recursive: true });
|
|
147
|
+
writeFileSync(p, f.content);
|
|
148
|
+
out(`✓ wrote ${f.path}`);
|
|
149
|
+
}
|
|
150
|
+
catch (e) {
|
|
151
|
+
out(`✗ write ${f.path}: ${e.message}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
out(`⚡ channel ${st.id} settled (${st.opCount} ops).`);
|
|
155
|
+
});
|
|
156
|
+
ch.command("list").description("List open channels.").action(() => {
|
|
157
|
+
const cwd = process.cwd();
|
|
158
|
+
const d = join(cwd, DIR);
|
|
159
|
+
const ids = existsSync(d) ? readdirSync(d).filter((f) => f.endsWith(".json")).map((f) => f.replace(/\.json$/, "")) : [];
|
|
160
|
+
if (ids.length === 0) {
|
|
161
|
+
out("(no open channels)");
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
out(`⚡ ${ids.length} channel(s): ${ids.join(", ")}`);
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=channel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/commands/channel.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":"AAyJA,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2gNvD"}
|
package/dist/index.js
CHANGED
|
@@ -84,6 +84,8 @@ import { registerExecCommands } from "./commands/exec.js";
|
|
|
84
84
|
import { registerBequestCommands } from "./commands/bequest.js";
|
|
85
85
|
import { registerOutlineCommands } from "./commands/outline.js";
|
|
86
86
|
import { registerScaffoldCommands } from "./commands/scaffold.js";
|
|
87
|
+
import { registerBlindCommands } from "./commands/blind.js";
|
|
88
|
+
import { registerChannelCommands } from "./commands/channel.js";
|
|
87
89
|
import { registerTrustCommands } from "./commands/trust.js";
|
|
88
90
|
import { registerNuclearCommands } from "./commands/nuclear-cli.js";
|
|
89
91
|
import { registerOvernightCommand } from "./commands/overnight.js";
|
|
@@ -4713,6 +4715,8 @@ export async function run(argv) {
|
|
|
4713
4715
|
registerBequestCommands(program);
|
|
4714
4716
|
registerOutlineCommands(program);
|
|
4715
4717
|
registerScaffoldCommands(program);
|
|
4718
|
+
registerBlindCommands(program);
|
|
4719
|
+
registerChannelCommands(program);
|
|
4716
4720
|
// ─── Trust calibrator (v1.31.0) -- per-subsystem precision/recall/band
|
|
4717
4721
|
registerTrustCommands(program);
|
|
4718
4722
|
// ─── Wisdom reactor (v1.33.0) -- five nuclear-physics formulas as Mneme metrics
|