@mneme-ai/core 2.19.9 → 2.19.11

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.
Files changed (43) hide show
  1. package/dist/cosmic/aurelian_v1910.test.d.ts +2 -0
  2. package/dist/cosmic/aurelian_v1910.test.d.ts.map +1 -0
  3. package/dist/cosmic/aurelian_v1910.test.js +46 -0
  4. package/dist/cosmic/aurelian_v1910.test.js.map +1 -0
  5. package/dist/cosmic/aurelian_v1911.test.d.ts +2 -0
  6. package/dist/cosmic/aurelian_v1911.test.d.ts.map +1 -0
  7. package/dist/cosmic/aurelian_v1911.test.js +34 -0
  8. package/dist/cosmic/aurelian_v1911.test.js.map +1 -0
  9. package/dist/index.d.ts +3 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +10 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/mortal_wrappers/index.d.ts +182 -0
  14. package/dist/mortal_wrappers/index.d.ts.map +1 -0
  15. package/dist/mortal_wrappers/index.js +360 -0
  16. package/dist/mortal_wrappers/index.js.map +1 -0
  17. package/dist/mortal_wrappers/mortal_wrappers.test.d.ts +2 -0
  18. package/dist/mortal_wrappers/mortal_wrappers.test.d.ts.map +1 -0
  19. package/dist/mortal_wrappers/mortal_wrappers.test.js +372 -0
  20. package/dist/mortal_wrappers/mortal_wrappers.test.js.map +1 -0
  21. package/dist/proof_carrying/index.d.ts +100 -0
  22. package/dist/proof_carrying/index.d.ts.map +1 -0
  23. package/dist/proof_carrying/index.js +184 -0
  24. package/dist/proof_carrying/index.js.map +1 -0
  25. package/dist/proof_carrying/proof_carrying.test.d.ts +2 -0
  26. package/dist/proof_carrying/proof_carrying.test.d.ts.map +1 -0
  27. package/dist/proof_carrying/proof_carrying.test.js +179 -0
  28. package/dist/proof_carrying/proof_carrying.test.js.map +1 -0
  29. package/dist/reverse_wrapper/index.d.ts +137 -0
  30. package/dist/reverse_wrapper/index.d.ts.map +1 -0
  31. package/dist/reverse_wrapper/index.js +245 -0
  32. package/dist/reverse_wrapper/index.js.map +1 -0
  33. package/dist/reverse_wrapper/reverse_wrapper.test.d.ts +2 -0
  34. package/dist/reverse_wrapper/reverse_wrapper.test.d.ts.map +1 -0
  35. package/dist/reverse_wrapper/reverse_wrapper.test.js +199 -0
  36. package/dist/reverse_wrapper/reverse_wrapper.test.js.map +1 -0
  37. package/dist/whats_new.d.ts.map +1 -1
  38. package/dist/whats_new.js +16 -0
  39. package/dist/whats_new.js.map +1 -1
  40. package/dist/wrapper_genesis/index.d.ts.map +1 -1
  41. package/dist/wrapper_genesis/index.js +14 -0
  42. package/dist/wrapper_genesis/index.js.map +1 -1
  43. package/package.json +1 -1
@@ -0,0 +1,184 @@
1
+ /**
2
+ * v2.19.10 — MNEME PROOF-CARRYING WRAPPER (zero-trust tool chain)
3
+ *
4
+ * "Every tool output carries a cryptographic certificate attesting:
5
+ * • which tool produced it
6
+ * • what input produced it (sha256 of canonical input)
7
+ * • when it was produced (ISO ts)
8
+ * • who the caller was (AI-agent fingerprint key)
9
+ * • what proof this output depends on (chain parent ID)
10
+ * A downstream tool with `requiresParentProof: true` REFUSES to run
11
+ * unless the supplied input.parentProof verifies. Prompt-injection
12
+ * that fakes a tool output → fails sig → rejected. Ad-hoc tool
13
+ * chains AI agents try to assemble → fail because chain is broken.
14
+ * Regulators get a cryptographic chain-of-custody for every call.
15
+ *
16
+ * First MCP primitive in the field with cryptographic identity
17
+ * BETWEEN tools."
18
+ *
19
+ * Honest scope:
20
+ * - HMAC-signed (single secret per Mneme instance); not yet asymmetric
21
+ * PKI. Future v2.20 may add Ed25519 keypairs per AI agent.
22
+ * - `parentProof` is single-parent; for fan-in chains use the latest
23
+ * parent + record siblings in the proof's metadata.
24
+ * - Loop detection: chain depth cap (default 32) + chainParent
25
+ * duplicate detection.
26
+ *
27
+ * Composes onto every existing MCP tool (opt-in). Pure additive layer.
28
+ */
29
+ import { createHmac, timingSafeEqual, createHash } from "node:crypto";
30
+ const PROTOCOL_VERSION = 1;
31
+ const MAX_CHAIN_DEPTH = 32;
32
+ function canon(v) {
33
+ if (v === null || typeof v !== "object")
34
+ return JSON.stringify(v);
35
+ if (Array.isArray(v))
36
+ return "[" + v.map(canon).join(",") + "]";
37
+ const keys = Object.keys(v).sort();
38
+ return "{" + keys.map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
39
+ }
40
+ function sha256(s) {
41
+ return createHash("sha256").update(s, "utf8").digest("hex");
42
+ }
43
+ function defaultSecret() {
44
+ return process.env["MNEME_PROOF_SECRET"] || `mneme-proof-carrying-v${PROTOCOL_VERSION}`;
45
+ }
46
+ function safeEqHex(a, b) {
47
+ try {
48
+ return timingSafeEqual(Buffer.from(a, "hex"), Buffer.from(b, "hex"));
49
+ }
50
+ catch {
51
+ return false;
52
+ }
53
+ }
54
+ function computeHmac(meta, secret) {
55
+ return createHmac("sha256", secret).update(canon(meta)).digest("hex");
56
+ }
57
+ export function attachProof(input) {
58
+ const ts = input.ts ?? new Date().toISOString();
59
+ const inputSha256 = sha256(canon(input.input));
60
+ const outputSha256 = sha256(canon(input.output));
61
+ const chainParent = input.parentProof ? input.parentProof.proofId : null;
62
+ const chainDepth = (input.parentProof?.chainDepth ?? 0) + 1;
63
+ if (chainDepth > MAX_CHAIN_DEPTH) {
64
+ throw new Error(`PROOF: chain depth ${chainDepth} exceeds MAX_CHAIN_DEPTH=${MAX_CHAIN_DEPTH} — possible loop`);
65
+ }
66
+ const proofId = "p-" + createHmac("sha256", "mneme-proof-id")
67
+ .update(`${input.toolName}|${inputSha256}|${outputSha256}|${ts}|${chainParent ?? "root"}`)
68
+ .digest("hex").slice(0, 14);
69
+ const meta = {
70
+ v: PROTOCOL_VERSION,
71
+ proofId,
72
+ toolName: input.toolName,
73
+ inputSha256,
74
+ outputSha256,
75
+ callerKey: input.callerKey,
76
+ chainParent,
77
+ chainDepth,
78
+ ts,
79
+ };
80
+ const hmac = computeHmac(meta, input.secret ?? defaultSecret());
81
+ return { data: input.output, proof: { ...meta, hmac } };
82
+ }
83
+ /** Verify ONE proof in isolation against the data it carries. */
84
+ export function verifyProof(proofed, secret) {
85
+ const p = proofed.proof;
86
+ if (!p)
87
+ return { ok: false, reason: "missing proof" };
88
+ // Recompute the hashes the proof claims
89
+ const expectedOutputSha = sha256(canon(proofed.data));
90
+ if (expectedOutputSha !== p.outputSha256) {
91
+ return { ok: false, reason: "outputSha256 mismatch — data was tampered after attachProof" };
92
+ }
93
+ // HMAC verify
94
+ const { hmac, ...body } = p;
95
+ const expected = computeHmac(body, secret ?? defaultSecret());
96
+ if (!safeEqHex(expected, hmac)) {
97
+ return { ok: false, reason: "HMAC mismatch — forged or wrong secret" };
98
+ }
99
+ return { ok: true };
100
+ }
101
+ /**
102
+ * Verify a chain of proofs. Caller passes the proofs in order
103
+ * (rootmost → most recent). Returns ok=true iff:
104
+ * - each proof verifies in isolation
105
+ * - each proof's chainParent equals the previous proof's proofId
106
+ * - no two proofs share the same proofId (loop detection)
107
+ * - chainDepth is strictly increasing
108
+ */
109
+ export function verifyChain(proofedList, secret) {
110
+ if (proofedList.length === 0)
111
+ return { ok: true, dagDepth: 0 };
112
+ const seenIds = new Set();
113
+ let prevId = null;
114
+ let prevDepth = 0;
115
+ for (let i = 0; i < proofedList.length; i++) {
116
+ const v = verifyProof(proofedList[i], secret);
117
+ if (!v.ok)
118
+ return { ok: false, brokenAt: i, reason: `step ${i}: ${v.reason}`, dagDepth: i };
119
+ const p = proofedList[i].proof;
120
+ if (seenIds.has(p.proofId))
121
+ return { ok: false, brokenAt: i, reason: `loop detected: proofId ${p.proofId} reused`, dagDepth: i };
122
+ seenIds.add(p.proofId);
123
+ if (i > 0) {
124
+ if (p.chainParent !== prevId) {
125
+ return { ok: false, brokenAt: i, reason: `chain break: step ${i}.chainParent (${p.chainParent ?? "null"}) != step ${i - 1}.proofId (${prevId})`, dagDepth: i };
126
+ }
127
+ if (p.chainDepth <= prevDepth) {
128
+ return { ok: false, brokenAt: i, reason: `chain depth not strictly increasing at step ${i}`, dagDepth: i };
129
+ }
130
+ }
131
+ else {
132
+ if (p.chainParent !== null) {
133
+ return { ok: false, brokenAt: 0, reason: "root proof must have chainParent=null", dagDepth: 0 };
134
+ }
135
+ }
136
+ prevId = p.proofId;
137
+ prevDepth = p.chainDepth;
138
+ }
139
+ return { ok: true, dagDepth: prevDepth };
140
+ }
141
+ /**
142
+ * Gate decorator: an MCP tool that requires its caller to supply a
143
+ * verifiable parentProof. Returns a wrapped handler that throws if the
144
+ * input is missing parentProof OR the proof doesn't verify.
145
+ *
146
+ * The wrapper then RUNS the inner handler and attaches a fresh proof
147
+ * with chainParent pointing at the supplied parentProof.
148
+ */
149
+ export function requireParentProof(opts) {
150
+ return async (args) => {
151
+ const parent = args.parentProof;
152
+ if (!parent)
153
+ throw new Error(`PROOF: '${opts.toolName}' requires parentProof; none supplied`);
154
+ // Verify the parent's HMAC (we don't have the parent's full data here,
155
+ // so trust the parent's claimed outputSha — but verify HMAC + structure)
156
+ const { hmac, ...body } = parent;
157
+ const expected = computeHmac(body, opts.secret ?? defaultSecret());
158
+ if (!safeEqHex(expected, hmac)) {
159
+ throw new Error(`PROOF: '${opts.toolName}' parentProof HMAC failed — forged or wrong secret`);
160
+ }
161
+ // Strip parentProof from args before passing to inner
162
+ const { parentProof: _stripped, ...innerArgs } = args;
163
+ const output = await opts.inner(innerArgs);
164
+ return attachProof({
165
+ toolName: opts.toolName,
166
+ input: innerArgs,
167
+ output,
168
+ callerKey: opts.callerKey,
169
+ parentProof: parent,
170
+ secret: opts.secret,
171
+ });
172
+ };
173
+ }
174
+ /** Build a fingerprint key for an AI agent: stable per (vendor + session-id + repo). */
175
+ export function fingerprintCaller(input) {
176
+ return "ck-" + createHmac("sha256", "mneme-caller-fingerprint")
177
+ .update(`${input.vendor}|${input.sessionId ?? "unknown"}|${input.repoPath ?? process.cwd()}`)
178
+ .digest("hex").slice(0, 16);
179
+ }
180
+ export function formatProofLine(p) {
181
+ const parent = p.chainParent ? ` ← ${p.chainParent.slice(0, 8)}` : " (root)";
182
+ return `🔐 PROOF · ${p.proofId.slice(0, 10)} · ${p.toolName} · depth=${p.chainDepth}${parent}`;
183
+ }
184
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/proof_carrying/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEtE,MAAM,gBAAgB,GAAG,CAAU,CAAC;AACpC,MAAM,eAAe,GAAG,EAAE,CAAC;AAoB3B,SAAS,KAAK,CAAC,CAAU;IACvB,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAClE,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IAChE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAA4B,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9D,OAAO,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAE,CAA6B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AACnH,CAAC;AAED,SAAS,MAAM,CAAC,CAAS;IACvB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,aAAa;IACpB,OAAO,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,yBAAyB,gBAAgB,EAAE,CAAC;AAC1F,CAAC;AAED,SAAS,SAAS,CAAC,CAAS,EAAE,CAAS;IACrC,IAAI,CAAC;QAAC,OAAO,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAAC,CAAC;IAC7E,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;AACzB,CAAC;AAED,SAAS,WAAW,CAAC,IAAiC,EAAE,MAAc;IACpE,OAAO,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACxE,CAAC;AAYD,MAAM,UAAU,WAAW,CAAI,KAA0B;IACvD,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAChD,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACzE,MAAM,UAAU,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC5D,IAAI,UAAU,GAAG,eAAe,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,sBAAsB,UAAU,4BAA4B,eAAe,kBAAkB,CAAC,CAAC;IACjH,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,GAAG,UAAU,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAC1D,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,WAAW,IAAI,YAAY,IAAI,EAAE,IAAI,WAAW,IAAI,MAAM,EAAE,CAAC;SACzF,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAgC;QACxC,CAAC,EAAE,gBAAgB;QACnB,OAAO;QACP,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,WAAW;QACX,YAAY;QACZ,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,WAAW;QACX,UAAU;QACV,EAAE;KACH,CAAC;IACF,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,IAAI,aAAa,EAAE,CAAC,CAAC;IAChE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;AAC1D,CAAC;AAOD,iEAAiE;AACjE,MAAM,UAAU,WAAW,CAAC,OAAsB,EAAE,MAAe;IACjE,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;IACxB,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IACtD,wCAAwC;IACxC,MAAM,iBAAiB,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD,IAAI,iBAAiB,KAAK,CAAC,CAAC,YAAY,EAAE,CAAC;QACzC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,6DAA6D,EAAE,CAAC;IAC9F,CAAC;IACD,cAAc;IACd,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,IAAI,aAAa,EAAE,CAAC,CAAC;IAC9D,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,wCAAwC,EAAE,CAAC;IACzE,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,WAA4B,EAAE,MAAe;IAMvE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IAC/D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC,CAAE,EAAE,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,CAAC,CAAC,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAC5F,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC;QAChC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,0BAA0B,CAAC,CAAC,OAAO,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QACjI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACV,IAAI,CAAC,CAAC,WAAW,KAAK,MAAM,EAAE,CAAC;gBAC7B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,qBAAqB,CAAC,iBAAiB,CAAC,CAAC,WAAW,IAAI,MAAM,aAAa,CAAC,GAAG,CAAC,aAAa,MAAM,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YACjK,CAAC;YACD,IAAI,CAAC,CAAC,UAAU,IAAI,SAAS,EAAE,CAAC;gBAC9B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,+CAA+C,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YAC7G,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;gBAC3B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,uCAAuC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YAClG,CAAC;QACH,CAAC;QACD,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC;QACnB,SAAS,GAAG,CAAC,CAAC,UAAU,CAAC;IAC3B,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAC3C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAsD,IAKvF;IACC,OAAO,KAAK,EAAE,IAAW,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;QAChC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,QAAQ,uCAAuC,CAAC,CAAC;QAC9F,uEAAuE;QACvE,yEAAyE;QACzE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;QACjC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,IAAI,aAAa,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,QAAQ,oDAAoD,CAAC,CAAC;QAChG,CAAC;QACD,sDAAsD;QACtD,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,CAAC;QACtD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAA6B,CAAC,CAAC;QAC/D,OAAO,WAAW,CAAC;YACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,SAAS;YAChB,MAAM;YACN,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,iBAAiB,CAAC,KAAgE;IAChG,OAAO,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE,0BAA0B,CAAC;SAC5D,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,SAAS,IAAI,KAAK,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;SAC5F,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,CAAgB;IAC9C,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,OAAO,cAAc,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,QAAQ,YAAY,CAAC,CAAC,UAAU,GAAG,MAAM,EAAE,CAAC;AACjG,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=proof_carrying.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proof_carrying.test.d.ts","sourceRoot":"","sources":["../../src/proof_carrying/proof_carrying.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,179 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { attachProof, verifyProof, verifyChain, requireParentProof, fingerprintCaller, formatProofLine, } from "./index.js";
3
+ describe("v2.19.10 · PROOF-CARRYING WRAPPER", () => {
4
+ // ── attachProof ──────────────────────────────────────────────────
5
+ describe("attachProof", () => {
6
+ it("emits ProofedOutput with HMAC + sha256 + chainDepth=1 for root", () => {
7
+ const r = attachProof({
8
+ toolName: "mneme.test.t1",
9
+ input: { x: 1 },
10
+ output: { y: 2 },
11
+ callerKey: "ck-abc",
12
+ });
13
+ expect(r.proof.proofId).toMatch(/^p-[0-9a-f]{14}$/);
14
+ expect(r.proof.hmac).toMatch(/^[0-9a-f]{64}$/);
15
+ expect(r.proof.inputSha256).toMatch(/^[0-9a-f]{64}$/);
16
+ expect(r.proof.outputSha256).toMatch(/^[0-9a-f]{64}$/);
17
+ expect(r.proof.chainParent).toBeNull();
18
+ expect(r.proof.chainDepth).toBe(1);
19
+ expect(verifyProof(r).ok).toBe(true);
20
+ });
21
+ it("chainDepth strictly increments per parent", () => {
22
+ const a = attachProof({ toolName: "T1", input: {}, output: { v: 1 }, callerKey: "ck" });
23
+ const b = attachProof({ toolName: "T2", input: { v: 1 }, output: { v: 2 }, callerKey: "ck", parentProof: a.proof });
24
+ const c = attachProof({ toolName: "T3", input: { v: 2 }, output: { v: 3 }, callerKey: "ck", parentProof: b.proof });
25
+ expect(a.proof.chainDepth).toBe(1);
26
+ expect(b.proof.chainDepth).toBe(2);
27
+ expect(c.proof.chainDepth).toBe(3);
28
+ });
29
+ it("rejects chains exceeding MAX_CHAIN_DEPTH=32 (loop guard)", () => {
30
+ let proof = attachProof({ toolName: "T", input: {}, output: {}, callerKey: "ck" }).proof;
31
+ for (let i = 0; i < 30; i++) {
32
+ proof = attachProof({ toolName: "T", input: {}, output: {}, callerKey: "ck", parentProof: proof }).proof;
33
+ }
34
+ // Depth is now 31; next attach takes us to 32; one more = 33 → throws
35
+ proof = attachProof({ toolName: "T", input: {}, output: {}, callerKey: "ck", parentProof: proof }).proof;
36
+ expect(() => attachProof({ toolName: "T", input: {}, output: {}, callerKey: "ck", parentProof: proof }))
37
+ .toThrow(/MAX_CHAIN_DEPTH/);
38
+ });
39
+ });
40
+ // ── verifyProof ──────────────────────────────────────────────────
41
+ describe("verifyProof", () => {
42
+ it("returns ok=true on a clean ProofedOutput", () => {
43
+ const r = attachProof({ toolName: "T", input: { x: 1 }, output: { y: 2 }, callerKey: "ck" });
44
+ expect(verifyProof(r).ok).toBe(true);
45
+ });
46
+ it("detects tampered output (sha mismatch)", () => {
47
+ const r = attachProof({ toolName: "T", input: { x: 1 }, output: { y: 2 }, callerKey: "ck" });
48
+ const tampered = { ...r, data: { y: 999 } };
49
+ const v = verifyProof(tampered);
50
+ expect(v.ok).toBe(false);
51
+ expect(v.reason).toContain("outputSha256 mismatch");
52
+ });
53
+ it("detects tampered proof metadata (HMAC mismatch)", () => {
54
+ const r = attachProof({ toolName: "T", input: {}, output: { z: 1 }, callerKey: "ck" });
55
+ const tampered = { ...r, proof: { ...r.proof, toolName: "EVIL.tool" } };
56
+ const v = verifyProof(tampered);
57
+ expect(v.ok).toBe(false);
58
+ expect(v.reason).toContain("HMAC mismatch");
59
+ });
60
+ });
61
+ // ── verifyChain ──────────────────────────────────────────────────
62
+ describe("verifyChain", () => {
63
+ it("returns ok=true on a properly-formed chain", () => {
64
+ const a = attachProof({ toolName: "T1", input: {}, output: { v: 1 }, callerKey: "ck" });
65
+ const b = attachProof({ toolName: "T2", input: { v: 1 }, output: { v: 2 }, callerKey: "ck", parentProof: a.proof });
66
+ const c = attachProof({ toolName: "T3", input: { v: 2 }, output: { v: 3 }, callerKey: "ck", parentProof: b.proof });
67
+ const r = verifyChain([a, b, c]);
68
+ expect(r.ok).toBe(true);
69
+ expect(r.dagDepth).toBe(3);
70
+ });
71
+ it("detects chain break (parent mismatch)", () => {
72
+ const a = attachProof({ toolName: "T1", input: {}, output: { v: 1 }, callerKey: "ck" });
73
+ const b = attachProof({ toolName: "T2", input: { v: 1 }, output: { v: 2 }, callerKey: "ck", parentProof: a.proof });
74
+ const stranger = attachProof({ toolName: "Tx", input: {}, output: { v: 99 }, callerKey: "ck" }); // root with no parent matching b
75
+ // Force a chain that pretends c follows b but c's chainParent is the stranger's id
76
+ const c = attachProof({ toolName: "T3", input: { v: 99 }, output: { v: 100 }, callerKey: "ck", parentProof: stranger.proof });
77
+ const r = verifyChain([a, b, c]);
78
+ expect(r.ok).toBe(false);
79
+ expect(r.reason).toContain("chain break");
80
+ });
81
+ it("detects loop (proofId reuse)", () => {
82
+ const a = attachProof({ toolName: "T1", input: {}, output: {}, callerKey: "ck" });
83
+ const b = attachProof({ toolName: "T2", input: {}, output: {}, callerKey: "ck", parentProof: a.proof });
84
+ const r = verifyChain([a, b, a]); // a reused
85
+ expect(r.ok).toBe(false);
86
+ expect(r.reason).toContain("loop detected");
87
+ });
88
+ it("root must have chainParent=null", () => {
89
+ const a = attachProof({ toolName: "T1", input: {}, output: {}, callerKey: "ck" });
90
+ const b = attachProof({ toolName: "T2", input: {}, output: {}, callerKey: "ck", parentProof: a.proof });
91
+ // Verify chain with b alone (as a fake root) — should fail because chainParent != null
92
+ const r = verifyChain([b]);
93
+ expect(r.ok).toBe(false);
94
+ expect(r.reason).toContain("root proof must have chainParent=null");
95
+ });
96
+ it("handles empty chain", () => {
97
+ expect(verifyChain([]).ok).toBe(true);
98
+ });
99
+ });
100
+ // ── requireParentProof gate ─────────────────────────────────────
101
+ describe("requireParentProof gate", () => {
102
+ it("rejects calls without parentProof", async () => {
103
+ const gated = requireParentProof({
104
+ toolName: "T.gated",
105
+ callerKey: "ck",
106
+ inner: async () => ({ ok: true }),
107
+ });
108
+ await expect(gated({})).rejects.toThrow(/requires parentProof/);
109
+ });
110
+ it("rejects forged parentProof", async () => {
111
+ const gated = requireParentProof({
112
+ toolName: "T.gated",
113
+ callerKey: "ck",
114
+ inner: async () => ({ ok: true }),
115
+ });
116
+ const fake = {
117
+ v: 1, proofId: "p-fake", toolName: "x", inputSha256: "0".repeat(64),
118
+ outputSha256: "0".repeat(64), callerKey: "ck", chainParent: null, chainDepth: 1,
119
+ ts: "2026-01-01T00:00:00Z", hmac: "0".repeat(64),
120
+ };
121
+ await expect(gated({ parentProof: fake })).rejects.toThrow(/HMAC failed/);
122
+ });
123
+ it("accepts valid parentProof + chains the new proof", async () => {
124
+ const parent = attachProof({ toolName: "T.first", input: {}, output: { v: 1 }, callerKey: "ck" });
125
+ const gated = requireParentProof({
126
+ toolName: "T.second",
127
+ callerKey: "ck",
128
+ inner: async (args) => {
129
+ // parentProof should have been stripped
130
+ expect(args.parentProof).toBeUndefined();
131
+ return { v: 2 };
132
+ },
133
+ });
134
+ const r = await gated({ parentProof: parent.proof });
135
+ expect(r.proof.chainParent).toBe(parent.proof.proofId);
136
+ expect(r.proof.chainDepth).toBe(2);
137
+ expect(verifyProof(r).ok).toBe(true);
138
+ });
139
+ });
140
+ // ── prompt-injection scenario ───────────────────────────────────
141
+ describe("prompt-injection rejection", () => {
142
+ it("forged tool output (fake proof attached) fails verifyProof", () => {
143
+ // Attacker tries to fake a TRUSTED proof and pass it to downstream tool
144
+ const fake = {
145
+ data: { evil: true },
146
+ proof: {
147
+ v: 1,
148
+ proofId: "p-malicious",
149
+ toolName: "mneme.confessional.audit",
150
+ inputSha256: "0".repeat(64),
151
+ outputSha256: "0".repeat(64),
152
+ callerKey: "ck-victim",
153
+ chainParent: null,
154
+ chainDepth: 1,
155
+ ts: new Date().toISOString(),
156
+ hmac: "0".repeat(64),
157
+ },
158
+ };
159
+ expect(verifyProof(fake).ok).toBe(false);
160
+ });
161
+ });
162
+ // ── helpers ─────────────────────────────────────────────────────
163
+ describe("helpers", () => {
164
+ it("fingerprintCaller produces deterministic short key", () => {
165
+ const a = fingerprintCaller({ vendor: "claude", sessionId: "s1", repoPath: "/tmp/x" });
166
+ const b = fingerprintCaller({ vendor: "claude", sessionId: "s1", repoPath: "/tmp/x" });
167
+ const c = fingerprintCaller({ vendor: "claude", sessionId: "s2", repoPath: "/tmp/x" });
168
+ expect(a).toBe(b);
169
+ expect(a).not.toBe(c);
170
+ expect(a).toMatch(/^ck-[0-9a-f]{16}$/);
171
+ });
172
+ it("formatProofLine summarises", () => {
173
+ const p = attachProof({ toolName: "T", input: {}, output: {}, callerKey: "ck" });
174
+ expect(formatProofLine(p.proof)).toContain("PROOF");
175
+ expect(formatProofLine(p.proof)).toContain("(root)");
176
+ });
177
+ });
178
+ });
179
+ //# sourceMappingURL=proof_carrying.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proof_carrying.test.js","sourceRoot":"","sources":["../../src/proof_carrying/proof_carrying.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * v2.19.10 — MNEME REVERSE-WRAPPER (tool suggests next tool)
3
+ *
4
+ * "MCP spec is pull-only — clients ask, servers answer. Mneme bends
5
+ * the contract (without breaking it): every wrapper response can
6
+ * attach an OPTIONAL `__suggested_next_call` field with the tool
7
+ * name + reasoning + confidence + cost estimate. The AI agent's
8
+ * planner sees the suggestion; if it's smart, it follows. If it
9
+ * isn't, nothing breaks. Pure additive layer over MCP.
10
+ *
11
+ * Bonus: telemetry. We log every suggestion + whether the AI
12
+ * followed within N calls. Follow-through rate measures BOTH:
13
+ * • the quality of the suggestion (high follow → good tool design)
14
+ * • the calibration of the AI (high follow → AI listens to hints)
15
+ * Loop detection: refuses to suggest a tool that was in the last K
16
+ * invocations of the current session."
17
+ *
18
+ * Honest scope:
19
+ * - The suggestion is ADVISORY. The AI agent's planner makes the
20
+ * final decision. We never auto-invoke anything.
21
+ * - Loop detection is per-session (caller supplies session id) and
22
+ * uses a sliding window (default last 8 invocations).
23
+ * - Suggestion rules can be hand-written OR mined from test corpus
24
+ * by AUTO-GENESIS (we expose the rule shape; the mining is left
25
+ * to the caller / future v2.20).
26
+ *
27
+ * Composes onto every MCP tool + v2.19.9 GENESPLICING (chimera's
28
+ * sequential mode follows the suggestion chain) + v2.19.10
29
+ * PROOF-CARRYING (the suggestion can carry a proof of where it came
30
+ * from). Pure additive layer.
31
+ */
32
+ declare const PROTOCOL_VERSION: 1;
33
+ export interface SuggestedNext {
34
+ v: typeof PROTOCOL_VERSION;
35
+ suggestedNextId: string;
36
+ /** Recommended next tool name (e.g., "mneme.chronostasis.witness"). */
37
+ tool: string;
38
+ /** Human-readable rationale. */
39
+ why: string;
40
+ /** Confidence 0..1 the suggestion is right. */
41
+ confidence: number;
42
+ /** Optional USD cost estimate for the suggested call. */
43
+ costEstimateUsd?: number;
44
+ /** Optional pre-filled args (planner can adjust). */
45
+ suggestedArgs?: Record<string, unknown>;
46
+ /** Why this WASN'T suggested? (set when suppressed by loop detection). */
47
+ suppressedReason?: string;
48
+ ts: string;
49
+ sig: string;
50
+ }
51
+ /** Wrapper output with optional suggested-next attached. */
52
+ export interface OutputWithSuggestion<T = unknown> {
53
+ data: T;
54
+ __suggested_next?: SuggestedNext;
55
+ }
56
+ export interface SuggestionRule {
57
+ /** Name of the tool whose output triggers this rule. */
58
+ forTool: string;
59
+ /** Optional predicate over the output; if false, rule doesn't fire. */
60
+ predicate?: (output: unknown) => boolean;
61
+ /** Suggested next tool. */
62
+ suggestTool: string;
63
+ /** Why this suggestion. */
64
+ why: string;
65
+ /** Baseline confidence (0..1). */
66
+ confidence: number;
67
+ /** Optional cost estimate USD. */
68
+ costEstimateUsd?: number;
69
+ /** Optional args builder. */
70
+ buildArgs?: (output: unknown) => Record<string, unknown>;
71
+ }
72
+ export interface FollowThroughEvent {
73
+ /** Session this telemetry belongs to. */
74
+ sessionId: string;
75
+ /** The suggestion that was emitted. */
76
+ suggestion: SuggestedNext;
77
+ /** Was the next call to the suggested tool within window N? */
78
+ followed: boolean;
79
+ /** Number of invocations between suggestion + follow (or window expiry). */
80
+ invocationsBetween: number;
81
+ recordedAt: string;
82
+ }
83
+ export declare class ReverseWrapperSession {
84
+ private callHistory;
85
+ private pendingSuggestions;
86
+ private followEvents;
87
+ private secret;
88
+ readonly sessionId: string;
89
+ readonly loopWindow: number;
90
+ constructor(opts: {
91
+ sessionId: string;
92
+ loopWindow?: number;
93
+ secret?: string;
94
+ });
95
+ /** Record that a tool was just called. Updates loop-detection state + checks pending suggestions. */
96
+ recordCall(toolName: string, nowMs?: number): void;
97
+ /**
98
+ * Apply suggestion rules to a (currentTool, output) pair. Returns a
99
+ * SuggestedNext if any rule fires AND it doesn't trigger loop detection.
100
+ */
101
+ suggestNext(input: {
102
+ currentTool: string;
103
+ output: unknown;
104
+ rules: SuggestionRule[];
105
+ nowMs?: number;
106
+ }): SuggestedNext | null;
107
+ /** Attach a suggestion to a wrapper output (mutation-free). */
108
+ attachSuggestion<T>(input: {
109
+ output: T;
110
+ currentTool: string;
111
+ rules: SuggestionRule[];
112
+ nowMs?: number;
113
+ }): OutputWithSuggestion<T>;
114
+ followThroughStats(): {
115
+ totalSuggestions: number;
116
+ followed: number;
117
+ expired: number;
118
+ followRate: number;
119
+ pendingNow: number;
120
+ perToolBreakdown: Array<{
121
+ tool: string;
122
+ suggested: number;
123
+ followed: number;
124
+ rate: number;
125
+ }>;
126
+ };
127
+ recentHistory(n?: number): Array<{
128
+ tool: string;
129
+ ts: number;
130
+ }>;
131
+ }
132
+ export declare function verifySuggestion(s: SuggestedNext, secret?: string): boolean;
133
+ export declare function formatSuggestionLine(s: SuggestedNext): string;
134
+ /** Built-in suggestion rules shipped with v2.19.10. Extensible. */
135
+ export declare const BUILTIN_RULES: SuggestionRule[];
136
+ export {};
137
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reverse_wrapper/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAIH,QAAA,MAAM,gBAAgB,EAAG,CAAU,CAAC;AAGpC,MAAM,WAAW,aAAa;IAC5B,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qDAAqD;IACrD,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;CACb;AAED,4DAA4D;AAC5D,MAAM,WAAW,oBAAoB,CAAC,CAAC,GAAG,OAAO;IAC/C,IAAI,EAAE,CAAC,CAAC;IACR,gBAAgB,CAAC,EAAE,aAAa,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;IACzC,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,kBAAkB;IACjC,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,UAAU,EAAE,aAAa,CAAC;IAC1B,+DAA+D;IAC/D,QAAQ,EAAE,OAAO,CAAC;IAClB,4EAA4E;IAC5E,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB;AAuBD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,WAAW,CAA2C;IAC9D,OAAO,CAAC,kBAAkB,CAAkE;IAC5F,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,MAAM,CAAS;IACvB,SAAgB,SAAS,EAAE,MAAM,CAAC;IAClC,SAAgB,UAAU,EAAE,MAAM,CAAC;gBAEvB,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAM7E,qGAAqG;IACrG,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAoClD;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,OAAO,CAAC;QAChB,KAAK,EAAE,cAAc,EAAE,CAAC;QACxB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,aAAa,GAAG,IAAI;IA0CxB,+DAA+D;IAC/D,gBAAgB,CAAC,CAAC,EAAE,KAAK,EAAE;QACzB,MAAM,EAAE,CAAC,CAAC;QACV,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,cAAc,EAAE,CAAC;QACxB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,oBAAoB,CAAC,CAAC,CAAC;IAW3B,kBAAkB,IAAI;QACpB,gBAAgB,EAAE,MAAM,CAAC;QACzB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,gBAAgB,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC9F;IAwBD,aAAa,CAAC,CAAC,GAAE,MAAU,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CAGlE;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAG3E;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAG7D;AAED,mEAAmE;AACnE,eAAO,MAAM,aAAa,EAAE,cAAc,EA+CzC,CAAC"}