@mneme-ai/core 2.29.1 → 2.30.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 +10 -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/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 +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/truth_gate/claims.d.ts.map +1 -1
- package/dist/truth_gate/claims.js +9 -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 +34 -0
- package/dist/truth_gate/probes.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.30.0 — Calibration scorer for HONEST MIRROR.
|
|
3
|
+
*
|
|
4
|
+
* Given the vendor's answer + the accepted answer (commit diff /
|
|
5
|
+
* landed code), compute:
|
|
6
|
+
* - semanticSimilarity (0..1) — embedder cosine OR fallback to
|
|
7
|
+
* token-Jaccard when no embedder is available
|
|
8
|
+
* - measuredCorrectness — same as semanticSimilarity (rename for
|
|
9
|
+
* clarity in the report)
|
|
10
|
+
* - calibrationDelta = reportedConfidence - measuredCorrectness
|
|
11
|
+
*
|
|
12
|
+
* Plus a plain-English interpretation:
|
|
13
|
+
* "well-calibrated" |delta| < 0.10
|
|
14
|
+
* "over-confident" delta > 0.10
|
|
15
|
+
* "under-confident" delta < -0.10
|
|
16
|
+
*/
|
|
17
|
+
import type { CalibrationDelta, VendorReplayResult, AcceptedAnswer } from "./types.js";
|
|
18
|
+
/**
|
|
19
|
+
* Compute calibration delta for ONE vendor's reply vs the accepted
|
|
20
|
+
* answer. Uses an embedder when available; falls back to token-Jaccard
|
|
21
|
+
* so the calibrator works even without a fancy model.
|
|
22
|
+
*/
|
|
23
|
+
export declare function computeDelta(artifactId: string, vendorReply: VendorReplayResult, accepted: AcceptedAnswer, opts?: {
|
|
24
|
+
embed?: (texts: string[]) => Promise<Float32Array[]>;
|
|
25
|
+
}): Promise<CalibrationDelta>;
|
|
26
|
+
/**
|
|
27
|
+
* From a list of CalibrationDelta for ONE vendor, derive an aggregate
|
|
28
|
+
* weight in [0, 1] suitable for feeding back into CONCLAVE Aletheia
|
|
29
|
+
* scoring. The rule:
|
|
30
|
+
* - start at 0.5 neutral
|
|
31
|
+
* - reward measured correctness: +0.5 × mean(correctness)
|
|
32
|
+
* - punish over-confidence: -0.3 × max(0, mean(delta))
|
|
33
|
+
* - clamp to [0.1, 0.95] (never drop a vendor below 0.1; never
|
|
34
|
+
* trust above 0.95 because the floor of calibration is statistical)
|
|
35
|
+
*/
|
|
36
|
+
export declare function suggestedWeight(deltas: CalibrationDelta[]): number;
|
|
37
|
+
//# sourceMappingURL=calibration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calibration.d.ts","sourceRoot":"","sources":["../../src/honest_mirror/calibration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAiBvF;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,kBAAkB,EAC/B,QAAQ,EAAE,cAAc,EACxB,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;CAAO,GAClE,OAAO,CAAC,gBAAgB,CAAC,CAiC3B;AAcD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAMlE"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.30.0 — Calibration scorer for HONEST MIRROR.
|
|
3
|
+
*
|
|
4
|
+
* Given the vendor's answer + the accepted answer (commit diff /
|
|
5
|
+
* landed code), compute:
|
|
6
|
+
* - semanticSimilarity (0..1) — embedder cosine OR fallback to
|
|
7
|
+
* token-Jaccard when no embedder is available
|
|
8
|
+
* - measuredCorrectness — same as semanticSimilarity (rename for
|
|
9
|
+
* clarity in the report)
|
|
10
|
+
* - calibrationDelta = reportedConfidence - measuredCorrectness
|
|
11
|
+
*
|
|
12
|
+
* Plus a plain-English interpretation:
|
|
13
|
+
* "well-calibrated" |delta| < 0.10
|
|
14
|
+
* "over-confident" delta > 0.10
|
|
15
|
+
* "under-confident" delta < -0.10
|
|
16
|
+
*/
|
|
17
|
+
/** Tokenize for fallback Jaccard. Lower-cased, alpha-num + dash + dot. */
|
|
18
|
+
function tokenize(s) {
|
|
19
|
+
return new Set(s.toLowerCase().split(/[^a-z0-9.\-_]+/g).filter((t) => t.length >= 3));
|
|
20
|
+
}
|
|
21
|
+
function jaccard(a, b) {
|
|
22
|
+
if (a.size === 0 && b.size === 0)
|
|
23
|
+
return 0;
|
|
24
|
+
let inter = 0;
|
|
25
|
+
for (const t of a)
|
|
26
|
+
if (b.has(t))
|
|
27
|
+
inter++;
|
|
28
|
+
const union = a.size + b.size - inter;
|
|
29
|
+
return union === 0 ? 0 : inter / union;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Compute calibration delta for ONE vendor's reply vs the accepted
|
|
33
|
+
* answer. Uses an embedder when available; falls back to token-Jaccard
|
|
34
|
+
* so the calibrator works even without a fancy model.
|
|
35
|
+
*/
|
|
36
|
+
export async function computeDelta(artifactId, vendorReply, accepted, opts = {}) {
|
|
37
|
+
let semanticSimilarity = 0;
|
|
38
|
+
if (opts.embed) {
|
|
39
|
+
try {
|
|
40
|
+
const vecs = await opts.embed([vendorReply.answer, accepted.text]);
|
|
41
|
+
const a = vecs[0];
|
|
42
|
+
const b = vecs[1];
|
|
43
|
+
semanticSimilarity = cosine(a, b);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
semanticSimilarity = jaccard(tokenize(vendorReply.answer), tokenize(accepted.text));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
semanticSimilarity = jaccard(tokenize(vendorReply.answer), tokenize(accepted.text));
|
|
51
|
+
}
|
|
52
|
+
const measuredCorrectness = semanticSimilarity;
|
|
53
|
+
const calibrationDelta = vendorReply.confidence - measuredCorrectness;
|
|
54
|
+
let interpretation;
|
|
55
|
+
if (Math.abs(calibrationDelta) < 0.10) {
|
|
56
|
+
interpretation = `well-calibrated (Δ=${(calibrationDelta * 100).toFixed(0)}%)`;
|
|
57
|
+
}
|
|
58
|
+
else if (calibrationDelta > 0) {
|
|
59
|
+
interpretation = `over-confident — said ${Math.round(vendorReply.confidence * 100)}% sure but answer matched only ${Math.round(measuredCorrectness * 100)}%`;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
interpretation = `under-confident — said ${Math.round(vendorReply.confidence * 100)}% sure but answer matched ${Math.round(measuredCorrectness * 100)}%`;
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
vendor: vendorReply.vendor,
|
|
66
|
+
artifactId,
|
|
67
|
+
semanticSimilarity,
|
|
68
|
+
reportedConfidence: vendorReply.confidence,
|
|
69
|
+
measuredCorrectness,
|
|
70
|
+
calibrationDelta,
|
|
71
|
+
interpretation,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function cosine(a, b) {
|
|
75
|
+
if (a.length !== b.length)
|
|
76
|
+
return 0;
|
|
77
|
+
let dot = 0, na = 0, nb = 0;
|
|
78
|
+
for (let i = 0; i < a.length; i++) {
|
|
79
|
+
const x = a[i];
|
|
80
|
+
const y = b[i];
|
|
81
|
+
dot += x * y;
|
|
82
|
+
na += x * x;
|
|
83
|
+
nb += y * y;
|
|
84
|
+
}
|
|
85
|
+
const denom = Math.sqrt(na) * Math.sqrt(nb);
|
|
86
|
+
return denom === 0 ? 0 : Math.max(-1, Math.min(1, dot / denom));
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* From a list of CalibrationDelta for ONE vendor, derive an aggregate
|
|
90
|
+
* weight in [0, 1] suitable for feeding back into CONCLAVE Aletheia
|
|
91
|
+
* scoring. The rule:
|
|
92
|
+
* - start at 0.5 neutral
|
|
93
|
+
* - reward measured correctness: +0.5 × mean(correctness)
|
|
94
|
+
* - punish over-confidence: -0.3 × max(0, mean(delta))
|
|
95
|
+
* - clamp to [0.1, 0.95] (never drop a vendor below 0.1; never
|
|
96
|
+
* trust above 0.95 because the floor of calibration is statistical)
|
|
97
|
+
*/
|
|
98
|
+
export function suggestedWeight(deltas) {
|
|
99
|
+
if (deltas.length === 0)
|
|
100
|
+
return 0.5;
|
|
101
|
+
const meanCorrect = deltas.reduce((s, d) => s + d.measuredCorrectness, 0) / deltas.length;
|
|
102
|
+
const meanDelta = deltas.reduce((s, d) => s + d.calibrationDelta, 0) / deltas.length;
|
|
103
|
+
const raw = 0.5 + 0.5 * meanCorrect - 0.3 * Math.max(0, meanDelta);
|
|
104
|
+
return Math.max(0.1, Math.min(0.95, Number(raw.toFixed(3))));
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=calibration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calibration.js","sourceRoot":"","sources":["../../src/honest_mirror/calibration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
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 type { MirrorReport, CalibrateOptions, ArtifactSource, VendorReplayResult, RealArtifact, AcceptedAnswer } from "./types.js";
|
|
14
|
+
export declare function __resetHonestMirrorChainForTest(): void;
|
|
15
|
+
/**
|
|
16
|
+
* Pull artifacts from the requested source. Falls back to git_commit
|
|
17
|
+
* when other sources are unavailable.
|
|
18
|
+
*/
|
|
19
|
+
export declare function pullArtifacts(repoRoot: string, source: ArtifactSource, count: number, seed: number): Array<{
|
|
20
|
+
artifact: RealArtifact;
|
|
21
|
+
accepted: AcceptedAnswer;
|
|
22
|
+
}>;
|
|
23
|
+
/**
|
|
24
|
+
* Blind-replay function. The caller supplies a vendor-call function
|
|
25
|
+
* (returns {answer, confidence}) — we don't bake in CONCLAVE here so
|
|
26
|
+
* the engine stays standalone + testable.
|
|
27
|
+
*
|
|
28
|
+
* The eval-anti-detection rule: we pass the artifact AS IS (post-scrub)
|
|
29
|
+
* with no "STANCE:" header, no "BENCHMARK:", no "TEST:". The vendor
|
|
30
|
+
* sees a normal conversational prompt with the original timestamp.
|
|
31
|
+
*/
|
|
32
|
+
export type BlindReplayFn = (input: {
|
|
33
|
+
vendor: string;
|
|
34
|
+
prompt: string;
|
|
35
|
+
artifactTimestamp: string;
|
|
36
|
+
}) => Promise<VendorReplayResult>;
|
|
37
|
+
export declare function runCalibration(repoRoot: string, opts: CalibrateOptions, replay: BlindReplayFn, embed?: (texts: string[]) => Promise<Float32Array[]>): Promise<MirrorReport>;
|
|
38
|
+
export declare function storeReport(repoRoot: string, r: MirrorReport): {
|
|
39
|
+
path: string;
|
|
40
|
+
ledger: string;
|
|
41
|
+
};
|
|
42
|
+
export declare function readLatestReport(repoRoot: string): MirrorReport | null;
|
|
43
|
+
export interface LedgerEntry {
|
|
44
|
+
seq: number;
|
|
45
|
+
finishedAt: string;
|
|
46
|
+
artifactCount: number;
|
|
47
|
+
source: string;
|
|
48
|
+
trafficLight: string;
|
|
49
|
+
headline: string;
|
|
50
|
+
perVendor: Array<{
|
|
51
|
+
vendor: string;
|
|
52
|
+
delta: number;
|
|
53
|
+
weight: number;
|
|
54
|
+
}>;
|
|
55
|
+
hmac: string;
|
|
56
|
+
bodyDigest: string;
|
|
57
|
+
file: string;
|
|
58
|
+
}
|
|
59
|
+
export declare function listReports(repoRoot: string, limit?: number): LedgerEntry[];
|
|
60
|
+
export declare function verifyReport(card: MirrorReport, prev?: string): {
|
|
61
|
+
ok: true;
|
|
62
|
+
} | {
|
|
63
|
+
ok: false;
|
|
64
|
+
reason: string;
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/honest_mirror/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,KAAK,EACV,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,kBAAkB,EAAE,YAAY,EAAE,cAAc,EACjG,MAAM,YAAY,CAAC;AAoBpB,wBAAgB,+BAA+B,IAAI,IAAI,CAAgC;AAEvF;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACX,KAAK,CAAC;IAAE,QAAQ,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAA;CAAE,CAAC,CAS7D;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;CAC3B,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAElC,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,aAAa,EACrB,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC,GACnD,OAAO,CAAC,YAAY,CAAC,CAsFvB;AAYD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAoC/F;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAOtE;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IACvE,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IACvC,SAAS,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CAChD;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,WAAW,EAAE,CAOvE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,GAAE,MAAmB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAQxH"}
|
|
@@ -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"}
|