@mneme-ai/core 2.29.1 → 2.31.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/agent_manifest.d.ts +1 -1
- package/dist/agent_manifest.d.ts.map +1 -1
- package/dist/agent_manifest.js +23 -0
- package/dist/agent_manifest.js.map +1 -1
- package/dist/conclave/aletheia_weights.d.ts.map +1 -1
- package/dist/conclave/aletheia_weights.js +16 -4
- package/dist/conclave/aletheia_weights.js.map +1 -1
- package/dist/diaspora/http_bridge.d.ts.map +1 -1
- package/dist/hgp/hgp.test.d.ts +2 -0
- package/dist/hgp/hgp.test.d.ts.map +1 -0
- package/dist/hgp/hgp.test.js +198 -0
- package/dist/hgp/hgp.test.js.map +1 -0
- package/dist/hgp/hgp_id.d.ts +18 -0
- package/dist/hgp/hgp_id.d.ts.map +1 -0
- package/dist/hgp/hgp_id.js +41 -0
- package/dist/hgp/hgp_id.js.map +1 -0
- package/dist/hgp/index.d.ts +12 -0
- package/dist/hgp/index.d.ts.map +1 -0
- package/dist/hgp/index.js +10 -0
- package/dist/hgp/index.js.map +1 -0
- package/dist/hgp/registry.d.ts +64 -0
- package/dist/hgp/registry.d.ts.map +1 -0
- package/dist/hgp/registry.js +221 -0
- package/dist/hgp/registry.js.map +1 -0
- package/dist/hgp/severity.d.ts +19 -0
- package/dist/hgp/severity.d.ts.map +1 -0
- package/dist/hgp/severity.js +46 -0
- package/dist/hgp/severity.js.map +1 -0
- package/dist/hgp/types.d.ts +60 -0
- package/dist/hgp/types.d.ts.map +1 -0
- package/dist/hgp/types.js +11 -0
- package/dist/hgp/types.js.map +1 -0
- package/dist/honest_mirror/anonymizer.d.ts +29 -0
- package/dist/honest_mirror/anonymizer.d.ts.map +1 -0
- package/dist/honest_mirror/anonymizer.js +77 -0
- package/dist/honest_mirror/anonymizer.js.map +1 -0
- package/dist/honest_mirror/calibration.d.ts +37 -0
- package/dist/honest_mirror/calibration.d.ts.map +1 -0
- package/dist/honest_mirror/calibration.js +106 -0
- package/dist/honest_mirror/calibration.js.map +1 -0
- package/dist/honest_mirror/engine.d.ts +66 -0
- package/dist/honest_mirror/engine.d.ts.map +1 -0
- package/dist/honest_mirror/engine.js +227 -0
- package/dist/honest_mirror/engine.js.map +1 -0
- package/dist/honest_mirror/honest_mirror.test.d.ts +2 -0
- package/dist/honest_mirror/honest_mirror.test.d.ts.map +1 -0
- package/dist/honest_mirror/honest_mirror.test.js +109 -0
- package/dist/honest_mirror/honest_mirror.test.js.map +1 -0
- package/dist/honest_mirror/index.d.ts +11 -0
- package/dist/honest_mirror/index.d.ts.map +1 -0
- package/dist/honest_mirror/index.js +9 -0
- package/dist/honest_mirror/index.js.map +1 -0
- package/dist/honest_mirror/sources/git_commit_source.d.ts +30 -0
- package/dist/honest_mirror/sources/git_commit_source.d.ts.map +1 -0
- package/dist/honest_mirror/sources/git_commit_source.js +106 -0
- package/dist/honest_mirror/sources/git_commit_source.js.map +1 -0
- package/dist/honest_mirror/types.d.ts +126 -0
- package/dist/honest_mirror/types.d.ts.map +1 -0
- package/dist/honest_mirror/types.js +31 -0
- package/dist/honest_mirror/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -1
- package/dist/rewind/engine.d.ts +65 -0
- package/dist/rewind/engine.d.ts.map +1 -0
- package/dist/rewind/engine.js +473 -0
- package/dist/rewind/engine.js.map +1 -0
- package/dist/rewind/index.d.ts +13 -0
- package/dist/rewind/index.d.ts.map +1 -0
- package/dist/rewind/index.js +11 -0
- package/dist/rewind/index.js.map +1 -0
- package/dist/rewind/intent_class.d.ts +35 -0
- package/dist/rewind/intent_class.d.ts.map +1 -0
- package/dist/rewind/intent_class.js +141 -0
- package/dist/rewind/intent_class.js.map +1 -0
- package/dist/rewind/rewind.test.d.ts +2 -0
- package/dist/rewind/rewind.test.d.ts.map +1 -0
- package/dist/rewind/rewind.test.js +176 -0
- package/dist/rewind/rewind.test.js.map +1 -0
- package/dist/rewind/types.d.ts +140 -0
- package/dist/rewind/types.d.ts.map +1 -0
- package/dist/rewind/types.js +11 -0
- package/dist/rewind/types.js.map +1 -0
- package/dist/squadron/acgv_vaccine.d.ts.map +1 -1
- package/dist/squadron/acgv_vaccine.js +15 -0
- package/dist/squadron/acgv_vaccine.js.map +1 -1
- package/dist/truth_gate/claims.d.ts.map +1 -1
- package/dist/truth_gate/claims.js +37 -0
- package/dist/truth_gate/claims.js.map +1 -1
- package/dist/truth_gate/probes.d.ts.map +1 -1
- package/dist/truth_gate/probes.js +107 -1
- package/dist/truth_gate/probes.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.30.0 — HONEST MIRROR engine.
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates: pull artifacts → DP-scrub → blind-replay through N
|
|
5
|
+
* vendors → compare to accepted answers → emit per-vendor calibration
|
|
6
|
+
* delta + suggested Aletheia weight → HMAC-chain the report.
|
|
7
|
+
*
|
|
8
|
+
* Composes with CONCLAVE: the suggestedAletheiaWeight field is the
|
|
9
|
+
* feedback loop closure — a vendor with bad calibration on the user's
|
|
10
|
+
* own past work gets a lower CONCLAVE vote-weight in future runs.
|
|
11
|
+
* This is the truth-tunes-trust loop.
|
|
12
|
+
*/
|
|
13
|
+
import { createHash, createHmac } from "node:crypto";
|
|
14
|
+
import { existsSync, mkdirSync, writeFileSync, appendFileSync, readFileSync, readdirSync } from "node:fs";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import { sampleArtifacts as gitSample, gitSourceAvailable } from "./sources/git_commit_source.js";
|
|
17
|
+
import { scrub } from "./anonymizer.js";
|
|
18
|
+
import { computeDelta, suggestedWeight } from "./calibration.js";
|
|
19
|
+
const HMAC_KEY = process.env["MNEME_HONEST_MIRROR_KEY"] ?? "mneme-honest-mirror-v1";
|
|
20
|
+
const CHAIN_SEED = "0".repeat(64);
|
|
21
|
+
function canon(v) {
|
|
22
|
+
if (v === null || typeof v !== "object")
|
|
23
|
+
return JSON.stringify(v);
|
|
24
|
+
if (Array.isArray(v))
|
|
25
|
+
return "[" + v.map(canon).join(",") + "]";
|
|
26
|
+
const keys = Object.keys(v).sort();
|
|
27
|
+
return "{" + keys.map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
|
|
28
|
+
}
|
|
29
|
+
function sha(s) { return createHash("sha256").update(s).digest("hex"); }
|
|
30
|
+
function hmacOf(prev, payload) {
|
|
31
|
+
return createHmac("sha256", HMAC_KEY).update(prev + "|" + payload).digest("hex");
|
|
32
|
+
}
|
|
33
|
+
let lastChainLink = CHAIN_SEED;
|
|
34
|
+
export function __resetHonestMirrorChainForTest() { lastChainLink = CHAIN_SEED; }
|
|
35
|
+
/**
|
|
36
|
+
* Pull artifacts from the requested source. Falls back to git_commit
|
|
37
|
+
* when other sources are unavailable.
|
|
38
|
+
*/
|
|
39
|
+
export function pullArtifacts(repoRoot, source, count, seed) {
|
|
40
|
+
if (source === "git_commit") {
|
|
41
|
+
if (!gitSourceAvailable(repoRoot))
|
|
42
|
+
return [];
|
|
43
|
+
return gitSample(repoRoot, count, seed);
|
|
44
|
+
}
|
|
45
|
+
// v2.30.0 ships git_commit only; replay + lineage sources stub-fall
|
|
46
|
+
// back to git_commit when available so callers always get artifacts.
|
|
47
|
+
if (gitSourceAvailable(repoRoot))
|
|
48
|
+
return gitSample(repoRoot, count, seed);
|
|
49
|
+
return [];
|
|
50
|
+
}
|
|
51
|
+
export async function runCalibration(repoRoot, opts, replay, embed) {
|
|
52
|
+
const startedAt = new Date().toISOString();
|
|
53
|
+
const t0 = Date.now();
|
|
54
|
+
const source = opts.source ?? "git_commit";
|
|
55
|
+
const count = opts.count ?? 10;
|
|
56
|
+
const seed = opts.seed ?? Date.now();
|
|
57
|
+
const vendors = opts.vendors;
|
|
58
|
+
const pairs = pullArtifacts(repoRoot, source, count, seed);
|
|
59
|
+
// Scrub artifacts before sending to vendor
|
|
60
|
+
const scrubbedPairs = pairs.map((p) => {
|
|
61
|
+
const s = scrub(p.artifact.prompt);
|
|
62
|
+
return {
|
|
63
|
+
...p,
|
|
64
|
+
artifact: { ...p.artifact, prompt: s.text },
|
|
65
|
+
_redactionCount: s.redactionCount,
|
|
66
|
+
};
|
|
67
|
+
});
|
|
68
|
+
// Per-vendor calibration
|
|
69
|
+
const perVendor = await Promise.all(vendors.map(async (vendor) => {
|
|
70
|
+
const perArtifact = [];
|
|
71
|
+
for (const pair of scrubbedPairs) {
|
|
72
|
+
const r = await replay({
|
|
73
|
+
vendor,
|
|
74
|
+
prompt: pair.artifact.prompt,
|
|
75
|
+
artifactTimestamp: pair.artifact.at,
|
|
76
|
+
}).catch((e) => ({
|
|
77
|
+
vendor, answer: "", confidence: 0, dtMs: 0, error: e.message,
|
|
78
|
+
}));
|
|
79
|
+
if (r.error)
|
|
80
|
+
continue;
|
|
81
|
+
const delta = await computeDelta(pair.artifact.id, r, pair.accepted, { embed });
|
|
82
|
+
perArtifact.push(delta);
|
|
83
|
+
}
|
|
84
|
+
const meanReportedConfidence = perArtifact.length === 0 ? 0
|
|
85
|
+
: perArtifact.reduce((s, d) => s + d.reportedConfidence, 0) / perArtifact.length;
|
|
86
|
+
const meanMeasuredCorrectness = perArtifact.length === 0 ? 0
|
|
87
|
+
: perArtifact.reduce((s, d) => s + d.measuredCorrectness, 0) / perArtifact.length;
|
|
88
|
+
const meanCalibrationDelta = perArtifact.length === 0 ? 0
|
|
89
|
+
: perArtifact.reduce((s, d) => s + d.calibrationDelta, 0) / perArtifact.length;
|
|
90
|
+
let headline;
|
|
91
|
+
if (Math.abs(meanCalibrationDelta) < 0.1) {
|
|
92
|
+
headline = `🟢 ${vendor} — well-calibrated (mean Δ=${(meanCalibrationDelta * 100).toFixed(0)}%, correctness=${Math.round(meanMeasuredCorrectness * 100)}%)`;
|
|
93
|
+
}
|
|
94
|
+
else if (meanCalibrationDelta > 0) {
|
|
95
|
+
headline = `🟡 ${vendor} — over-confident by ${(meanCalibrationDelta * 100).toFixed(0)}% on user's own past work`;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
headline = `🟦 ${vendor} — under-confident by ${(Math.abs(meanCalibrationDelta) * 100).toFixed(0)}% on user's own past work`;
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
vendor,
|
|
102
|
+
meanReportedConfidence: round3(meanReportedConfidence),
|
|
103
|
+
meanMeasuredCorrectness: round3(meanMeasuredCorrectness),
|
|
104
|
+
meanCalibrationDelta: round3(meanCalibrationDelta),
|
|
105
|
+
headline,
|
|
106
|
+
perArtifact,
|
|
107
|
+
suggestedAletheiaWeight: suggestedWeight(perArtifact),
|
|
108
|
+
};
|
|
109
|
+
}));
|
|
110
|
+
const finishedAt = new Date().toISOString();
|
|
111
|
+
const totalMs = Date.now() - t0;
|
|
112
|
+
// Overall verdict.
|
|
113
|
+
let trafficLight;
|
|
114
|
+
const maxAbsDelta = perVendor.reduce((m, v) => Math.max(m, Math.abs(v.meanCalibrationDelta)), 0);
|
|
115
|
+
if (maxAbsDelta < 0.10)
|
|
116
|
+
trafficLight = "green";
|
|
117
|
+
else if (maxAbsDelta < 0.25)
|
|
118
|
+
trafficLight = "yellow";
|
|
119
|
+
else
|
|
120
|
+
trafficLight = "red";
|
|
121
|
+
const headline = trafficLight === "green"
|
|
122
|
+
? `🟢 HONEST MIRROR — all ${perVendor.length} vendors well-calibrated against ${pairs.length} natural artifacts`
|
|
123
|
+
: trafficLight === "yellow"
|
|
124
|
+
? `🟡 HONEST MIRROR — calibration drift up to ${(maxAbsDelta * 100).toFixed(0)}% across ${perVendor.length} vendors`
|
|
125
|
+
: `🔴 HONEST MIRROR — significant calibration miss: max ${(maxAbsDelta * 100).toFixed(0)}% drift`;
|
|
126
|
+
const body = {
|
|
127
|
+
spec: { name: "MNEME-HONEST-MIRROR", version: "1.0" },
|
|
128
|
+
startedAt, finishedAt, totalMs,
|
|
129
|
+
artifactCount: pairs.length,
|
|
130
|
+
source,
|
|
131
|
+
vendors,
|
|
132
|
+
perVendor,
|
|
133
|
+
headline,
|
|
134
|
+
trafficLight,
|
|
135
|
+
};
|
|
136
|
+
const bodyDigest = sha(canon(body));
|
|
137
|
+
lastChainLink = hmacOf(lastChainLink, bodyDigest);
|
|
138
|
+
return { ...body, hmac: lastChainLink, seq: parseInt(lastChainLink.slice(0, 8), 16), bodyDigest };
|
|
139
|
+
}
|
|
140
|
+
function round3(n) { return Number(n.toFixed(3)); }
|
|
141
|
+
// ── Persistence ──────────────────────────────────────────────────────
|
|
142
|
+
function dirOf(repoRoot) {
|
|
143
|
+
const d = join(repoRoot, ".mneme", "honest_mirror");
|
|
144
|
+
if (!existsSync(d))
|
|
145
|
+
mkdirSync(d, { recursive: true });
|
|
146
|
+
return d;
|
|
147
|
+
}
|
|
148
|
+
export function storeReport(repoRoot, r) {
|
|
149
|
+
const d = dirOf(repoRoot);
|
|
150
|
+
const stamp = r.finishedAt.replace(/[:.]/g, "-");
|
|
151
|
+
const path = join(d, `${String(r.seq).padStart(10, "0")}-${stamp}.json`);
|
|
152
|
+
writeFileSync(path, JSON.stringify(r, null, 2) + "\n");
|
|
153
|
+
const ledger = join(d, "reports.jsonl");
|
|
154
|
+
const skim = {
|
|
155
|
+
seq: r.seq,
|
|
156
|
+
finishedAt: r.finishedAt,
|
|
157
|
+
artifactCount: r.artifactCount,
|
|
158
|
+
source: r.source,
|
|
159
|
+
trafficLight: r.trafficLight,
|
|
160
|
+
headline: r.headline,
|
|
161
|
+
perVendor: r.perVendor.map((v) => ({ vendor: v.vendor, delta: v.meanCalibrationDelta, weight: v.suggestedAletheiaWeight })),
|
|
162
|
+
hmac: r.hmac, bodyDigest: r.bodyDigest, file: path,
|
|
163
|
+
};
|
|
164
|
+
appendFileSync(ledger, JSON.stringify(skim) + "\n");
|
|
165
|
+
// Side-effect: persist suggested Aletheia weights into a feedback file
|
|
166
|
+
// that the CONCLAVE Aletheia reader picks up next run. Closes the
|
|
167
|
+
// truth-tunes-trust loop.
|
|
168
|
+
try {
|
|
169
|
+
const feedbackPath = join(repoRoot, ".mneme", "aletheia", "honest_mirror_weights.json");
|
|
170
|
+
const feedbackDir = join(repoRoot, ".mneme", "aletheia");
|
|
171
|
+
if (!existsSync(feedbackDir))
|
|
172
|
+
mkdirSync(feedbackDir, { recursive: true });
|
|
173
|
+
const merged = {};
|
|
174
|
+
if (existsSync(feedbackPath)) {
|
|
175
|
+
try {
|
|
176
|
+
Object.assign(merged, JSON.parse(readFileSync(feedbackPath, "utf8")));
|
|
177
|
+
}
|
|
178
|
+
catch { /* corrupt → start fresh */ }
|
|
179
|
+
}
|
|
180
|
+
for (const pv of r.perVendor) {
|
|
181
|
+
merged[pv.vendor] = { trust: pv.suggestedAletheiaWeight, source: "honest_mirror", at: r.finishedAt };
|
|
182
|
+
}
|
|
183
|
+
writeFileSync(feedbackPath, JSON.stringify(merged, null, 2));
|
|
184
|
+
}
|
|
185
|
+
catch { /* best-effort */ }
|
|
186
|
+
return { path, ledger };
|
|
187
|
+
}
|
|
188
|
+
export function readLatestReport(repoRoot) {
|
|
189
|
+
const d = dirOf(repoRoot);
|
|
190
|
+
if (!existsSync(d))
|
|
191
|
+
return null;
|
|
192
|
+
const files = readdirSync(d).filter((n) => n.endsWith(".json")).sort();
|
|
193
|
+
if (files.length === 0)
|
|
194
|
+
return null;
|
|
195
|
+
try {
|
|
196
|
+
return JSON.parse(readFileSync(join(d, files[files.length - 1]), "utf8"));
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
export function listReports(repoRoot, limit = 30) {
|
|
203
|
+
const p = join(dirOf(repoRoot), "reports.jsonl");
|
|
204
|
+
if (!existsSync(p))
|
|
205
|
+
return [];
|
|
206
|
+
const lines = readFileSync(p, "utf8").split("\n").filter(Boolean);
|
|
207
|
+
const out = [];
|
|
208
|
+
for (const l of lines.slice(-limit)) {
|
|
209
|
+
try {
|
|
210
|
+
out.push(JSON.parse(l));
|
|
211
|
+
}
|
|
212
|
+
catch { /* skip */ }
|
|
213
|
+
}
|
|
214
|
+
return out;
|
|
215
|
+
}
|
|
216
|
+
export function verifyReport(card, prev = CHAIN_SEED) {
|
|
217
|
+
const { hmac, seq: _s, bodyDigest, ...body } = card;
|
|
218
|
+
void _s;
|
|
219
|
+
const recomputed = sha(canon(body));
|
|
220
|
+
if (recomputed !== bodyDigest)
|
|
221
|
+
return { ok: false, reason: "bodyDigest mismatch" };
|
|
222
|
+
const expected = hmacOf(prev, recomputed);
|
|
223
|
+
if (expected !== hmac)
|
|
224
|
+
return { ok: false, reason: "hmac mismatch" };
|
|
225
|
+
return { ok: true };
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/honest_mirror/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"honest_mirror.test.d.ts","sourceRoot":"","sources":["../../src/honest_mirror/honest_mirror.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// v2.30.0 — HONEST MIRROR discrete root tests (BUG IMMUNITY).
|
|
2
|
+
import { describe, it, expect, beforeEach } from "vitest";
|
|
3
|
+
import { mkdtempSync } from "node:fs";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { scrub, computeDelta, suggestedWeight, runCalibration, verifyReport, __resetHonestMirrorChainForTest, } from "./index.js";
|
|
7
|
+
describe("DP scrubber (anonymizer)", () => {
|
|
8
|
+
it("redacts AWS access keys", () => {
|
|
9
|
+
const r = scrub("my key is AKIAIOSFODNN7EXAMPLE");
|
|
10
|
+
expect(r.text).not.toContain("AKIAIOSFODNN7EXAMPLE");
|
|
11
|
+
expect(r.text).toMatch(/<AWS_KEY:[a-f0-9]+>/);
|
|
12
|
+
expect(r.redactedKinds["aws_key"]).toBe(1);
|
|
13
|
+
});
|
|
14
|
+
it("redacts emails", () => {
|
|
15
|
+
const r = scrub("contact me at user@example.com");
|
|
16
|
+
expect(r.text).not.toContain("user@example.com");
|
|
17
|
+
expect(r.text).toMatch(/<EMAIL:[a-f0-9]+>/);
|
|
18
|
+
});
|
|
19
|
+
it("redacts GitHub tokens", () => {
|
|
20
|
+
const r = scrub("token ghp_abcdefghijklmnopqrstuvwxyz123456");
|
|
21
|
+
expect(r.text).not.toContain("ghp_abcdefghijklmnopqrstuvwxyz123456");
|
|
22
|
+
expect(r.text).toMatch(/<GH_TOKEN:[a-f0-9]+>/);
|
|
23
|
+
});
|
|
24
|
+
it("redacts JWTs", () => {
|
|
25
|
+
const jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4ifQ.4XB6L-OFh3xHkXgPv5sWmIqWPNCxrcXh4PCm4yV2A2g";
|
|
26
|
+
const r = scrub(`token: ${jwt}`);
|
|
27
|
+
expect(r.text).not.toContain(jwt);
|
|
28
|
+
});
|
|
29
|
+
it("redacts PEM private key blocks", () => {
|
|
30
|
+
const pem = "-----BEGIN PRIVATE KEY-----\nABCDEF\n-----END PRIVATE KEY-----";
|
|
31
|
+
const r = scrub(pem);
|
|
32
|
+
expect(r.text).not.toContain("BEGIN PRIVATE KEY");
|
|
33
|
+
});
|
|
34
|
+
it("preserves SHA git-hash short form + tags long form", () => {
|
|
35
|
+
const sha = "0123456789abcdef0123456789abcdef01234567";
|
|
36
|
+
const r = scrub(`see commit ${sha} for details`);
|
|
37
|
+
expect(r.text).toContain("0123456"); // first 7 preserved
|
|
38
|
+
expect(r.text).toMatch(/<SHA:[a-f0-9]+>/);
|
|
39
|
+
});
|
|
40
|
+
it("identity transform when nothing to redact", () => {
|
|
41
|
+
const t = "totally clean text with no secrets";
|
|
42
|
+
const r = scrub(t);
|
|
43
|
+
expect(r.text).toBe(t);
|
|
44
|
+
expect(r.redactionCount).toBe(0);
|
|
45
|
+
});
|
|
46
|
+
it("scrub is deterministic — same input → same output", () => {
|
|
47
|
+
const a = scrub("contact user@example.com");
|
|
48
|
+
const b = scrub("contact user@example.com");
|
|
49
|
+
expect(a.text).toBe(b.text);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe("computeDelta + suggestedWeight", () => {
|
|
53
|
+
it("well-calibrated when confidence ≈ correctness", async () => {
|
|
54
|
+
const same = "fix typo in bridge_hardening test file";
|
|
55
|
+
const d = await computeDelta("art-1", { vendor: "v1", answer: same, confidence: 0.5, dtMs: 1 }, { text: same, kind: "commit_diff" });
|
|
56
|
+
expect(d.semanticSimilarity).toBeGreaterThan(0.5); // identical strings → jaccard = 1
|
|
57
|
+
expect(d.interpretation).toMatch(/well-calibrated|under-confident/);
|
|
58
|
+
});
|
|
59
|
+
it("flags over-confidence when reply unrelated", async () => {
|
|
60
|
+
const d = await computeDelta("art-2", { vendor: "v1", answer: "totally unrelated answer", confidence: 0.95, dtMs: 1 }, { text: "the actual fix is in foo.ts line 42", kind: "commit_diff" });
|
|
61
|
+
expect(d.calibrationDelta).toBeGreaterThan(0.5);
|
|
62
|
+
expect(d.interpretation).toMatch(/over-confident/);
|
|
63
|
+
});
|
|
64
|
+
it("suggestedWeight clamps to [0.1, 0.95]", () => {
|
|
65
|
+
expect(suggestedWeight([])).toBe(0.5);
|
|
66
|
+
const all_perfect = Array.from({ length: 5 }, () => ({
|
|
67
|
+
vendor: "v", artifactId: "a", semanticSimilarity: 1, reportedConfidence: 1,
|
|
68
|
+
measuredCorrectness: 1, calibrationDelta: 0, interpretation: "",
|
|
69
|
+
}));
|
|
70
|
+
expect(suggestedWeight(all_perfect)).toBeLessThanOrEqual(0.95);
|
|
71
|
+
const all_bad = Array.from({ length: 5 }, () => ({
|
|
72
|
+
vendor: "v", artifactId: "a", semanticSimilarity: 0, reportedConfidence: 0.99,
|
|
73
|
+
measuredCorrectness: 0, calibrationDelta: 0.99, interpretation: "",
|
|
74
|
+
}));
|
|
75
|
+
expect(suggestedWeight(all_bad)).toBeGreaterThanOrEqual(0.1);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
describe("runCalibration + HMAC chain", () => {
|
|
79
|
+
let dir;
|
|
80
|
+
beforeEach(() => {
|
|
81
|
+
dir = mkdtempSync(join(tmpdir(), "mneme-honest-mirror-"));
|
|
82
|
+
__resetHonestMirrorChainForTest();
|
|
83
|
+
});
|
|
84
|
+
it("returns report even when no git source available", async () => {
|
|
85
|
+
const replay = async ({ vendor }) => ({
|
|
86
|
+
vendor, answer: "mock answer", confidence: 0.5, dtMs: 1,
|
|
87
|
+
});
|
|
88
|
+
const r = await runCalibration(dir, { vendors: ["mock"], mockOnly: true, count: 3 }, replay);
|
|
89
|
+
expect(r.artifactCount).toBe(0); // no git in temp dir
|
|
90
|
+
expect(r.perVendor.length).toBe(1);
|
|
91
|
+
expect(r.perVendor[0].suggestedAletheiaWeight).toBe(0.5); // neutral
|
|
92
|
+
});
|
|
93
|
+
it("HMAC chain verifies on clean report", async () => {
|
|
94
|
+
const replay = async ({ vendor }) => ({
|
|
95
|
+
vendor, answer: "x", confidence: 0.5, dtMs: 1,
|
|
96
|
+
});
|
|
97
|
+
const r = await runCalibration(dir, { vendors: ["a"], mockOnly: true, count: 1 }, replay);
|
|
98
|
+
expect(verifyReport(r).ok).toBe(true);
|
|
99
|
+
});
|
|
100
|
+
it("HMAC chain rejects tampered report", async () => {
|
|
101
|
+
const replay = async ({ vendor }) => ({
|
|
102
|
+
vendor, answer: "x", confidence: 0.5, dtMs: 1,
|
|
103
|
+
});
|
|
104
|
+
const r = await runCalibration(dir, { vendors: ["a"], mockOnly: true, count: 1 }, replay);
|
|
105
|
+
r.totalMs = -999;
|
|
106
|
+
expect(verifyReport(r).ok).toBe(false);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
//# sourceMappingURL=honest_mirror.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"honest_mirror.test.js","sourceRoot":"","sources":["../../src/honest_mirror/honest_mirror.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.30.0 — HONEST MIRROR public surface.
|
|
3
|
+
*/
|
|
4
|
+
export * from "./types.js";
|
|
5
|
+
export { scrub } from "./anonymizer.js";
|
|
6
|
+
export type { ScrubResult } from "./anonymizer.js";
|
|
7
|
+
export { sampleArtifacts as sampleGitArtifacts, gitSourceAvailable } from "./sources/git_commit_source.js";
|
|
8
|
+
export { computeDelta, suggestedWeight } from "./calibration.js";
|
|
9
|
+
export { runCalibration, pullArtifacts, storeReport, readLatestReport, listReports, verifyReport, __resetHonestMirrorChainForTest, } from "./engine.js";
|
|
10
|
+
export type { BlindReplayFn, LedgerEntry } from "./engine.js";
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/honest_mirror/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,eAAe,IAAI,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAC3G,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EACL,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EACzE,YAAY,EAAE,+BAA+B,GAC9C,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.30.0 — HONEST MIRROR public surface.
|
|
3
|
+
*/
|
|
4
|
+
export * from "./types.js";
|
|
5
|
+
export { scrub } from "./anonymizer.js";
|
|
6
|
+
export { sampleArtifacts as sampleGitArtifacts, gitSourceAvailable } from "./sources/git_commit_source.js";
|
|
7
|
+
export { computeDelta, suggestedWeight } from "./calibration.js";
|
|
8
|
+
export { runCalibration, pullArtifacts, storeReport, readLatestReport, listReports, verifyReport, __resetHonestMirrorChainForTest, } from "./engine.js";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/honest_mirror/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAExC,OAAO,EAAE,eAAe,IAAI,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAC3G,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EACL,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EACzE,YAAY,EAAE,+BAA+B,GAC9C,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.30.0 — Git-commit artifact source for HONEST MIRROR.
|
|
3
|
+
*
|
|
4
|
+
* The primary source. Why git commits work so well:
|
|
5
|
+
* - commit message = the user's NATURAL prompt ("fix typo in
|
|
6
|
+
* bridge_hardening.test.ts", "refactor BFT to per-route caps")
|
|
7
|
+
* - the diff = the ACCEPTED ANSWER (whatever shipped is what worked)
|
|
8
|
+
* - 100% real workplace artifacts — no consent issue, no training-set
|
|
9
|
+
* contamination, no synthetic shape
|
|
10
|
+
* - timestamps + author + file context all preserved
|
|
11
|
+
* - universally available — every repo has commits
|
|
12
|
+
*
|
|
13
|
+
* Implementation: lightweight git log + show invocations. No external
|
|
14
|
+
* library; no dependency on Mneme's existing git helper (so this works
|
|
15
|
+
* even in degraded runtime mode).
|
|
16
|
+
*/
|
|
17
|
+
import type { RealArtifact, AcceptedAnswer } from "../types.js";
|
|
18
|
+
/**
|
|
19
|
+
* Sample N commits deterministically by seed. Returns artifacts +
|
|
20
|
+
* matched accepted answers.
|
|
21
|
+
*
|
|
22
|
+
* Skips commits whose subject starts with "chore(release)" /
|
|
23
|
+
* "Merge " / "Revert " — those aren't real engineering prompts.
|
|
24
|
+
*/
|
|
25
|
+
export declare function sampleArtifacts(cwd: string, count: number, seed: number): Array<{
|
|
26
|
+
artifact: RealArtifact;
|
|
27
|
+
accepted: AcceptedAnswer;
|
|
28
|
+
}>;
|
|
29
|
+
export declare function gitSourceAvailable(cwd: string): boolean;
|
|
30
|
+
//# sourceMappingURL=git_commit_source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git_commit_source.d.ts","sourceRoot":"","sources":["../../../src/honest_mirror/sources/git_commit_source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA6ChE;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,QAAQ,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAA;CAAE,CAAC,CAsCrI;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEvD"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.30.0 — Git-commit artifact source for HONEST MIRROR.
|
|
3
|
+
*
|
|
4
|
+
* The primary source. Why git commits work so well:
|
|
5
|
+
* - commit message = the user's NATURAL prompt ("fix typo in
|
|
6
|
+
* bridge_hardening.test.ts", "refactor BFT to per-route caps")
|
|
7
|
+
* - the diff = the ACCEPTED ANSWER (whatever shipped is what worked)
|
|
8
|
+
* - 100% real workplace artifacts — no consent issue, no training-set
|
|
9
|
+
* contamination, no synthetic shape
|
|
10
|
+
* - timestamps + author + file context all preserved
|
|
11
|
+
* - universally available — every repo has commits
|
|
12
|
+
*
|
|
13
|
+
* Implementation: lightweight git log + show invocations. No external
|
|
14
|
+
* library; no dependency on Mneme's existing git helper (so this works
|
|
15
|
+
* even in degraded runtime mode).
|
|
16
|
+
*/
|
|
17
|
+
import { spawnSync } from "node:child_process";
|
|
18
|
+
function git(cwd, args) {
|
|
19
|
+
const r = spawnSync("git", args, { cwd, encoding: "utf8", timeout: 15_000, maxBuffer: 4 * 1024 * 1024 });
|
|
20
|
+
if (r.status !== 0)
|
|
21
|
+
return "";
|
|
22
|
+
return r.stdout ?? "";
|
|
23
|
+
}
|
|
24
|
+
function listCommits(cwd, max) {
|
|
25
|
+
// Use unit separator (US, \x1f) between fields + record separator (RS, \x1e) between rows.
|
|
26
|
+
const FS = "\x1f";
|
|
27
|
+
const RS = "\x1e";
|
|
28
|
+
const fmt = `%H${FS}%aI${FS}%an${FS}%s${FS}%b${RS}`;
|
|
29
|
+
const raw = git(cwd, ["log", `-${Math.max(1, Math.min(1000, max))}`, `--pretty=format:${fmt}`]);
|
|
30
|
+
if (!raw)
|
|
31
|
+
return [];
|
|
32
|
+
const out = [];
|
|
33
|
+
for (const row of raw.split(RS)) {
|
|
34
|
+
const r = row.trim();
|
|
35
|
+
if (!r)
|
|
36
|
+
continue;
|
|
37
|
+
const parts = r.split(FS);
|
|
38
|
+
if (parts.length < 4)
|
|
39
|
+
continue;
|
|
40
|
+
out.push({
|
|
41
|
+
sha: parts[0],
|
|
42
|
+
at: parts[1],
|
|
43
|
+
author: parts[2],
|
|
44
|
+
subject: parts[3],
|
|
45
|
+
body: parts[4] ?? "",
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return out;
|
|
49
|
+
}
|
|
50
|
+
function getDiff(cwd, sha, maxBytes = 8000) {
|
|
51
|
+
const raw = git(cwd, ["show", "--no-color", "--stat", "--patch", sha]);
|
|
52
|
+
return raw.slice(0, maxBytes);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Sample N commits deterministically by seed. Returns artifacts +
|
|
56
|
+
* matched accepted answers.
|
|
57
|
+
*
|
|
58
|
+
* Skips commits whose subject starts with "chore(release)" /
|
|
59
|
+
* "Merge " / "Revert " — those aren't real engineering prompts.
|
|
60
|
+
*/
|
|
61
|
+
export function sampleArtifacts(cwd, count, seed) {
|
|
62
|
+
const pool = listCommits(cwd, count * 4 + 20)
|
|
63
|
+
.filter((c) => !/^(chore\(release\)|Merge |Revert )/i.test(c.subject))
|
|
64
|
+
.filter((c) => c.subject.length >= 20);
|
|
65
|
+
if (pool.length === 0)
|
|
66
|
+
return [];
|
|
67
|
+
// Deterministic sample by seed: rotate + step.
|
|
68
|
+
const step = Math.max(1, Math.floor(pool.length / count));
|
|
69
|
+
const start = seed % pool.length;
|
|
70
|
+
const picked = [];
|
|
71
|
+
const seen = new Set();
|
|
72
|
+
let i = start;
|
|
73
|
+
while (picked.length < Math.min(count, pool.length)) {
|
|
74
|
+
if (!seen.has(i)) {
|
|
75
|
+
picked.push(pool[i]);
|
|
76
|
+
seen.add(i);
|
|
77
|
+
}
|
|
78
|
+
i = (i + step) % pool.length;
|
|
79
|
+
if (seen.size === pool.length)
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
return picked.map((c) => {
|
|
83
|
+
const prompt = (c.body && c.body.length > 30)
|
|
84
|
+
? `${c.subject}\n\n${c.body}`.slice(0, 2000)
|
|
85
|
+
: c.subject;
|
|
86
|
+
const diff = getDiff(cwd, c.sha);
|
|
87
|
+
return {
|
|
88
|
+
artifact: {
|
|
89
|
+
id: c.sha.slice(0, 12),
|
|
90
|
+
source: "git_commit",
|
|
91
|
+
at: c.at,
|
|
92
|
+
prompt,
|
|
93
|
+
context: undefined,
|
|
94
|
+
originalVendor: undefined,
|
|
95
|
+
},
|
|
96
|
+
accepted: {
|
|
97
|
+
text: diff,
|
|
98
|
+
kind: "commit_diff",
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
export function gitSourceAvailable(cwd) {
|
|
104
|
+
return git(cwd, ["rev-parse", "--is-inside-work-tree"]).trim() === "true";
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=git_commit_source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git_commit_source.js","sourceRoot":"","sources":["../../../src/honest_mirror/sources/git_commit_source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAW/C,SAAS,GAAG,CAAC,GAAW,EAAE,IAAc;IACtC,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;IACzG,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9B,OAAO,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;AACxB,CAAC;AAED,SAAS,WAAW,CAAC,GAAW,EAAE,GAAW;IAC3C,2FAA2F;IAC3F,MAAM,EAAE,GAAG,MAAM,CAAC;IAClB,MAAM,EAAE,GAAG,MAAM,CAAC;IAClB,MAAM,GAAG,GAAG,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;IACpD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,mBAAmB,GAAG,EAAE,CAAC,CAAC,CAAC;IAChG,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,GAAG,GAAgB,EAAE,CAAC;IAC5B,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAC/B,GAAG,CAAC,IAAI,CAAC;YACP,GAAG,EAAE,KAAK,CAAC,CAAC,CAAE;YACd,EAAE,EAAE,KAAK,CAAC,CAAC,CAAE;YACb,MAAM,EAAE,KAAK,CAAC,CAAC,CAAE;YACjB,OAAO,EAAE,KAAK,CAAC,CAAC,CAAE;YAClB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;SACrB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,OAAO,CAAC,GAAW,EAAE,GAAW,EAAE,QAAQ,GAAG,IAAI;IACxD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;IACvE,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,KAAa,EAAE,IAAY;IACtE,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,GAAG,EAAE,CAAC;SAC1C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,qCAAqC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;SACrE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IACzC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjC,+CAA+C;IAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;IACjC,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,CAAC,GAAG,KAAK,CAAC;IACd,OAAO,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC;YAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QACzD,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QAC7B,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM;YAAE,MAAM;IACvC,CAAC;IAED,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACtB,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;YAC3C,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;YAC5C,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACd,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QACjC,OAAO;YACL,QAAQ,EAAE;gBACR,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;gBACtB,MAAM,EAAE,YAAqB;gBAC7B,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,MAAM;gBACN,OAAO,EAAE,SAAS;gBAClB,cAAc,EAAE,SAAS;aAC1B;YACD,QAAQ,EAAE;gBACR,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,aAAsB;aAC7B;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,OAAO,GAAG,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC;AAC5E,CAAC"}
|