@mneme-ai/core 2.19.87 → 2.19.88-lite
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/agent_manifest.d.ts +1 -1
- package/dist/agent_manifest.d.ts.map +1 -1
- package/dist/agent_manifest.js +23 -1
- package/dist/agent_manifest.js.map +1 -1
- package/dist/ai_jury/ai_jury.test.d.ts +2 -0
- package/dist/ai_jury/ai_jury.test.d.ts.map +1 -0
- package/dist/ai_jury/ai_jury.test.js +26 -0
- package/dist/ai_jury/ai_jury.test.js.map +1 -0
- package/dist/ai_jury/index.d.ts +34 -0
- package/dist/ai_jury/index.d.ts.map +1 -0
- package/dist/ai_jury/index.js +46 -0
- package/dist/ai_jury/index.js.map +1 -0
- package/dist/gauntlet/gauntlet.test.d.ts +2 -0
- package/dist/gauntlet/gauntlet.test.d.ts.map +1 -0
- package/dist/gauntlet/gauntlet.test.js +30 -0
- package/dist/gauntlet/gauntlet.test.js.map +1 -0
- package/dist/gauntlet/index.d.ts +65 -0
- package/dist/gauntlet/index.d.ts.map +1 -0
- package/dist/gauntlet/index.js +121 -0
- package/dist/gauntlet/index.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/lie_stream/index.d.ts +27 -0
- package/dist/lie_stream/index.d.ts.map +1 -0
- package/dist/lie_stream/index.js +27 -0
- package/dist/lie_stream/index.js.map +1 -0
- package/dist/provenance/index.d.ts +36 -0
- package/dist/provenance/index.d.ts.map +1 -0
- package/dist/provenance/index.js +99 -0
- package/dist/provenance/index.js.map +1 -0
- package/dist/provenance/provenance.test.d.ts +2 -0
- package/dist/provenance/provenance.test.d.ts.map +1 -0
- package/dist/provenance/provenance.test.js +39 -0
- package/dist/provenance/provenance.test.js.map +1 -0
- package/dist/truth_swarm/index.d.ts +64 -0
- package/dist/truth_swarm/index.d.ts.map +1 -0
- package/dist/truth_swarm/index.js +259 -0
- package/dist/truth_swarm/index.js.map +1 -0
- package/dist/truth_swarm/truth_swarm.test.d.ts +2 -0
- package/dist/truth_swarm/truth_swarm.test.d.ts.map +1 -0
- package/dist/truth_swarm/truth_swarm.test.js +64 -0
- package/dist/truth_swarm/truth_swarm.test.js.map +1 -0
- package/package.json +2 -5
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.88 — #1 MNEME TRUTH SWARM (the flagship "อึ้ง" demo).
|
|
3
|
+
*
|
|
4
|
+
* If Antigravity fires 93 generative agents to BUILD an OS, Truth Swarm
|
|
5
|
+
* fires every Mneme audit organ in parallel to TRUTH-CHECK any input.
|
|
6
|
+
*
|
|
7
|
+
* The swarm composition (all Ollama-free, all already-shipped):
|
|
8
|
+
* 1. POLYGRAPH sentence-level browser-polygraph verdict
|
|
9
|
+
* 2. WHISTLEBLOWER dangerous-command / secret-leak / compliance scan
|
|
10
|
+
* 3. RETIREMENT 7-oracle hallucination detector (lexicon-renamed
|
|
11
|
+
* from apoptosis)
|
|
12
|
+
* 4. SOCRATIC humble hypotheses about WHY the code is shaped this way
|
|
13
|
+
* 5. DEP_MORTALITY if input mentions npm packages, score each one
|
|
14
|
+
* 6. CONFESSIONAL_HOOK form a draft confession if a refute fires
|
|
15
|
+
* 7. PULSE_RECORD every verdict flows into pulse.jsonl for the globe
|
|
16
|
+
* 8. CHRONOSHEAF contradiction sniffer over the input (if available)
|
|
17
|
+
*
|
|
18
|
+
* Returns a unified `SwarmReport` with:
|
|
19
|
+
* - per-organ verdict object (ready for the dashboard's animated node)
|
|
20
|
+
* - overall verdict: SHIP / CAUTION / BLOCK (one-call decision)
|
|
21
|
+
* - HMAC-signed report id so the artifact is shareable
|
|
22
|
+
*
|
|
23
|
+
* Latency budget: <500ms for the full swarm (each organ is local + pure
|
|
24
|
+
* JS); fan-out is parallel so the slowest organ sets the wall-clock time.
|
|
25
|
+
*/
|
|
26
|
+
export type OrganName = "polygraph" | "whistleblower" | "retirement" | "socratic" | "dep_mortality" | "confessional_hook" | "pulse_record" | "chronosheaf";
|
|
27
|
+
export interface OrganOutput {
|
|
28
|
+
organ: OrganName;
|
|
29
|
+
ok: boolean;
|
|
30
|
+
verdict: "green" | "yellow" | "red" | "grey";
|
|
31
|
+
latencyMs: number;
|
|
32
|
+
oneLine: string;
|
|
33
|
+
details?: unknown;
|
|
34
|
+
}
|
|
35
|
+
export interface SwarmReport {
|
|
36
|
+
reportId: string;
|
|
37
|
+
ts: string;
|
|
38
|
+
inputHash: string;
|
|
39
|
+
inputLength: number;
|
|
40
|
+
organs: OrganOutput[];
|
|
41
|
+
overallVerdict: "ship" | "caution" | "block";
|
|
42
|
+
greenCount: number;
|
|
43
|
+
yellowCount: number;
|
|
44
|
+
redCount: number;
|
|
45
|
+
greyCount: number;
|
|
46
|
+
sig: string;
|
|
47
|
+
}
|
|
48
|
+
export interface SwarmInput {
|
|
49
|
+
/** The text to audit (AI response / diff / commit message / etc). */
|
|
50
|
+
text: string;
|
|
51
|
+
/** Optional vendor label — propagated to organs that record provenance. */
|
|
52
|
+
vendor?: string;
|
|
53
|
+
/** Optional `repoRoot` override. */
|
|
54
|
+
repoRoot?: string;
|
|
55
|
+
/** Hook for skipping organs in tests. */
|
|
56
|
+
skipOrgans?: OrganName[];
|
|
57
|
+
}
|
|
58
|
+
/** Run the full swarm on an input. Every organ executes in parallel;
|
|
59
|
+
* failures degrade gracefully (organ marked grey, never throws). */
|
|
60
|
+
export declare function runTruthSwarm(input: SwarmInput): Promise<SwarmReport>;
|
|
61
|
+
export declare function readSwarmReports(repoRoot: string, opts?: {
|
|
62
|
+
limit?: number;
|
|
63
|
+
}): SwarmReport[];
|
|
64
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/truth_swarm/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAUH,MAAM,MAAM,SAAS,GACjB,WAAW,GACX,eAAe,GACf,YAAY,GACZ,UAAU,GACV,eAAe,GACf,mBAAmB,GACnB,cAAc,GACd,aAAa,CAAC;AAElB,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,SAAS,CAAC;IACjB,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,UAAU;IACzB,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;CAC1B;AA2BD;qEACqE;AACrE,wBAAsB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CA+K3E;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,WAAW,EAAE,CAU/F"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.88 — #1 MNEME TRUTH SWARM (the flagship "อึ้ง" demo).
|
|
3
|
+
*
|
|
4
|
+
* If Antigravity fires 93 generative agents to BUILD an OS, Truth Swarm
|
|
5
|
+
* fires every Mneme audit organ in parallel to TRUTH-CHECK any input.
|
|
6
|
+
*
|
|
7
|
+
* The swarm composition (all Ollama-free, all already-shipped):
|
|
8
|
+
* 1. POLYGRAPH sentence-level browser-polygraph verdict
|
|
9
|
+
* 2. WHISTLEBLOWER dangerous-command / secret-leak / compliance scan
|
|
10
|
+
* 3. RETIREMENT 7-oracle hallucination detector (lexicon-renamed
|
|
11
|
+
* from apoptosis)
|
|
12
|
+
* 4. SOCRATIC humble hypotheses about WHY the code is shaped this way
|
|
13
|
+
* 5. DEP_MORTALITY if input mentions npm packages, score each one
|
|
14
|
+
* 6. CONFESSIONAL_HOOK form a draft confession if a refute fires
|
|
15
|
+
* 7. PULSE_RECORD every verdict flows into pulse.jsonl for the globe
|
|
16
|
+
* 8. CHRONOSHEAF contradiction sniffer over the input (if available)
|
|
17
|
+
*
|
|
18
|
+
* Returns a unified `SwarmReport` with:
|
|
19
|
+
* - per-organ verdict object (ready for the dashboard's animated node)
|
|
20
|
+
* - overall verdict: SHIP / CAUTION / BLOCK (one-call decision)
|
|
21
|
+
* - HMAC-signed report id so the artifact is shareable
|
|
22
|
+
*
|
|
23
|
+
* Latency budget: <500ms for the full swarm (each organ is local + pure
|
|
24
|
+
* JS); fan-out is parallel so the slowest organ sets the wall-clock time.
|
|
25
|
+
*/
|
|
26
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, appendFileSync } from "node:fs";
|
|
27
|
+
import { join } from "node:path";
|
|
28
|
+
import { createHmac, randomBytes } from "node:crypto";
|
|
29
|
+
const DIR = ".mneme/truth_swarm";
|
|
30
|
+
const LEDGER = "swarm-reports.jsonl";
|
|
31
|
+
const KEY_FILE = "swarm.key";
|
|
32
|
+
function ensureKey(repoRoot) {
|
|
33
|
+
const dir = join(repoRoot, DIR);
|
|
34
|
+
if (!existsSync(dir))
|
|
35
|
+
mkdirSync(dir, { recursive: true });
|
|
36
|
+
const p = join(dir, KEY_FILE);
|
|
37
|
+
if (existsSync(p))
|
|
38
|
+
return readFileSync(p, "utf8").trim();
|
|
39
|
+
const k = randomBytes(32).toString("base64url");
|
|
40
|
+
writeFileSync(p, k, "utf8");
|
|
41
|
+
return k;
|
|
42
|
+
}
|
|
43
|
+
function hashInput(text) {
|
|
44
|
+
return createHmac("sha256", "mneme-swarm-input").update(text).digest("base64url").slice(0, 16);
|
|
45
|
+
}
|
|
46
|
+
async function runWithTimeout(label, fn, timeoutMs = 5000) {
|
|
47
|
+
const t0 = Date.now();
|
|
48
|
+
try {
|
|
49
|
+
const result = await Promise.race([
|
|
50
|
+
Promise.resolve().then(fn),
|
|
51
|
+
new Promise((_, rej) => setTimeout(() => rej(new Error("organ-timeout:" + label)), timeoutMs)),
|
|
52
|
+
]);
|
|
53
|
+
return { result, latencyMs: Date.now() - t0 };
|
|
54
|
+
}
|
|
55
|
+
catch (e) {
|
|
56
|
+
return { error: e, latencyMs: Date.now() - t0 };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/** Run the full swarm on an input. Every organ executes in parallel;
|
|
60
|
+
* failures degrade gracefully (organ marked grey, never throws). */
|
|
61
|
+
export async function runTruthSwarm(input) {
|
|
62
|
+
const repoRoot = input.repoRoot ?? process.cwd();
|
|
63
|
+
const text = input.text || "";
|
|
64
|
+
const skip = new Set(input.skipOrgans ?? []);
|
|
65
|
+
const tasks = [];
|
|
66
|
+
if (!skip.has("polygraph")) {
|
|
67
|
+
tasks.push((async () => {
|
|
68
|
+
const r = await runWithTimeout("polygraph", async () => {
|
|
69
|
+
const { verifyBrowserSentence } = await import("../polygraph/index.js");
|
|
70
|
+
// Use first 200 chars as the canonical claim sentence.
|
|
71
|
+
return verifyBrowserSentence({ sentence: text.slice(0, 200), repoRoot });
|
|
72
|
+
});
|
|
73
|
+
if (r.error || !r.result)
|
|
74
|
+
return { organ: "polygraph", ok: false, verdict: "grey", latencyMs: r.latencyMs, oneLine: r.error?.message ?? "no verdict" };
|
|
75
|
+
const v = r.result;
|
|
76
|
+
return { organ: "polygraph", ok: true, verdict: v.color, latencyMs: r.latencyMs, oneLine: v.oneLine, details: v };
|
|
77
|
+
})());
|
|
78
|
+
}
|
|
79
|
+
if (!skip.has("whistleblower")) {
|
|
80
|
+
tasks.push((async () => {
|
|
81
|
+
const r = await runWithTimeout("whistleblower", async () => {
|
|
82
|
+
const { scanWhistle } = await import("../whistleblower/index.js");
|
|
83
|
+
return scanWhistle(text, { vendor: input.vendor });
|
|
84
|
+
});
|
|
85
|
+
if (r.error || !r.result)
|
|
86
|
+
return { organ: "whistleblower", ok: false, verdict: "grey", latencyMs: r.latencyMs, oneLine: r.error?.message ?? "scan-failed" };
|
|
87
|
+
const incidents = r.result;
|
|
88
|
+
const hasBlock = incidents.some((i) => i.severity === "block");
|
|
89
|
+
const hasWarn = incidents.some((i) => i.severity === "warn");
|
|
90
|
+
return {
|
|
91
|
+
organ: "whistleblower", ok: true,
|
|
92
|
+
verdict: hasBlock ? "red" : hasWarn ? "yellow" : incidents.length > 0 ? "yellow" : "green",
|
|
93
|
+
latencyMs: r.latencyMs,
|
|
94
|
+
oneLine: incidents.length > 0 ? `${incidents.length} compliance flag${incidents.length === 1 ? "" : "s"}` : "no compliance flags",
|
|
95
|
+
details: incidents,
|
|
96
|
+
};
|
|
97
|
+
})());
|
|
98
|
+
}
|
|
99
|
+
if (!skip.has("retirement")) {
|
|
100
|
+
tasks.push((async () => {
|
|
101
|
+
const r = await runWithTimeout("retirement", async () => {
|
|
102
|
+
// The lexicon renames apoptosis → retirement at vendor time; the
|
|
103
|
+
// core module is still named apoptosis on disk. Import dynamically
|
|
104
|
+
// and call best-effort — graceful degrade on signature mismatch.
|
|
105
|
+
try {
|
|
106
|
+
const m = await import("../apoptosis/index.js");
|
|
107
|
+
const fn = (m.detect ?? m.runApoptosis);
|
|
108
|
+
if (typeof fn !== "function")
|
|
109
|
+
return null;
|
|
110
|
+
// apoptosis.detect(repoRoot, claim) signature in this codebase.
|
|
111
|
+
return fn(repoRoot, text.slice(0, 200));
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
if (r.error || !r.result)
|
|
118
|
+
return { organ: "retirement", ok: false, verdict: "grey", latencyMs: r.latencyMs, oneLine: r.error?.message ?? "no-detector" };
|
|
119
|
+
const verdict = r.result.verdict ?? "HEALTHY";
|
|
120
|
+
const color = verdict === "NECROTIC" ? "red" : verdict === "INFLAMED" ? "yellow" : verdict === "APOPTOTIC" ? "red" : "green";
|
|
121
|
+
return { organ: "retirement", ok: true, verdict: color, latencyMs: r.latencyMs, oneLine: `retirement: ${verdict}`, details: r.result };
|
|
122
|
+
})());
|
|
123
|
+
}
|
|
124
|
+
if (!skip.has("socratic")) {
|
|
125
|
+
tasks.push((async () => {
|
|
126
|
+
const r = await runWithTimeout("socratic", async () => {
|
|
127
|
+
const { readSocratic } = await import("../socratic/index.js");
|
|
128
|
+
return readSocratic("swarm-input", text);
|
|
129
|
+
});
|
|
130
|
+
if (r.error || !r.result)
|
|
131
|
+
return { organ: "socratic", ok: false, verdict: "grey", latencyMs: r.latencyMs, oneLine: r.error?.message ?? "no-features" };
|
|
132
|
+
const features = r.result.features;
|
|
133
|
+
return {
|
|
134
|
+
organ: "socratic", ok: true,
|
|
135
|
+
verdict: features.length > 0 ? "yellow" : "green",
|
|
136
|
+
latencyMs: r.latencyMs,
|
|
137
|
+
oneLine: features.length > 0 ? `${features.length} code feature${features.length === 1 ? "" : "s"} detected — 3 hypotheses ready` : "no code features",
|
|
138
|
+
details: r.result,
|
|
139
|
+
};
|
|
140
|
+
})());
|
|
141
|
+
}
|
|
142
|
+
if (!skip.has("dep_mortality")) {
|
|
143
|
+
tasks.push((async () => {
|
|
144
|
+
const r = await runWithTimeout("dep_mortality", async () => {
|
|
145
|
+
const { predictMortality } = await import("../dep_mortality/index.js");
|
|
146
|
+
// Extract `npm install <pkg>` / `import x from 'pkg'` / `require('pkg')` mentions.
|
|
147
|
+
const pkgs = new Set();
|
|
148
|
+
const reInstall = /npm\s+(?:install|i|add)\s+(?:-[A-Za-z]+\s+)*([@\w/-]+)/g;
|
|
149
|
+
const reImport = /(?:from|require\s*\()\s*['"]([@\w./-]+)['"]/g;
|
|
150
|
+
let m;
|
|
151
|
+
while ((m = reInstall.exec(text)) !== null)
|
|
152
|
+
pkgs.add(m[1]);
|
|
153
|
+
while ((m = reImport.exec(text)) !== null) {
|
|
154
|
+
const p = m[1];
|
|
155
|
+
if (!p.startsWith(".") && !p.startsWith("/"))
|
|
156
|
+
pkgs.add(p.split("/")[0]);
|
|
157
|
+
}
|
|
158
|
+
const reports = [...pkgs].slice(0, 5).map((name) => predictMortality({ name, monthsSinceLatest: 0, monthsSinceFeatureRelease: 0 }));
|
|
159
|
+
return { pkgs: [...pkgs], reports };
|
|
160
|
+
});
|
|
161
|
+
if (r.error || !r.result)
|
|
162
|
+
return { organ: "dep_mortality", ok: false, verdict: "grey", latencyMs: r.latencyMs, oneLine: r.error?.message ?? "no-packages" };
|
|
163
|
+
const reports = r.result.reports;
|
|
164
|
+
if (reports.length === 0)
|
|
165
|
+
return { organ: "dep_mortality", ok: true, verdict: "green", latencyMs: r.latencyMs, oneLine: "no npm packages mentioned" };
|
|
166
|
+
const worst = reports.reduce((acc, x) => x.score > acc.score ? x : acc, reports[0]);
|
|
167
|
+
const color = worst.band === "dead" || worst.band === "moribund" ? "red" : worst.band === "watch" ? "yellow" : "green";
|
|
168
|
+
return { organ: "dep_mortality", ok: true, verdict: color, latencyMs: r.latencyMs, oneLine: `${reports.length} package${reports.length === 1 ? "" : "s"} scanned; worst: ${worst.package} (${worst.band})`, details: r.result };
|
|
169
|
+
})());
|
|
170
|
+
}
|
|
171
|
+
if (!skip.has("confessional_hook")) {
|
|
172
|
+
tasks.push((async () => {
|
|
173
|
+
const r = await runWithTimeout("confessional_hook", () => ({}));
|
|
174
|
+
// This organ is a HOOK — it doesn't run anything on its own; instead
|
|
175
|
+
// it lights up only if the polygraph or retirement organ already
|
|
176
|
+
// returned red. The dashboard wires it post-hoc.
|
|
177
|
+
return { organ: "confessional_hook", ok: true, verdict: "green", latencyMs: r.latencyMs, oneLine: "ready to draft a confession if RED fires" };
|
|
178
|
+
})());
|
|
179
|
+
}
|
|
180
|
+
if (!skip.has("pulse_record")) {
|
|
181
|
+
tasks.push((async () => {
|
|
182
|
+
const r = await runWithTimeout("pulse_record", async () => {
|
|
183
|
+
const { recordPulseEvent } = await import("../world_pulse/index.js");
|
|
184
|
+
return recordPulseEvent(repoRoot, { vendor: input.vendor ?? "swarm", color: "grey", topicHash: hashInput(text).slice(0, 6) });
|
|
185
|
+
});
|
|
186
|
+
if (r.error || !r.result)
|
|
187
|
+
return { organ: "pulse_record", ok: false, verdict: "grey", latencyMs: r.latencyMs, oneLine: r.error?.message ?? "no-pulse" };
|
|
188
|
+
return { organ: "pulse_record", ok: true, verdict: "green", latencyMs: r.latencyMs, oneLine: "swarm event recorded into pulse.jsonl" };
|
|
189
|
+
})());
|
|
190
|
+
}
|
|
191
|
+
if (!skip.has("chronosheaf")) {
|
|
192
|
+
tasks.push((async () => {
|
|
193
|
+
const r = await runWithTimeout("chronosheaf", async () => {
|
|
194
|
+
try {
|
|
195
|
+
const m = await import("../chronosheaf/index.js");
|
|
196
|
+
const fn = m.quickContradictionScan;
|
|
197
|
+
return typeof fn === "function" ? fn(text) : null;
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
if (r.error || !r.result)
|
|
204
|
+
return { organ: "chronosheaf", ok: true, verdict: "green", latencyMs: r.latencyMs, oneLine: "no contradiction detector wired" };
|
|
205
|
+
const c = r.result.contradictions ?? 0;
|
|
206
|
+
return { organ: "chronosheaf", ok: true, verdict: c > 0 ? "yellow" : "green", latencyMs: r.latencyMs, oneLine: c > 0 ? `${c} contradiction${c === 1 ? "" : "s"} flagged` : "no contradictions" };
|
|
207
|
+
})());
|
|
208
|
+
}
|
|
209
|
+
const organs = await Promise.all(tasks);
|
|
210
|
+
let green = 0, yellow = 0, red = 0, grey = 0;
|
|
211
|
+
for (const o of organs) {
|
|
212
|
+
if (o.verdict === "green")
|
|
213
|
+
green++;
|
|
214
|
+
else if (o.verdict === "yellow")
|
|
215
|
+
yellow++;
|
|
216
|
+
else if (o.verdict === "red")
|
|
217
|
+
red++;
|
|
218
|
+
else
|
|
219
|
+
grey++;
|
|
220
|
+
}
|
|
221
|
+
const overallVerdict = red > 0 ? "block"
|
|
222
|
+
: yellow >= 2 ? "caution"
|
|
223
|
+
: yellow === 1 ? "caution"
|
|
224
|
+
: "ship";
|
|
225
|
+
const key = ensureKey(repoRoot);
|
|
226
|
+
const ts = new Date().toISOString();
|
|
227
|
+
const reportId = "swarm_" + randomBytes(6).toString("base64url");
|
|
228
|
+
const inputHash = hashInput(text);
|
|
229
|
+
const sigPayload = `${reportId}|${ts}|${inputHash}|${organs.map((o) => o.organ + ":" + o.verdict).join(",")}|${overallVerdict}`;
|
|
230
|
+
const sig = createHmac("sha256", key).update(sigPayload).digest("base64url").slice(0, 24);
|
|
231
|
+
const report = {
|
|
232
|
+
reportId, ts, inputHash, inputLength: text.length, organs,
|
|
233
|
+
overallVerdict, greenCount: green, yellowCount: yellow, redCount: red, greyCount: grey, sig,
|
|
234
|
+
};
|
|
235
|
+
try {
|
|
236
|
+
const dir = join(repoRoot, DIR);
|
|
237
|
+
if (!existsSync(dir))
|
|
238
|
+
mkdirSync(dir, { recursive: true });
|
|
239
|
+
appendFileSync(join(repoRoot, DIR, LEDGER), JSON.stringify(report) + "\n", "utf8");
|
|
240
|
+
}
|
|
241
|
+
catch { /* non-fatal */ }
|
|
242
|
+
return report;
|
|
243
|
+
}
|
|
244
|
+
export function readSwarmReports(repoRoot, opts = {}) {
|
|
245
|
+
const p = join(repoRoot, DIR, LEDGER);
|
|
246
|
+
if (!existsSync(p))
|
|
247
|
+
return [];
|
|
248
|
+
const lines = readFileSync(p, "utf8").trim().split("\n").filter(Boolean);
|
|
249
|
+
const out = [];
|
|
250
|
+
for (const line of lines) {
|
|
251
|
+
try {
|
|
252
|
+
out.push(JSON.parse(line));
|
|
253
|
+
}
|
|
254
|
+
catch { /* */ }
|
|
255
|
+
}
|
|
256
|
+
out.reverse();
|
|
257
|
+
return typeof opts.limit === "number" ? out.slice(0, opts.limit) : out;
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/truth_swarm/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truth_swarm.test.d.ts","sourceRoot":"","sources":["../../src/truth_swarm/truth_swarm.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { mkdtempSync, rmSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { runTruthSwarm, readSwarmReports } from "./index.js";
|
|
6
|
+
function tmpRepo() { return mkdtempSync(join(tmpdir(), "mneme-swarm-")); }
|
|
7
|
+
describe("truth_swarm · orchestration", () => {
|
|
8
|
+
it("fires multiple organs in parallel and returns a SwarmReport", async () => {
|
|
9
|
+
const r = tmpRepo();
|
|
10
|
+
try {
|
|
11
|
+
const report = await runTruthSwarm({ text: "just run rm -rf /tmp", repoRoot: r });
|
|
12
|
+
expect(report.organs.length).toBeGreaterThanOrEqual(5);
|
|
13
|
+
expect(report.reportId).toMatch(/^swarm_/);
|
|
14
|
+
expect(report.sig.length).toBeGreaterThan(10);
|
|
15
|
+
// dangerous-command should fire RED via whistleblower → BLOCK overall.
|
|
16
|
+
expect(report.overallVerdict).toBe("block");
|
|
17
|
+
// each organ has the required shape
|
|
18
|
+
for (const o of report.organs) {
|
|
19
|
+
expect(["green", "yellow", "red", "grey"]).toContain(o.verdict);
|
|
20
|
+
expect(typeof o.latencyMs).toBe("number");
|
|
21
|
+
expect(typeof o.oneLine).toBe("string");
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
rmSync(r, { recursive: true, force: true });
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
it("clean text yields ship verdict", async () => {
|
|
29
|
+
const r = tmpRepo();
|
|
30
|
+
try {
|
|
31
|
+
const report = await runTruthSwarm({ text: "hello there", repoRoot: r });
|
|
32
|
+
expect(["ship", "caution"]).toContain(report.overallVerdict);
|
|
33
|
+
expect(report.redCount).toBe(0);
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
rmSync(r, { recursive: true, force: true });
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
it("persists reports to the ledger (readSwarmReports round-trip)", async () => {
|
|
40
|
+
const r = tmpRepo();
|
|
41
|
+
try {
|
|
42
|
+
await runTruthSwarm({ text: "hello", repoRoot: r });
|
|
43
|
+
await runTruthSwarm({ text: "world", repoRoot: r });
|
|
44
|
+
const ledger = readSwarmReports(r);
|
|
45
|
+
expect(ledger.length).toBeGreaterThanOrEqual(2);
|
|
46
|
+
expect(ledger[0].ts >= ledger[1].ts).toBe(true); // newest first
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
rmSync(r, { recursive: true, force: true });
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
it("skipOrgans excludes the named organs from the run", async () => {
|
|
53
|
+
const r = tmpRepo();
|
|
54
|
+
try {
|
|
55
|
+
const report = await runTruthSwarm({ text: "anything", repoRoot: r, skipOrgans: ["polygraph", "retirement"] });
|
|
56
|
+
expect(report.organs.find((o) => o.organ === "polygraph")).toBeUndefined();
|
|
57
|
+
expect(report.organs.find((o) => o.organ === "retirement")).toBeUndefined();
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
rmSync(r, { recursive: true, force: true });
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
//# sourceMappingURL=truth_swarm.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truth_swarm.test.js","sourceRoot":"","sources":["../../src/truth_swarm/truth_swarm.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mneme-ai/core",
|
|
3
|
-
"version": "2.19.
|
|
4
|
-
"description": "Core indexing, retrieval, and graph engine for Mneme",
|
|
3
|
+
"version": "2.19.88-lite",
|
|
4
|
+
"description": "Core indexing, retrieval, and graph engine for Mneme — LITE variant (no bundled WASM embedder, no native deps).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -69,8 +69,5 @@
|
|
|
69
69
|
},
|
|
70
70
|
"engines": {
|
|
71
71
|
"node": ">=22.13.0 <25.0.0"
|
|
72
|
-
},
|
|
73
|
-
"optionalDependencies": {
|
|
74
|
-
"z3-solver": "^4.16.0"
|
|
75
72
|
}
|
|
76
73
|
}
|