@mneme-ai/core 1.62.0 → 1.64.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.
Files changed (69) hide show
  1. package/dist/cognitive/cognitive.test.d.ts +10 -0
  2. package/dist/cognitive/cognitive.test.d.ts.map +1 -0
  3. package/dist/cognitive/cognitive.test.js +485 -0
  4. package/dist/cognitive/cognitive.test.js.map +1 -0
  5. package/dist/cognitive/consolidation.d.ts +73 -0
  6. package/dist/cognitive/consolidation.d.ts.map +1 -0
  7. package/dist/cognitive/consolidation.js +170 -0
  8. package/dist/cognitive/consolidation.js.map +1 -0
  9. package/dist/cognitive/counterfactual.d.ts +73 -0
  10. package/dist/cognitive/counterfactual.d.ts.map +1 -0
  11. package/dist/cognitive/counterfactual.js +184 -0
  12. package/dist/cognitive/counterfactual.js.map +1 -0
  13. package/dist/cognitive/curiosity.d.ts +37 -0
  14. package/dist/cognitive/curiosity.d.ts.map +1 -0
  15. package/dist/cognitive/curiosity.js +191 -0
  16. package/dist/cognitive/curiosity.js.map +1 -0
  17. package/dist/cognitive/debate.d.ts +48 -0
  18. package/dist/cognitive/debate.d.ts.map +1 -0
  19. package/dist/cognitive/debate.js +223 -0
  20. package/dist/cognitive/debate.js.map +1 -0
  21. package/dist/cognitive/decision_atom.d.ts +119 -0
  22. package/dist/cognitive/decision_atom.d.ts.map +1 -0
  23. package/dist/cognitive/decision_atom.js +187 -0
  24. package/dist/cognitive/decision_atom.js.map +1 -0
  25. package/dist/cognitive/index.d.ts +31 -0
  26. package/dist/cognitive/index.d.ts.map +1 -0
  27. package/dist/cognitive/index.js +24 -0
  28. package/dist/cognitive/index.js.map +1 -0
  29. package/dist/cognitive/theory_of_mind.d.ts +56 -0
  30. package/dist/cognitive/theory_of_mind.d.ts.map +1 -0
  31. package/dist/cognitive/theory_of_mind.js +212 -0
  32. package/dist/cognitive/theory_of_mind.js.map +1 -0
  33. package/dist/cognitive/tree_of_thought.d.ts +55 -0
  34. package/dist/cognitive/tree_of_thought.d.ts.map +1 -0
  35. package/dist/cognitive/tree_of_thought.js +134 -0
  36. package/dist/cognitive/tree_of_thought.js.map +1 -0
  37. package/dist/index.d.ts +5 -0
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +21 -0
  40. package/dist/index.js.map +1 -1
  41. package/dist/innerlife/ai_teacher.d.ts +83 -0
  42. package/dist/innerlife/ai_teacher.d.ts.map +1 -0
  43. package/dist/innerlife/ai_teacher.js +152 -0
  44. package/dist/innerlife/ai_teacher.js.map +1 -0
  45. package/dist/innerlife/innerlife.d.ts +104 -0
  46. package/dist/innerlife/innerlife.d.ts.map +1 -0
  47. package/dist/innerlife/innerlife.js +228 -0
  48. package/dist/innerlife/innerlife.js.map +1 -0
  49. package/dist/innerlife/innerlife.test.d.ts +5 -0
  50. package/dist/innerlife/innerlife.test.d.ts.map +1 -0
  51. package/dist/innerlife/innerlife.test.js +219 -0
  52. package/dist/innerlife/innerlife.test.js.map +1 -0
  53. package/dist/metamorphosis/metamorphosis.d.ts +116 -0
  54. package/dist/metamorphosis/metamorphosis.d.ts.map +1 -0
  55. package/dist/metamorphosis/metamorphosis.js +278 -0
  56. package/dist/metamorphosis/metamorphosis.js.map +1 -0
  57. package/dist/metamorphosis/metamorphosis.test.d.ts +5 -0
  58. package/dist/metamorphosis/metamorphosis.test.d.ts.map +1 -0
  59. package/dist/metamorphosis/metamorphosis.test.js +176 -0
  60. package/dist/metamorphosis/metamorphosis.test.js.map +1 -0
  61. package/dist/tribunal/tribunal.d.ts +111 -0
  62. package/dist/tribunal/tribunal.d.ts.map +1 -0
  63. package/dist/tribunal/tribunal.js +294 -0
  64. package/dist/tribunal/tribunal.js.map +1 -0
  65. package/dist/tribunal/tribunal.test.d.ts +5 -0
  66. package/dist/tribunal/tribunal.test.d.ts.map +1 -0
  67. package/dist/tribunal/tribunal.test.js +184 -0
  68. package/dist/tribunal/tribunal.test.js.map +1 -0
  69. package/package.json +1 -1
@@ -0,0 +1,116 @@
1
+ /**
2
+ * v1.63.0 -- PATH A: METAMORPHOSIS.
3
+ *
4
+ * Mneme grows from "tool I call" into "companion that knows me".
5
+ * 5 self-knowledge / companion layers in one cohesive module.
6
+ *
7
+ * 1. TRANSPARENCY MIRROR -- daily report of YOUR own usage patterns
8
+ * 2. INTERVIEW PROTOCOL -- Socratic dialogue extracts tacit wisdom
9
+ * 3. AUDIENCE LAYER -- profile readers + auto-tune AI tone
10
+ * 4. ALIEN PROTOCOL -- genetic recombination over wisdom cards
11
+ * for first-time prompts
12
+ * 5. CARBON BUDGET -- CO2 footprint of AI token spend
13
+ *
14
+ * Storage: .mneme/metamorphosis/
15
+ * No external deps; pure node:fs + crypto.
16
+ */
17
+ export interface MirrorReport {
18
+ generatedAt: string;
19
+ windowDays: number;
20
+ /** Tokens saved across all reactor layers in the window. */
21
+ tokensSaved: number;
22
+ /** Total AI calls observed. */
23
+ totalCalls: number;
24
+ /** Top 3 saving methods. */
25
+ topMethods: Array<{
26
+ method: string;
27
+ calls: number;
28
+ saved: number;
29
+ }>;
30
+ /** Themes the user spent the most time on. */
31
+ topThemes: string[];
32
+ /** Biggest waste: the method with lowest savings ratio. */
33
+ biggestWaste: {
34
+ method: string;
35
+ ratio: number;
36
+ } | null;
37
+ /** Plain-English summary (3-5 lines) ready to surface in pulse. */
38
+ plain: string;
39
+ }
40
+ /** Build a self-knowledge report from the reactor ledger + soul mirror. */
41
+ export declare function buildMirrorReport(repoRoot: string, windowDays?: number): MirrorReport;
42
+ /** Persist the report. */
43
+ export declare function persistMirrorReport(repoRoot: string, report: MirrorReport): string;
44
+ export interface InterviewQuestion {
45
+ id: string;
46
+ question: string;
47
+ /** Topic so future sessions don't repeat the same question. */
48
+ topic: "decisions" | "regrets" | "patterns" | "values" | "constraints";
49
+ }
50
+ export interface InterviewAnswer {
51
+ questionId: string;
52
+ question: string;
53
+ answer: string;
54
+ answeredAt: string;
55
+ topic: string;
56
+ /** Word count -- triage which answers carry the most wisdom. */
57
+ wordCount: number;
58
+ }
59
+ /** Pick the N questions the user hasn't answered in the current week. */
60
+ export declare function pickQuestions(repoRoot: string, n?: number): InterviewQuestion[];
61
+ /** Record an answer. Also distills it into a wisdom card if long enough. */
62
+ export declare function recordAnswer(repoRoot: string, q: InterviewQuestion, answer: string): InterviewAnswer;
63
+ export declare function readAnswers(repoRoot: string): InterviewAnswer[];
64
+ export type AudienceRole = "engineer" | "pm" | "customer" | "executive" | "engineering-manager" | "security" | "unknown";
65
+ export interface AudienceProfile {
66
+ role: AudienceRole;
67
+ /** Preferred verbosity: terse / normal / verbose. */
68
+ verbosity: "terse" | "normal" | "verbose";
69
+ /** Prefers code snippets vs prose? */
70
+ codeFirst: boolean;
71
+ /** Last observation. */
72
+ observedAt: string;
73
+ }
74
+ export interface ToneTuning {
75
+ role: AudienceRole;
76
+ toneInstructions: string[];
77
+ estimatedTokenAdjustment: number;
78
+ }
79
+ /** Classify the audience role from a message sample. */
80
+ export declare function inferAudience(messageSample: string): AudienceProfile;
81
+ /** Produce tone tuning hints for the AI. */
82
+ export declare function tuneFor(profile: AudienceProfile): ToneTuning;
83
+ export interface WisdomCard {
84
+ id: string;
85
+ pattern: string;
86
+ template: string;
87
+ }
88
+ export interface AlienTemplate {
89
+ matchedCards: WisdomCard[];
90
+ template: string;
91
+ estimatedTokens: number;
92
+ }
93
+ /** Genetic recombination -- pick wisdom cards whose patterns match the
94
+ * intent, concat their templates with $TARGET substitution. The
95
+ * resulting template is a SKELETON; the AI fills in the specifics. */
96
+ export declare function buildAlienTemplate(intent: string): AlienTemplate;
97
+ export interface CarbonReport {
98
+ tokensSpent: number;
99
+ tokensSaved: number;
100
+ co2GramsSpent: number;
101
+ co2GramsSaved: number;
102
+ /** Human-readable equivalent (km driven, smartphone-charges, trees-needed). */
103
+ equivalents: {
104
+ kmDriven: number;
105
+ smartphoneCharges: number;
106
+ treeSeconds: number;
107
+ };
108
+ generatedAt: string;
109
+ }
110
+ export declare function buildCarbonReport(repoRoot: string): CarbonReport;
111
+ export declare function metamorphosisStatus(repoRoot: string): {
112
+ hasMirrorReport: boolean;
113
+ interviewAnswered: number;
114
+ carbonGramsSaved: number;
115
+ };
116
+ //# sourceMappingURL=metamorphosis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metamorphosis.d.ts","sourceRoot":"","sources":["../../src/metamorphosis/metamorphosis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,278 @@
1
+ /**
2
+ * v1.63.0 -- PATH A: METAMORPHOSIS.
3
+ *
4
+ * Mneme grows from "tool I call" into "companion that knows me".
5
+ * 5 self-knowledge / companion layers in one cohesive module.
6
+ *
7
+ * 1. TRANSPARENCY MIRROR -- daily report of YOUR own usage patterns
8
+ * 2. INTERVIEW PROTOCOL -- Socratic dialogue extracts tacit wisdom
9
+ * 3. AUDIENCE LAYER -- profile readers + auto-tune AI tone
10
+ * 4. ALIEN PROTOCOL -- genetic recombination over wisdom cards
11
+ * for first-time prompts
12
+ * 5. CARBON BUDGET -- CO2 footprint of AI token spend
13
+ *
14
+ * Storage: .mneme/metamorphosis/
15
+ * No external deps; pure node:fs + crypto.
16
+ */
17
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, appendFileSync } from "node:fs";
18
+ import { join } from "node:path";
19
+ import { totalSavings } from "../reactor/measure.js";
20
+ const META_DIR = ".mneme/metamorphosis";
21
+ function ensureDir(repoRoot, sub) {
22
+ const d = sub ? join(repoRoot, META_DIR, sub) : join(repoRoot, META_DIR);
23
+ if (!existsSync(d))
24
+ mkdirSync(d, { recursive: true });
25
+ return d;
26
+ }
27
+ /** Build a self-knowledge report from the reactor ledger + soul mirror. */
28
+ export function buildMirrorReport(repoRoot, windowDays = 7) {
29
+ const summary = totalSavings(repoRoot);
30
+ const topMethods = Object.entries(summary.byMethod)
31
+ .sort((a, b) => b[1].saved - a[1].saved)
32
+ .slice(0, 3)
33
+ .map(([method, b]) => ({ method, calls: b.calls, saved: b.saved }));
34
+ // Themes: pheromone hot zones (read from .mneme/ai-pheromones.jsonl if present).
35
+ const themes = [];
36
+ const pheromonePath = join(repoRoot, ".mneme/ai-pheromones.jsonl");
37
+ if (existsSync(pheromonePath)) {
38
+ try {
39
+ const lines = readFileSync(pheromonePath, "utf8").split("\n").filter(Boolean).slice(-50);
40
+ const counts = new Map();
41
+ for (const line of lines) {
42
+ try {
43
+ const row = JSON.parse(line);
44
+ if (row.zone)
45
+ counts.set(row.zone, (counts.get(row.zone) ?? 0) + (row.strength ?? 1));
46
+ }
47
+ catch { /* */ }
48
+ }
49
+ const sorted = [...counts.entries()].sort((a, b) => b[1] - a[1]).slice(0, 5);
50
+ for (const [zone] of sorted)
51
+ themes.push(zone);
52
+ }
53
+ catch { /* */ }
54
+ }
55
+ const biggestWaste = Object.entries(summary.byMethod)
56
+ .filter(([, b]) => b.calls >= 3)
57
+ .sort((a, b) => a[1].ratio - b[1].ratio)[0];
58
+ const plain = [
59
+ `Window: last ${windowDays} day(s)`,
60
+ `Mneme saved you ${summary.totalSaved} tokens across ${summary.totalCalls} call(s).`,
61
+ `Top method: ${topMethods[0]?.method ?? "n/a"} (${topMethods[0]?.saved ?? 0} tok saved).`,
62
+ `Top themes: ${themes.length > 0 ? themes.slice(0, 3).join(", ") : "(no pheromone signal yet)"}.`,
63
+ biggestWaste ? `Lowest-leverage method: ${biggestWaste[0]} (only ${(biggestWaste[1].ratio * 100).toFixed(1)}% savings).` : `(no waste signal in window)`,
64
+ ].join("\n");
65
+ return {
66
+ generatedAt: new Date().toISOString(),
67
+ windowDays,
68
+ tokensSaved: summary.totalSaved,
69
+ totalCalls: summary.totalCalls,
70
+ topMethods,
71
+ topThemes: themes,
72
+ biggestWaste: biggestWaste ? { method: biggestWaste[0], ratio: biggestWaste[1].ratio } : null,
73
+ plain,
74
+ };
75
+ }
76
+ /** Persist the report. */
77
+ export function persistMirrorReport(repoRoot, report) {
78
+ const dir = ensureDir(repoRoot, "mirror");
79
+ const path = join(dir, `report-${report.generatedAt.replace(/[:.]/g, "-")}.json`);
80
+ writeFileSync(path, JSON.stringify(report, null, 2), "utf8");
81
+ writeFileSync(join(dir, "latest.json"), JSON.stringify(report, null, 2), "utf8");
82
+ return path;
83
+ }
84
+ const INTERVIEW_BANK = [
85
+ { id: "q-001", topic: "decisions", question: "What's the most consequential decision you made on this repo this week, and what swayed it?" },
86
+ { id: "q-002", topic: "regrets", question: "What's one thing you wish past-you had told you about this codebase?" },
87
+ { id: "q-003", topic: "patterns", question: "When you write code in this repo, what's the single most-common pattern you reach for?" },
88
+ { id: "q-004", topic: "values", question: "If a new contributor asked 'what do we care about most in this code', what would you say?" },
89
+ { id: "q-005", topic: "constraints", question: "What constraint (deadline / customer / team / tech) shapes your decisions here right now?" },
90
+ { id: "q-006", topic: "decisions", question: "When did you LAST disagree with your AI's suggestion, and why?" },
91
+ { id: "q-007", topic: "regrets", question: "What's a bug or refactor you keep meaning to do but haven't?" },
92
+ { id: "q-008", topic: "patterns", question: "What signal tells you a PR is ready vs not ready in THIS repo?" },
93
+ ];
94
+ /** Pick the N questions the user hasn't answered in the current week. */
95
+ export function pickQuestions(repoRoot, n = 3) {
96
+ const answered = readAnswers(repoRoot);
97
+ const cutoff = Date.now() - 7 * 86400 * 1000;
98
+ const recentlyAnswered = new Set(answered.filter((a) => Date.parse(a.answeredAt) > cutoff).map((a) => a.questionId));
99
+ const available = INTERVIEW_BANK.filter((q) => !recentlyAnswered.has(q.id));
100
+ // Rotate by topic diversity.
101
+ const picked = [];
102
+ const topicsUsed = new Set();
103
+ for (const q of available) {
104
+ if (picked.length >= n)
105
+ break;
106
+ if (topicsUsed.has(q.topic) && available.length > n)
107
+ continue;
108
+ picked.push(q);
109
+ topicsUsed.add(q.topic);
110
+ }
111
+ return picked;
112
+ }
113
+ /** Record an answer. Also distills it into a wisdom card if long enough. */
114
+ export function recordAnswer(repoRoot, q, answer) {
115
+ ensureDir(repoRoot, "interview");
116
+ const entry = {
117
+ questionId: q.id,
118
+ question: q.question,
119
+ answer,
120
+ answeredAt: new Date().toISOString(),
121
+ topic: q.topic,
122
+ wordCount: answer.split(/\s+/).filter(Boolean).length,
123
+ };
124
+ appendFileSync(join(repoRoot, META_DIR, "interview", "answers.jsonl"), JSON.stringify(entry) + "\n", "utf8");
125
+ return entry;
126
+ }
127
+ export function readAnswers(repoRoot) {
128
+ const path = join(repoRoot, META_DIR, "interview", "answers.jsonl");
129
+ if (!existsSync(path))
130
+ return [];
131
+ try {
132
+ return readFileSync(path, "utf8").split("\n").filter(Boolean).map((l) => {
133
+ try {
134
+ return JSON.parse(l);
135
+ }
136
+ catch {
137
+ return null;
138
+ }
139
+ }).filter((x) => x !== null);
140
+ }
141
+ catch {
142
+ return [];
143
+ }
144
+ }
145
+ /** Classify the audience role from a message sample. */
146
+ export function inferAudience(messageSample) {
147
+ const lower = messageSample.toLowerCase();
148
+ let role = "unknown";
149
+ if (/\bvariance|p&l|customer churn|retention|conversion|cac\b/.test(lower))
150
+ role = "executive";
151
+ else if (/\bsprint|roadmap|backlog|user story|jira|product\b/.test(lower))
152
+ role = "pm";
153
+ else if (/\bcve|vuln|csp|xss|csrf|hipaa|soc2|pci\b/.test(lower))
154
+ role = "security";
155
+ else if (/\bhire|onboard|1:1|team\s+(health|capacity)|burnout\b/.test(lower))
156
+ role = "engineering-manager";
157
+ else if (/\brefund|account|password|forgot|help|stuck\b/.test(lower))
158
+ role = "customer";
159
+ else if (/\bfunction|class|interface|refactor|test|debug|sha|commit\b/.test(lower))
160
+ role = "engineer";
161
+ const wordCount = messageSample.split(/\s+/).filter(Boolean).length;
162
+ const verbosity = wordCount < 8 ? "terse" : wordCount > 40 ? "verbose" : "normal";
163
+ const codeFirst = role === "engineer" || /```|\bcode\b|\bfn\b/.test(lower);
164
+ return {
165
+ role, verbosity, codeFirst,
166
+ observedAt: new Date().toISOString(),
167
+ };
168
+ }
169
+ /** Produce tone tuning hints for the AI. */
170
+ export function tuneFor(profile) {
171
+ const instructions = [];
172
+ let estimatedAdjustment = 0;
173
+ switch (profile.role) {
174
+ case "executive":
175
+ instructions.push("Lead with the business impact in one sentence. Numbers first.");
176
+ instructions.push("No code unless explicitly requested.");
177
+ estimatedAdjustment = -400;
178
+ break;
179
+ case "pm":
180
+ instructions.push("Frame in terms of user stories + acceptance criteria.");
181
+ instructions.push("Avoid implementation details unless asked.");
182
+ estimatedAdjustment = -200;
183
+ break;
184
+ case "security":
185
+ instructions.push("Mention CVE / CWE if applicable. Cite OWASP class.");
186
+ instructions.push("Risk band first; then mitigation.");
187
+ estimatedAdjustment = 100;
188
+ break;
189
+ case "customer":
190
+ instructions.push("Plain English. No jargon. Action-oriented.");
191
+ instructions.push("3 steps max.");
192
+ estimatedAdjustment = -300;
193
+ break;
194
+ case "engineer":
195
+ instructions.push("Code-first response. Brief prose.");
196
+ instructions.push("Cite file:line for every claim.");
197
+ estimatedAdjustment = 0;
198
+ break;
199
+ case "engineering-manager":
200
+ instructions.push("Focus on impact-per-person-week tradeoffs.");
201
+ estimatedAdjustment = -100;
202
+ break;
203
+ default:
204
+ instructions.push("Default tone: balanced prose + code as needed.");
205
+ }
206
+ if (profile.verbosity === "terse") {
207
+ instructions.push("HARD CAP: 3 sentences max.");
208
+ estimatedAdjustment -= 200;
209
+ }
210
+ else if (profile.verbosity === "verbose") {
211
+ instructions.push("Verbose audience -- elaborate with examples.");
212
+ estimatedAdjustment += 200;
213
+ }
214
+ return { role: profile.role, toneInstructions: instructions, estimatedTokenAdjustment: estimatedAdjustment };
215
+ }
216
+ const ALIEN_WISDOM = [
217
+ { id: "w-cite-grep", pattern: "find|search|where", template: "Use `git grep -n` to locate $TARGET; cite file:line in the answer." },
218
+ { id: "w-test-arrange", pattern: "test|verify|assert", template: "Arrange / act / assert structure with a single behavior per `it`." },
219
+ { id: "w-error-narrow", pattern: "error|exception|crash", template: "Catch only the narrowest exception class; bubble unknowns." },
220
+ { id: "w-refactor-safe", pattern: "refactor|rename|move", template: "Preserve public API + test signatures; ship behind a feature flag if user-visible." },
221
+ { id: "w-perf-measure", pattern: "slow|performance|optim", template: "Measure before changing; cite the benchmark + threshold." },
222
+ { id: "w-doc-why", pattern: "explain|document|comment", template: "Document the WHY (constraints / decisions), not the WHAT (code already shows)." },
223
+ ];
224
+ /** Genetic recombination -- pick wisdom cards whose patterns match the
225
+ * intent, concat their templates with $TARGET substitution. The
226
+ * resulting template is a SKELETON; the AI fills in the specifics. */
227
+ export function buildAlienTemplate(intent) {
228
+ const lower = intent.toLowerCase();
229
+ const matched = ALIEN_WISDOM.filter((c) => {
230
+ const patterns = c.pattern.split("|");
231
+ return patterns.some((p) => lower.includes(p));
232
+ });
233
+ const target = intent.split(/\s+/).filter((w) => w.length >= 4).slice(0, 3).join(" ") || "the target";
234
+ const lines = [];
235
+ for (const c of matched.slice(0, 3)) {
236
+ lines.push(`# ${c.id}: ${c.template.replace(/\$TARGET/g, target)}`);
237
+ }
238
+ const template = lines.length > 0
239
+ ? `[ALIEN TEMPLATE -- AI fills in specifics]\n${lines.join("\n")}\n[END TEMPLATE]`
240
+ : `[ALIEN TEMPLATE -- no cards matched; AI free-forms]`;
241
+ return {
242
+ matchedCards: matched,
243
+ template,
244
+ estimatedTokens: Math.ceil(template.length / 4),
245
+ };
246
+ }
247
+ const CO2_GRAMS_PER_TOKEN_OUTPUT = 0.0005;
248
+ const CO2_GRAMS_PER_TOKEN_INPUT = 0.0001;
249
+ export function buildCarbonReport(repoRoot) {
250
+ const summary = totalSavings(repoRoot);
251
+ // Split spent/saved 50/50 across input/output as conservative average.
252
+ const co2Spent = summary.totalSpent * (CO2_GRAMS_PER_TOKEN_INPUT + CO2_GRAMS_PER_TOKEN_OUTPUT) / 2;
253
+ const co2Saved = summary.totalSaved * (CO2_GRAMS_PER_TOKEN_INPUT + CO2_GRAMS_PER_TOKEN_OUTPUT) / 2;
254
+ return {
255
+ tokensSpent: summary.totalSpent,
256
+ tokensSaved: summary.totalSaved,
257
+ co2GramsSpent: Number(co2Spent.toFixed(4)),
258
+ co2GramsSaved: Number(co2Saved.toFixed(4)),
259
+ equivalents: {
260
+ kmDriven: Number((co2Saved / 120).toFixed(4)), // 120 g/km avg car
261
+ smartphoneCharges: Number((co2Saved / 8.22).toFixed(4)), // 8.22 g/charge avg
262
+ treeSeconds: Number((co2Saved / 0.0027 * 1).toFixed(2)), // tree absorbs ~21kg/year = ~0.0027 g/s
263
+ },
264
+ generatedAt: new Date().toISOString(),
265
+ };
266
+ }
267
+ // ─── Public API persistence helpers ──────────────────────────────────
268
+ export function metamorphosisStatus(repoRoot) {
269
+ const mirror = join(repoRoot, META_DIR, "mirror", "latest.json");
270
+ const answers = readAnswers(repoRoot);
271
+ const carbon = buildCarbonReport(repoRoot);
272
+ return {
273
+ hasMirrorReport: existsSync(mirror),
274
+ interviewAnswered: answers.length,
275
+ carbonGramsSaved: carbon.co2GramsSaved,
276
+ };
277
+ }
278
+ //# sourceMappingURL=metamorphosis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metamorphosis.js","sourceRoot":"","sources":["../../src/metamorphosis/metamorphosis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * v1.63.0 -- METAMORPHOSIS test suite.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=metamorphosis.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metamorphosis.test.d.ts","sourceRoot":"","sources":["../../src/metamorphosis/metamorphosis.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * v1.63.0 -- METAMORPHOSIS test suite.
3
+ */
4
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
5
+ import { mkdtempSync, rmSync, mkdirSync, existsSync, appendFileSync } from "node:fs";
6
+ import { tmpdir } from "node:os";
7
+ import { join } from "node:path";
8
+ import { buildMirrorReport, persistMirrorReport, pickQuestions, recordAnswer, readAnswers, inferAudience, tuneFor, buildAlienTemplate, buildCarbonReport, metamorphosisStatus, } from "./metamorphosis.js";
9
+ function setupRepo() {
10
+ const r = mkdtempSync(join(tmpdir(), "mneme-meta-"));
11
+ // Seed the reactor ledger so mirror + carbon reports have signal.
12
+ const ledgerDir = join(r, ".mneme", "reactor");
13
+ mkdirSync(ledgerDir, { recursive: true });
14
+ const events = [
15
+ { tokensSpent: 50, baselineTokens: 500, tokensSaved: 450, savingsRatio: 0.9, method: "cache_exact_hit", ts: new Date().toISOString() },
16
+ { tokensSpent: 80, baselineTokens: 800, tokensSaved: 720, savingsRatio: 0.9, method: "slice_targeted", ts: new Date().toISOString() },
17
+ { tokensSpent: 200, baselineTokens: 300, tokensSaved: 100, savingsRatio: 0.33, method: "compiled_intent_miss", ts: new Date().toISOString() },
18
+ ];
19
+ for (const e of events)
20
+ appendFileSync(join(ledgerDir, "ledger.jsonl"), JSON.stringify(e) + "\n", "utf8");
21
+ return r;
22
+ }
23
+ function cleanup(r) { try {
24
+ rmSync(r, { recursive: true, force: true });
25
+ }
26
+ catch { /* */ } }
27
+ // ─── Layer 1: Transparency Mirror ────────────────────────────────────
28
+ describe("v1.63 Metamorphosis L1 · Transparency Mirror", () => {
29
+ let r;
30
+ beforeEach(() => { r = setupRepo(); });
31
+ afterEach(() => cleanup(r));
32
+ it("builds a report from the reactor ledger", () => {
33
+ const report = buildMirrorReport(r, 7);
34
+ expect(report.tokensSaved).toBe(1270);
35
+ expect(report.totalCalls).toBe(3);
36
+ expect(report.topMethods.length).toBeGreaterThan(0);
37
+ expect(report.plain).toContain("Mneme saved you");
38
+ });
39
+ it("identifies biggest waste (lowest-leverage method)", () => {
40
+ // Add several rows of low-leverage method so it qualifies as biggestWaste.
41
+ const ledger = join(r, ".mneme/reactor/ledger.jsonl");
42
+ for (let i = 0; i < 3; i++) {
43
+ appendFileSync(ledger, JSON.stringify({
44
+ tokensSpent: 200, baselineTokens: 300, tokensSaved: 100,
45
+ savingsRatio: 0.33, method: "compiled_intent_miss",
46
+ ts: new Date().toISOString(),
47
+ }) + "\n", "utf8");
48
+ }
49
+ const report = buildMirrorReport(r);
50
+ expect(report.biggestWaste).not.toBeNull();
51
+ if (report.biggestWaste) {
52
+ expect(report.biggestWaste.ratio).toBeLessThan(0.5);
53
+ }
54
+ });
55
+ it("persists the report", () => {
56
+ const report = buildMirrorReport(r);
57
+ const path = persistMirrorReport(r, report);
58
+ expect(existsSync(path)).toBe(true);
59
+ expect(existsSync(join(r, ".mneme/metamorphosis/mirror/latest.json"))).toBe(true);
60
+ });
61
+ });
62
+ // ─── Layer 2: Interview Protocol ─────────────────────────────────────
63
+ describe("v1.63 Metamorphosis L2 · Interview Protocol", () => {
64
+ let r;
65
+ beforeEach(() => { r = setupRepo(); });
66
+ afterEach(() => cleanup(r));
67
+ it("picks 3 diverse questions on a fresh repo", () => {
68
+ const qs = pickQuestions(r, 3);
69
+ expect(qs.length).toBe(3);
70
+ const topics = new Set(qs.map((q) => q.topic));
71
+ expect(topics.size).toBeGreaterThanOrEqual(2);
72
+ });
73
+ it("skips recently-answered questions", () => {
74
+ const qs = pickQuestions(r, 3);
75
+ recordAnswer(r, qs[0], "answered already");
76
+ const next = pickQuestions(r, 3);
77
+ expect(next.find((q) => q.id === qs[0].id)).toBeUndefined();
78
+ });
79
+ it("recordAnswer persists + computes word count", () => {
80
+ const qs = pickQuestions(r, 1);
81
+ const a = recordAnswer(r, qs[0], "this is a five word answer");
82
+ expect(a.wordCount).toBe(6);
83
+ const all = readAnswers(r);
84
+ expect(all.length).toBe(1);
85
+ });
86
+ });
87
+ // ─── Layer 3: Audience Layer ─────────────────────────────────────────
88
+ describe("v1.63 Metamorphosis L3 · Audience Layer", () => {
89
+ it("classifies engineer prompt", () => {
90
+ const p = inferAudience("refactor the auth function in middleware.ts to use async/await");
91
+ expect(p.role).toBe("engineer");
92
+ expect(p.codeFirst).toBe(true);
93
+ });
94
+ it("classifies PM prompt", () => {
95
+ const p = inferAudience("what's the sprint roadmap for Q2 jira backlog");
96
+ expect(p.role).toBe("pm");
97
+ });
98
+ it("classifies executive prompt", () => {
99
+ const p = inferAudience("show me the customer retention impact of last quarter's churn");
100
+ expect(p.role).toBe("executive");
101
+ });
102
+ it("classifies security prompt", () => {
103
+ const p = inferAudience("scan for CVE in our PCI flow + SOC2 compliance");
104
+ expect(p.role).toBe("security");
105
+ });
106
+ it("classifies customer prompt", () => {
107
+ const p = inferAudience("I forgot my password and need a refund");
108
+ expect(p.role).toBe("customer");
109
+ });
110
+ it("tuneFor returns appropriate instructions per role", () => {
111
+ const t = tuneFor({ role: "executive", verbosity: "terse", codeFirst: false, observedAt: "" });
112
+ expect(t.toneInstructions.some((s) => /business impact/i.test(s))).toBe(true);
113
+ expect(t.estimatedTokenAdjustment).toBeLessThan(0); // executives prefer terse
114
+ });
115
+ it("verbose audience increases token budget", () => {
116
+ const t = tuneFor({ role: "engineer", verbosity: "verbose", codeFirst: true, observedAt: "" });
117
+ expect(t.estimatedTokenAdjustment).toBeGreaterThanOrEqual(0);
118
+ });
119
+ });
120
+ // ─── Layer 4: Alien Protocol ─────────────────────────────────────────
121
+ describe("v1.63 Metamorphosis L4 · Alien Protocol", () => {
122
+ it("matches wisdom cards by pattern token", () => {
123
+ const t = buildAlienTemplate("write tests for the auth middleware");
124
+ expect(t.matchedCards.length).toBeGreaterThan(0);
125
+ expect(t.matchedCards.some((c) => c.id.includes("test"))).toBe(true);
126
+ });
127
+ it("substitutes $TARGET in templates", () => {
128
+ const t = buildAlienTemplate("find where the harmonic mean is computed");
129
+ expect(t.template).toContain("harmonic");
130
+ });
131
+ it("no-match prompt yields fallback template", () => {
132
+ const t = buildAlienTemplate("xyz qrs lmn");
133
+ expect(t.matchedCards.length).toBe(0);
134
+ expect(t.template).toContain("no cards matched");
135
+ });
136
+ it("estimatedTokens reflects template length", () => {
137
+ const t = buildAlienTemplate("refactor the database layer");
138
+ expect(t.estimatedTokens).toBeGreaterThan(0);
139
+ expect(t.estimatedTokens).toBeLessThan(200);
140
+ });
141
+ });
142
+ // ─── Layer 5: Carbon Budget ──────────────────────────────────────────
143
+ describe("v1.63 Metamorphosis L5 · Carbon Budget", () => {
144
+ let r;
145
+ beforeEach(() => { r = setupRepo(); });
146
+ afterEach(() => cleanup(r));
147
+ it("computes CO2 from token spend", () => {
148
+ const c = buildCarbonReport(r);
149
+ expect(c.co2GramsSaved).toBeGreaterThan(0);
150
+ expect(c.equivalents.kmDriven).toBeGreaterThan(0);
151
+ expect(c.equivalents.smartphoneCharges).toBeGreaterThan(0);
152
+ });
153
+ it("empty ledger -> zero CO2", () => {
154
+ const empty = mkdtempSync(join(tmpdir(), "empty-"));
155
+ try {
156
+ const c = buildCarbonReport(empty);
157
+ expect(c.co2GramsSaved).toBe(0);
158
+ }
159
+ finally {
160
+ rmSync(empty, { recursive: true, force: true });
161
+ }
162
+ });
163
+ });
164
+ // ─── Status rollup ───────────────────────────────────────────────────
165
+ describe("v1.63 Metamorphosis · status rollup", () => {
166
+ let r;
167
+ beforeEach(() => { r = setupRepo(); });
168
+ afterEach(() => cleanup(r));
169
+ it("status reports across all 5 layers", () => {
170
+ const s = metamorphosisStatus(r);
171
+ expect(s.hasMirrorReport).toBe(false); // not persisted yet
172
+ expect(s.interviewAnswered).toBe(0);
173
+ expect(s.carbonGramsSaved).toBeGreaterThan(0);
174
+ });
175
+ });
176
+ //# sourceMappingURL=metamorphosis.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metamorphosis.test.js","sourceRoot":"","sources":["../../src/metamorphosis/metamorphosis.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAA+B,UAAU,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAClH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EACL,iBAAiB,EAAE,mBAAmB,EACtC,aAAa,EAAE,YAAY,EAAE,WAAW,EACxC,aAAa,EAAE,OAAO,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAE5B,SAAS,SAAS;IAChB,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;IACrD,kEAAkE;IAClE,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC/C,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG;QACb,EAAE,WAAW,EAAE,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,iBAAiB,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;QACtI,EAAE,WAAW,EAAE,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;QACrI,EAAE,WAAW,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,sBAAsB,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;KAC9I,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1G,OAAO,CAAC,CAAC;AACX,CAAC;AACD,SAAS,OAAO,CAAC,CAAS,IAAI,IAAI,CAAC;IAAC,MAAM,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAAC,CAAC;AAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEpG,wEAAwE;AAExE,QAAQ,CAAC,8CAA8C,EAAE,GAAG,EAAE;IAC5D,IAAI,CAAS,CAAC;IACd,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5B,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,2EAA2E;QAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,EAAE,6BAA6B,CAAC,CAAC;QACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;gBACpC,WAAW,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG;gBACvD,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,sBAAsB;gBAClD,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAC7B,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;QACrB,CAAC;QACD,MAAM,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC3C,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACxB,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACtD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,mBAAmB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,yCAAyC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,wEAAwE;AAExE,QAAQ,CAAC,6CAA6C,EAAE,GAAG,EAAE;IAC3D,IAAI,CAAS,CAAC;IACd,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5B,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,EAAE,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,EAAE,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/B,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAE,EAAE,kBAAkB,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,EAAE,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAE,EAAE,4BAA4B,CAAC,CAAC;QAChE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,wEAAwE;AAExE,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,GAAG,aAAa,CAAC,gEAAgE,CAAC,CAAC;QAC1F,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,GAAG,aAAa,CAAC,+CAA+C,CAAC,CAAC;QACzE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,GAAG,aAAa,CAAC,+DAA+D,CAAC,CAAC;QACzF,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,GAAG,aAAa,CAAC,gDAAgD,CAAC,CAAC;QAC1E,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,GAAG,aAAa,CAAC,wCAAwC,CAAC,CAAC;QAClE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/F,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9E,MAAM,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,0BAA0B;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/F,MAAM,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,wEAAwE;AAExE,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,GAAG,kBAAkB,CAAC,qCAAqC,CAAC,CAAC;QACpE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,GAAG,kBAAkB,CAAC,0CAA0C,CAAC,CAAC;QACzE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;QAC5C,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,GAAG,kBAAkB,CAAC,6BAA6B,CAAC,CAAC;QAC5D,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,wEAAwE;AAExE,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACtD,IAAI,CAAS,CAAC;IACd,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5B,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,wEAAwE;AAExE,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,IAAI,CAAS,CAAC;IACd,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5B,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB;QAC3D,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}