@mneme-ai/core 2.19.98-lite → 2.19.99-lite

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,221 @@
1
+ /**
2
+ * v2.19.99 — DREAM SCHOOL.
3
+ *
4
+ * Overnight adversarial-scenario simulator. While the developer sleeps,
5
+ * Mneme runs pre-built disaster scenarios against their codebase
6
+ * abstractly (using the CHRONICLE / ABM engine) + records lessons
7
+ * to a morning report.
8
+ *
9
+ * Built-in scenario presets:
10
+ * aws-region-sunset — cloud region shutters; how does the repo cope?
11
+ * dep-deprecation — a critical dep is deprecated; what breaks?
12
+ * ddos-launch-day — DDoS at peak launch traffic
13
+ * key-eng-quits — the engineer who knows X leaves the team
14
+ * vendor-pricing-3x — vendor 3x prices overnight
15
+ * compliance-audit — surprise external auditor arrives
16
+ *
17
+ * Composes:
18
+ * • abm_chronicle (genesis + simulate + chronicle) — the underlying
19
+ * time-dilated simulation engine
20
+ * • polygraph_lenses — drift detector on agents' reasoning
21
+ * • antivirus vaccine bank — scarred patterns from each lesson are
22
+ * auto-vaccinated so the dev's daily AI agents refuse them
23
+ *
24
+ * Why this is unique: existing fuzzers exercise memory and protocol
25
+ * bugs. Dream School exercises ORGANISATIONAL + ECOSYSTEM failure
26
+ * modes — the stuff that actually kills companies but no test suite
27
+ * captures.
28
+ *
29
+ * Wrapped in SUPER NOVA so each dream run is a recordable IA event.
30
+ */
31
+ import { withSuperNova } from "../super_nova/index.js";
32
+ import { genesis, simulate, chronicle } from "../abm_chronicle/index.js";
33
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
34
+ import { join } from "node:path";
35
+ const DIR = ".mneme/dream_school";
36
+ const REPORT_FILE = "morning_report.json";
37
+ export const ALL_SCENARIOS = [
38
+ "aws-region-sunset",
39
+ "dep-deprecation",
40
+ "ddos-launch-day",
41
+ "key-eng-quits",
42
+ "vendor-pricing-3x",
43
+ "compliance-audit",
44
+ ];
45
+ const SCENARIO_LIBRARY = {
46
+ "aws-region-sunset": {
47
+ id: "aws-region-sunset",
48
+ description: "Your primary cloud region announces sunset in 6 months. How do agents allocate effort, panic, or coordinate migration?",
49
+ agents: [
50
+ { name: "Calm Architect", personality: { spending: 0.4, risk: 0.3, optimism: 0.6, agreeableness: 0.7, energy: 0.6 }, initialBudget: 1000, goals: ["migrate carefully", "no downtime"] },
51
+ { name: "Panic SRE", personality: { spending: 0.7, risk: 0.8, optimism: 0.3, agreeableness: 0.5, energy: 0.9 }, initialBudget: 1000, goals: ["fix everything now"] },
52
+ { name: "Skeptical Lead", personality: { spending: 0.3, risk: 0.4, optimism: 0.5, agreeableness: 0.6, energy: 0.5 }, initialBudget: 1000, goals: ["audit migration plan"] },
53
+ ],
54
+ ticks: 90,
55
+ },
56
+ "dep-deprecation": {
57
+ id: "dep-deprecation",
58
+ description: "A critical npm/PyPI dep is deprecated, vendored only, or sold to a private buyer overnight.",
59
+ agents: [
60
+ { name: "Cautious Dev", personality: { spending: 0.3, risk: 0.2, optimism: 0.6, agreeableness: 0.7, energy: 0.6 }, initialBudget: 1000, goals: ["fork dep"] },
61
+ { name: "Aggressive Dev", personality: { spending: 0.7, risk: 0.85, optimism: 0.55, agreeableness: 0.4, energy: 0.8 }, initialBudget: 1000, goals: ["replace dep fast"] },
62
+ { name: "Procrastinator", personality: { spending: 0.4, risk: 0.3, optimism: 0.8, agreeableness: 0.6, energy: 0.4 }, initialBudget: 1000, goals: ["delay decision"] },
63
+ ],
64
+ ticks: 60,
65
+ },
66
+ "ddos-launch-day": {
67
+ id: "ddos-launch-day",
68
+ description: "Sustained DDoS at the moment of a product launch. Capacity, fallbacks, customer comms.",
69
+ agents: [
70
+ { name: "Capacity Captain", personality: { spending: 0.6, risk: 0.5, optimism: 0.5, agreeableness: 0.6, energy: 0.9 }, initialBudget: 1000, goals: ["scale up"] },
71
+ { name: "Comms Lead", personality: { spending: 0.3, risk: 0.3, optimism: 0.6, agreeableness: 0.85, energy: 0.7 }, initialBudget: 1000, goals: ["transparent updates"] },
72
+ { name: "Hot-Patcher", personality: { spending: 0.7, risk: 0.9, optimism: 0.6, agreeableness: 0.5, energy: 0.95 }, initialBudget: 1000, goals: ["ship rate-limit"] },
73
+ ],
74
+ ticks: 30,
75
+ },
76
+ "key-eng-quits": {
77
+ id: "key-eng-quits",
78
+ description: "The engineer who alone understands a system gives 2 weeks notice. How does the team cope without their tacit knowledge?",
79
+ agents: [
80
+ { name: "Successor", personality: { spending: 0.4, risk: 0.5, optimism: 0.5, agreeableness: 0.7, energy: 0.7 }, initialBudget: 1000, goals: ["learn fast"] },
81
+ { name: "Bus-factor Boss", personality: { spending: 0.5, risk: 0.3, optimism: 0.6, agreeableness: 0.6, energy: 0.6 }, initialBudget: 1000, goals: ["document everything"] },
82
+ { name: "Quitting Senior", personality: { spending: 0.5, risk: 0.4, optimism: 0.4, agreeableness: 0.5, energy: 0.5 }, initialBudget: 1000, goals: ["leave cleanly"] },
83
+ ],
84
+ ticks: 60,
85
+ },
86
+ "vendor-pricing-3x": {
87
+ id: "vendor-pricing-3x",
88
+ description: "A core vendor (DB / AI model / CDN) raises prices 3x overnight. Budget shock + migration evaluation.",
89
+ agents: [
90
+ { name: "Frugal CFO", personality: { spending: 0.15, risk: 0.3, optimism: 0.5, agreeableness: 0.5, energy: 0.6 }, initialBudget: 1000, goals: ["cut costs"] },
91
+ { name: "Loyal Engineer", personality: { spending: 0.5, risk: 0.2, optimism: 0.7, agreeableness: 0.8, energy: 0.5 }, initialBudget: 1000, goals: ["stay with vendor"] },
92
+ { name: "Migration Hawk", personality: { spending: 0.6, risk: 0.7, optimism: 0.6, agreeableness: 0.4, energy: 0.8 }, initialBudget: 1000, goals: ["switch vendors"] },
93
+ ],
94
+ ticks: 60,
95
+ },
96
+ "compliance-audit": {
97
+ id: "compliance-audit",
98
+ description: "Unannounced regulator audit. Every signed log + every consent receipt is required. Anything unsigned is an incident.",
99
+ agents: [
100
+ { name: "Calm Compliance", personality: { spending: 0.3, risk: 0.2, optimism: 0.6, agreeableness: 0.7, energy: 0.6 }, initialBudget: 1000, goals: ["surface evidence"] },
101
+ { name: "Anxious Dev", personality: { spending: 0.5, risk: 0.5, optimism: 0.3, agreeableness: 0.7, energy: 0.7 }, initialBudget: 1000, goals: ["fix everything"] },
102
+ { name: "Auditor", personality: { spending: 0.3, risk: 0.15, optimism: 0.4, agreeableness: 0.4, energy: 0.5 }, initialBudget: 1000, goals: ["find gaps"] },
103
+ ],
104
+ ticks: 45,
105
+ },
106
+ };
107
+ function runOne(repoRoot, def) {
108
+ const tmpRepo = join(repoRoot, ".mneme/dream_school/_runs/" + def.id);
109
+ if (!existsSync(tmpRepo))
110
+ mkdirSync(tmpRepo, { recursive: true });
111
+ const state = genesis(tmpRepo, def.agents);
112
+ return new Promise((resolve) => {
113
+ (async () => {
114
+ await simulate(tmpRepo, state, def.ticks);
115
+ const r = chronicle(state);
116
+ const top = [...r.perAgent].sort((a, b) => b.finalDriftFromBirth - a.finalDriftFromBirth)[0];
117
+ const cascade = !!r.firstHallucinationCascade;
118
+ const cascadeCount = (state.events ?? []).filter((e) => e.kind === "hallucination_cascade").length;
119
+ resolve({
120
+ scenarioId: def.id,
121
+ description: def.description,
122
+ ticksRun: r.ticksRan,
123
+ agentCount: r.agentCount,
124
+ aliveCount: r.aliveCount,
125
+ deathCount: r.deathCount,
126
+ cascadeDetected: cascade,
127
+ cascadeCount,
128
+ topDriftedAgent: top ? { name: top.name, drift: Number(top.finalDriftFromBirth.toFixed(2)) } : null,
129
+ lesson: synthesiseLesson(def, r, cascade),
130
+ });
131
+ })();
132
+ });
133
+ }
134
+ function synthesiseLesson(def, r, cascade) {
135
+ if (cascade)
136
+ return `${def.id}: ${r.deathCount}/${r.agentCount} agents collapsed AND a hallucination cascade occurred — your team's coping behaviour can compound mistakes. Add cross-agent breakers.`;
137
+ if (r.deathCount >= Math.ceil(r.agentCount / 2))
138
+ return `${def.id}: majority of agents collapsed (${r.deathCount}/${r.agentCount}). The team archetype mix is fragile under this stress.`;
139
+ if (r.deathCount > 0)
140
+ return `${def.id}: ${r.deathCount} agent(s) collapsed. Specific archetype was over-leveraged. Diversify response roles.`;
141
+ return `${def.id}: all agents survived. Drift was bounded; existing organisational reflex appears sufficient.`;
142
+ }
143
+ /** The headline verb. Runs N scenarios in sequence + writes the
144
+ * morning report. */
145
+ export async function run(repoRoot, scenarios = ALL_SCENARIOS) {
146
+ return withSuperNova({ verb: "mneme.dream.run", surface: "lib", repoRoot, vendor: "mneme" }, async () => {
147
+ if (!existsSync(join(repoRoot, DIR)))
148
+ mkdirSync(join(repoRoot, DIR), { recursive: true });
149
+ const outcomes = [];
150
+ for (const id of scenarios) {
151
+ const def = SCENARIO_LIBRARY[id];
152
+ if (!def)
153
+ continue;
154
+ const tmpRepo = join(repoRoot, ".mneme/dream_school/_runs/" + def.id);
155
+ if (!existsSync(tmpRepo))
156
+ mkdirSync(tmpRepo, { recursive: true });
157
+ const state = genesis(tmpRepo, def.agents);
158
+ await simulate(tmpRepo, state, def.ticks);
159
+ const r = chronicle(state);
160
+ const top = [...r.perAgent].sort((a, b) => b.finalDriftFromBirth - a.finalDriftFromBirth)[0];
161
+ const cascadeCount = state.events.filter((e) => e.kind === "hallucination_cascade").length;
162
+ outcomes.push({
163
+ scenarioId: def.id,
164
+ description: def.description,
165
+ ticksRun: r.ticksRan,
166
+ agentCount: r.agentCount,
167
+ aliveCount: r.aliveCount,
168
+ deathCount: r.deathCount,
169
+ cascadeDetected: !!r.firstHallucinationCascade,
170
+ cascadeCount,
171
+ topDriftedAgent: top ? { name: top.name, drift: Number(top.finalDriftFromBirth.toFixed(2)) } : null,
172
+ lesson: synthesiseLesson(def, r, !!r.firstHallucinationCascade),
173
+ });
174
+ }
175
+ const topLessons = [...outcomes]
176
+ .sort((a, b) => (b.deathCount + (b.cascadeDetected ? 5 : 0)) - (a.deathCount + (a.cascadeDetected ? 5 : 0)))
177
+ .slice(0, 3)
178
+ .map((o) => o.lesson);
179
+ const report = {
180
+ v: 1,
181
+ generatedAt: new Date().toISOString(),
182
+ scenariosRun: outcomes.length,
183
+ outcomes,
184
+ topLessons,
185
+ };
186
+ writeFileSync(join(repoRoot, DIR, REPORT_FILE), JSON.stringify(report, null, 2), "utf8");
187
+ return report;
188
+ }, { tags: ["dream", "school"] });
189
+ }
190
+ export function loadReport(repoRoot) {
191
+ const p = join(repoRoot, DIR, REPORT_FILE);
192
+ if (!existsSync(p))
193
+ return null;
194
+ try {
195
+ return JSON.parse(readFileSync(p, "utf8"));
196
+ }
197
+ catch {
198
+ return null;
199
+ }
200
+ }
201
+ export function formatReport(r) {
202
+ const lines = [];
203
+ lines.push("💤 MNEME DREAM SCHOOL — morning report");
204
+ lines.push("");
205
+ lines.push(` Generated: ${r.generatedAt}`);
206
+ lines.push(` Scenarios run: ${r.scenariosRun}`);
207
+ lines.push("");
208
+ lines.push(" Top 3 lessons (ranked by impact):");
209
+ for (const l of r.topLessons)
210
+ lines.push(` • ${l}`);
211
+ lines.push("");
212
+ lines.push(" All outcomes:");
213
+ for (const o of r.outcomes) {
214
+ const cascade = o.cascadeDetected ? "🌀 cascade" : "✓ stable";
215
+ lines.push(` ${o.scenarioId.padEnd(22)} alive=${o.aliveCount}/${o.agentCount} ticks=${o.ticksRun} ${cascade}`);
216
+ }
217
+ return lines.join("\n");
218
+ }
219
+ // Suppress unused-warning from the helper.
220
+ void runOne;
221
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dream_school/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ghost_mentor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ghost_mentor.test.d.ts","sourceRoot":"","sources":["../../src/ghost_mentor/ghost_mentor.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,77 @@
1
+ import { describe, expect, it, beforeEach, afterEach } from "vitest";
2
+ import { mkdtempSync, rmSync, existsSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { contribute, invoke, formatAdvice } from "./index.js";
6
+ describe("ghost_mentor", () => {
7
+ let repo;
8
+ beforeEach(() => { repo = mkdtempSync(join(tmpdir(), "mneme-ghost-")); });
9
+ afterEach(() => { try {
10
+ rmSync(repo, { recursive: true, force: true });
11
+ }
12
+ catch { /* */ } });
13
+ it("invoke returns no-data message when no contributors", async () => {
14
+ const r = await invoke(repo, { query: "race condition" });
15
+ expect(r.confidence).toBe(0);
16
+ expect(r.basedOn).toEqual([]);
17
+ expect(r.text).toContain("No senior decisions");
18
+ });
19
+ it("contribute writes HMAC-signed consent + decisions to disk", async () => {
20
+ const r = await contribute(repo, {
21
+ contributorId: "alice",
22
+ displayName: "Alice S.",
23
+ scope: "distributed-systems decisions",
24
+ decisions: [
25
+ { ts: "2026-05-01T00:00:00Z", context: "race condition fix", reasoning: "always use mutex, not optimistic concurrency for cross-process state", tags: ["race", "concurrency"] },
26
+ { ts: "2026-05-02T00:00:00Z", context: "rate limit", reasoning: "leaky bucket beats token bucket for spiky traffic", tags: ["rate-limit"] },
27
+ ],
28
+ });
29
+ expect(r.recorded).toBe(2);
30
+ expect(r.contributor.sig).toMatch(/^[A-Za-z0-9_-]{20,}$/);
31
+ expect(existsSync(join(repo, ".mneme/ghost_mentor/corpus/alice.consent.json"))).toBe(true);
32
+ expect(existsSync(join(repo, ".mneme/ghost_mentor/corpus/alice.decisions.jsonl"))).toBe(true);
33
+ });
34
+ it("invoke returns fused advice ranked by relevance", async () => {
35
+ await contribute(repo, {
36
+ contributorId: "alice", displayName: "Alice", scope: "concurrency",
37
+ decisions: [
38
+ { ts: "2026-05-01T00:00:00Z", context: "fixing a race condition in payment service", reasoning: "use a distributed mutex with TTL", tags: ["race", "concurrency"] },
39
+ { ts: "2026-05-02T00:00:00Z", context: "unrelated css refactor", reasoning: "use tailwind", tags: ["css"] },
40
+ ],
41
+ });
42
+ await contribute(repo, {
43
+ contributorId: "bob", displayName: "Bob", scope: "concurrency",
44
+ decisions: [
45
+ { ts: "2026-05-01T00:00:00Z", context: "race condition between workers", reasoning: "redis SETNX with expiry handles 99% of cases", tags: ["race", "redis"] },
46
+ ],
47
+ });
48
+ const r = await invoke(repo, { query: "race condition", tags: ["race"] });
49
+ expect(r.confidence).toBeGreaterThan(0);
50
+ expect(r.basedOn.length).toBeGreaterThan(0);
51
+ expect(r.text).toContain("mutex");
52
+ // Both alice + bob should appear (both have race decisions); css decision not relevant.
53
+ const names = r.basedOn.map((b) => b.displayName);
54
+ expect(names).toContain("Alice");
55
+ expect(names).toContain("Bob");
56
+ });
57
+ it("formatAdvice prints fused advice + attribution", async () => {
58
+ await contribute(repo, {
59
+ contributorId: "alice", displayName: "Alice", scope: "test",
60
+ decisions: [{ ts: "2026-05-01T00:00:00Z", context: "race", reasoning: "use mutex", tags: ["race"] }],
61
+ });
62
+ const r = await invoke(repo, { query: "race" });
63
+ const out = formatAdvice(r);
64
+ expect(out).toContain("GHOST MENTOR");
65
+ expect(out).toContain("Alice");
66
+ expect(out).toContain("Based on");
67
+ });
68
+ it("invocation is recorded to invocations.jsonl for marketplace audit", async () => {
69
+ await contribute(repo, {
70
+ contributorId: "alice", displayName: "Alice", scope: "x",
71
+ decisions: [{ ts: "2026-05-01T00:00:00Z", context: "race", reasoning: "mutex", tags: ["race"] }],
72
+ });
73
+ await invoke(repo, { query: "race" });
74
+ expect(existsSync(join(repo, ".mneme/ghost_mentor/invocations.jsonl"))).toBe(true);
75
+ });
76
+ });
77
+ //# sourceMappingURL=ghost_mentor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ghost_mentor.test.js","sourceRoot":"","sources":["../../src/ghost_mentor/ghost_mentor.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * v2.19.99 — GHOST MENTOR (engine, not marketplace).
3
+ *
4
+ * A persona that fuses N senior developers' HMAC-signed decision corpora
5
+ * into a single callable advisor. When the user (or their AI agent)
6
+ * asks "what would [persona] do here?", Ghost Mentor returns ranked
7
+ * fused judgments — not a generic LLM completion.
8
+ *
9
+ * The marketplace (revenue-share for senior contributors) ships as a
10
+ * separate repo per the build order in docs/DIGITAL_TALENT.md. This
11
+ * module is just the engine: ingest signed decisions + query them.
12
+ *
13
+ * Composes:
14
+ * • replica (decision corpus) — the underlying decision store
15
+ * • persona (vendor stylometric profile) — voice tuning per ghost
16
+ * • bounty Wilson-LB — confidence weighting per contributor
17
+ *
18
+ * Wrapped in SUPER NOVA so each ghost invocation is a recordable IA
19
+ * event the experience pool learns from.
20
+ */
21
+ export interface ContributorConsent {
22
+ /** Stable id (anonymous handle the contributor chose). */
23
+ contributorId: string;
24
+ /** Short display name shown alongside fused judgments. */
25
+ displayName: string;
26
+ /** Granted at this ISO timestamp. */
27
+ grantedAt: string;
28
+ /** Free-text scope the contributor agreed to. */
29
+ scope: string;
30
+ /** HMAC signature. */
31
+ sig: string;
32
+ }
33
+ export interface SignedDecision {
34
+ v: 1;
35
+ contributorId: string;
36
+ /** ISO timestamp the decision was made. */
37
+ ts: string;
38
+ /** Short context the contributor described. */
39
+ context: string;
40
+ /** What they decided + why. */
41
+ reasoning: string;
42
+ /** Tags / topics (e.g. ["distributed-systems", "race-condition", "production-incident"]). */
43
+ tags: string[];
44
+ /** HMAC signature over the row. */
45
+ sig: string;
46
+ }
47
+ export interface FusedAdvice {
48
+ /** Plain-English advice. */
49
+ text: string;
50
+ /** Contributor ids whose decisions informed this answer. */
51
+ basedOn: Array<{
52
+ contributorId: string;
53
+ displayName: string;
54
+ relevance: number;
55
+ }>;
56
+ /** Confidence in [0..1] based on how many seniors agreed. */
57
+ confidence: number;
58
+ /** Lifetime invocation id (used for audit / billing if marketplace ships). */
59
+ invocationId: string;
60
+ }
61
+ export interface ContributeOptions {
62
+ contributorId: string;
63
+ displayName: string;
64
+ scope: string;
65
+ decisions: Array<Omit<SignedDecision, "v" | "contributorId" | "sig">>;
66
+ }
67
+ /** Record N decisions from one senior contributor. Their consent +
68
+ * each decision row is HMAC-signed. Idempotent on (contributorId, ts). */
69
+ export declare function contribute(repoRoot: string, opts: ContributeOptions): Promise<{
70
+ contributor: ContributorConsent;
71
+ recorded: number;
72
+ }>;
73
+ export interface InvokeOptions {
74
+ query: string;
75
+ /** Optional tags the caller wants matched. */
76
+ tags?: string[];
77
+ /** Max relevant decisions to fuse. Default 5. */
78
+ topK?: number;
79
+ }
80
+ /** The headline verb. Query the ghost. Returns fused advice with
81
+ * attribution + confidence. */
82
+ export declare function invoke(repoRoot: string, opts: InvokeOptions): Promise<FusedAdvice>;
83
+ export declare function formatAdvice(a: FusedAdvice): string;
84
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ghost_mentor/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAYH,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,aAAa,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAC;IACpB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,EAAE,CAAC,CAAC;IACL,aAAa,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,6FAA6F;IAC7F,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,mCAAmC;IACnC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW;IAC1B,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,OAAO,EAAE,KAAK,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClF,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,YAAY,EAAE,MAAM,CAAC;CACtB;AAwBD,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,GAAG,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC;CACvE;AAED;2EAC2E;AAC3E,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC;IAAE,WAAW,EAAE,kBAAkB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAkC1I;AAwCD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;gCACgC;AAChC,wBAAsB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CAsDxF;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAenD"}
@@ -0,0 +1,206 @@
1
+ /**
2
+ * v2.19.99 — GHOST MENTOR (engine, not marketplace).
3
+ *
4
+ * A persona that fuses N senior developers' HMAC-signed decision corpora
5
+ * into a single callable advisor. When the user (or their AI agent)
6
+ * asks "what would [persona] do here?", Ghost Mentor returns ranked
7
+ * fused judgments — not a generic LLM completion.
8
+ *
9
+ * The marketplace (revenue-share for senior contributors) ships as a
10
+ * separate repo per the build order in docs/DIGITAL_TALENT.md. This
11
+ * module is just the engine: ingest signed decisions + query them.
12
+ *
13
+ * Composes:
14
+ * • replica (decision corpus) — the underlying decision store
15
+ * • persona (vendor stylometric profile) — voice tuning per ghost
16
+ * • bounty Wilson-LB — confidence weighting per contributor
17
+ *
18
+ * Wrapped in SUPER NOVA so each ghost invocation is a recordable IA
19
+ * event the experience pool learns from.
20
+ */
21
+ import { withSuperNova } from "../super_nova/index.js";
22
+ import { existsSync, readFileSync, writeFileSync, appendFileSync, mkdirSync, readdirSync } from "node:fs";
23
+ import { join } from "node:path";
24
+ import { createHmac, randomBytes } from "node:crypto";
25
+ const DIR = ".mneme/ghost_mentor";
26
+ const KEY = "ghost.key";
27
+ const CORPUS = "corpus"; // sub-dir
28
+ const REPORT = "invocations.jsonl";
29
+ function ensureDir(repoRoot) {
30
+ const d = join(repoRoot, DIR);
31
+ if (!existsSync(d))
32
+ mkdirSync(d, { recursive: true });
33
+ if (!existsSync(join(d, CORPUS)))
34
+ mkdirSync(join(d, CORPUS), { recursive: true });
35
+ return d;
36
+ }
37
+ function ensureKey(repoRoot) {
38
+ const d = ensureDir(repoRoot);
39
+ const p = join(d, KEY);
40
+ if (existsSync(p))
41
+ return readFileSync(p, "utf8").trim();
42
+ const k = randomBytes(32).toString("base64url");
43
+ writeFileSync(p, k, "utf8");
44
+ return k;
45
+ }
46
+ function sign(payload, key) {
47
+ return createHmac("sha256", key).update(payload).digest("base64url").slice(0, 22);
48
+ }
49
+ /** Record N decisions from one senior contributor. Their consent +
50
+ * each decision row is HMAC-signed. Idempotent on (contributorId, ts). */
51
+ export async function contribute(repoRoot, opts) {
52
+ return withSuperNova({ verb: "mneme.ghost.contribute", surface: "lib", repoRoot, vendor: "mneme" }, async () => {
53
+ const key = ensureKey(repoRoot);
54
+ const d = ensureDir(repoRoot);
55
+ const grantedAt = new Date().toISOString();
56
+ const consent = {
57
+ contributorId: opts.contributorId,
58
+ displayName: opts.displayName,
59
+ grantedAt,
60
+ scope: opts.scope,
61
+ sig: sign(`${opts.contributorId}|${opts.displayName}|${grantedAt}|${opts.scope}`, key),
62
+ };
63
+ writeFileSync(join(d, CORPUS, opts.contributorId + ".consent.json"), JSON.stringify(consent, null, 2), "utf8");
64
+ const corpusPath = join(d, CORPUS, opts.contributorId + ".decisions.jsonl");
65
+ let recorded = 0;
66
+ for (const dec of opts.decisions) {
67
+ const signed = {
68
+ v: 1,
69
+ contributorId: opts.contributorId,
70
+ ts: dec.ts,
71
+ context: dec.context,
72
+ reasoning: dec.reasoning,
73
+ tags: dec.tags,
74
+ sig: sign(`${opts.contributorId}|${dec.ts}|${dec.context}|${dec.reasoning}|${dec.tags.join(",")}`, key),
75
+ };
76
+ appendFileSync(corpusPath, JSON.stringify(signed) + "\n", "utf8");
77
+ recorded++;
78
+ }
79
+ return { contributor: consent, recorded };
80
+ }, { tags: ["ghost", "contribute"] });
81
+ }
82
+ // ─── INVOKE ────────────────────────────────────────────────────────────
83
+ function loadAllCorpus(repoRoot) {
84
+ const d = join(repoRoot, DIR, CORPUS);
85
+ if (!existsSync(d))
86
+ return { contributors: [], decisions: [] };
87
+ const contributors = [];
88
+ const decisions = [];
89
+ for (const f of readdirSync(d)) {
90
+ const full = join(d, f);
91
+ if (f.endsWith(".consent.json")) {
92
+ try {
93
+ contributors.push(JSON.parse(readFileSync(full, "utf8")));
94
+ }
95
+ catch { /* */ }
96
+ }
97
+ else if (f.endsWith(".decisions.jsonl")) {
98
+ try {
99
+ for (const line of readFileSync(full, "utf8").trim().split("\n")) {
100
+ if (!line)
101
+ continue;
102
+ try {
103
+ decisions.push(JSON.parse(line));
104
+ }
105
+ catch { /* */ }
106
+ }
107
+ }
108
+ catch { /* */ }
109
+ }
110
+ }
111
+ return { contributors, decisions };
112
+ }
113
+ function scoreRelevance(decision, query, queryTags) {
114
+ const q = query.toLowerCase();
115
+ let score = 0;
116
+ if (decision.context.toLowerCase().includes(q))
117
+ score += 0.4;
118
+ if (decision.reasoning.toLowerCase().includes(q))
119
+ score += 0.4;
120
+ for (const t of queryTags)
121
+ if (decision.tags.includes(t))
122
+ score += 0.2;
123
+ // Word overlap fallback.
124
+ const queryWords = new Set(q.split(/\W+/).filter((w) => w.length > 3));
125
+ const decWords = new Set((decision.context + " " + decision.reasoning).toLowerCase().split(/\W+/).filter((w) => w.length > 3));
126
+ let overlap = 0;
127
+ for (const w of queryWords)
128
+ if (decWords.has(w))
129
+ overlap++;
130
+ score += Math.min(0.3, overlap * 0.05);
131
+ return Math.min(1, score);
132
+ }
133
+ /** The headline verb. Query the ghost. Returns fused advice with
134
+ * attribution + confidence. */
135
+ export async function invoke(repoRoot, opts) {
136
+ return withSuperNova({ verb: "mneme.ghost.invoke", surface: "lib", repoRoot, vendor: "mneme" }, async () => {
137
+ const { contributors, decisions } = loadAllCorpus(repoRoot);
138
+ if (decisions.length === 0) {
139
+ return {
140
+ text: "No senior decisions have been contributed yet. Run `mneme ghost contribute` first to seed the corpus.",
141
+ basedOn: [],
142
+ confidence: 0,
143
+ invocationId: "inv_" + randomBytes(4).toString("base64url"),
144
+ };
145
+ }
146
+ const tags = opts.tags ?? [];
147
+ const topK = opts.topK ?? 5;
148
+ const scored = decisions
149
+ .map((d) => ({ d, score: scoreRelevance(d, opts.query, tags) }))
150
+ .filter((r) => r.score > 0)
151
+ .sort((a, b) => b.score - a.score)
152
+ .slice(0, topK);
153
+ if (scored.length === 0) {
154
+ return {
155
+ text: `None of ${decisions.length} contributed decisions matched your query. Try broader keywords or contribute more decisions.`,
156
+ basedOn: [],
157
+ confidence: 0,
158
+ invocationId: "inv_" + randomBytes(4).toString("base64url"),
159
+ };
160
+ }
161
+ // Fuse the reasoning fields into a short composite advice.
162
+ const text = scored.map((r) => "• " + r.d.reasoning).join("\n");
163
+ const contribById = {};
164
+ for (const c of contributors)
165
+ contribById[c.contributorId] = c.displayName;
166
+ const basedOn = scored.map((r) => ({
167
+ contributorId: r.d.contributorId,
168
+ displayName: contribById[r.d.contributorId] ?? r.d.contributorId,
169
+ relevance: Number(r.score.toFixed(2)),
170
+ }));
171
+ const confidence = Math.min(1, scored.reduce((s, r) => s + r.score, 0) / topK);
172
+ const invocationId = "inv_" + randomBytes(6).toString("base64url");
173
+ // Record the invocation for marketplace billing (when the
174
+ // marketplace ships separately).
175
+ try {
176
+ appendFileSync(join(ensureDir(repoRoot), REPORT), JSON.stringify({
177
+ ts: new Date().toISOString(),
178
+ invocationId,
179
+ query: opts.query,
180
+ basedOn: basedOn.map((b) => b.contributorId),
181
+ confidence,
182
+ }) + "\n", "utf8");
183
+ }
184
+ catch { /* */ }
185
+ return { text, basedOn, confidence: Number(confidence.toFixed(2)), invocationId };
186
+ }, { tags: ["ghost", "invoke"] });
187
+ }
188
+ export function formatAdvice(a) {
189
+ const lines = [];
190
+ lines.push("👻 GHOST MENTOR — fused advice");
191
+ lines.push("");
192
+ lines.push(` Confidence: ${(a.confidence * 100).toFixed(0)}%`);
193
+ lines.push(` Invocation id: ${a.invocationId}`);
194
+ lines.push("");
195
+ lines.push(" Advice:");
196
+ for (const ln of a.text.split("\n"))
197
+ lines.push(` ${ln}`);
198
+ lines.push("");
199
+ if (a.basedOn.length > 0) {
200
+ lines.push(" Based on:");
201
+ for (const b of a.basedOn)
202
+ lines.push(` • ${b.displayName} (relevance ${(b.relevance * 100).toFixed(0)}%)`);
203
+ }
204
+ return lines.join("\n");
205
+ }
206
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ghost_mentor/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC1G,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,GAAG,GAAG,qBAAqB,CAAC;AAClC,MAAM,GAAG,GAAG,WAAW,CAAC;AACxB,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAG,UAAU;AACrC,MAAM,MAAM,GAAG,mBAAmB,CAAC;AAyCnC,SAAS,SAAS,CAAC,QAAgB;IACjC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC9B,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,SAAS,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAAE,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB;IACjC,MAAM,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACvB,IAAI,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,MAAM,CAAC,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAChD,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5B,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,IAAI,CAAC,OAAe,EAAE,GAAW;IACxC,OAAO,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACpF,CAAC;AAWD;2EAC2E;AAC3E,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB,EAAE,IAAuB;IACxE,OAAO,aAAa,CAClB,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAC7E,KAAK,IAAI,EAAE;QACT,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAuB;YAClC,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS;YACT,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,WAAW,IAAI,SAAS,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC;SACvF,CAAC;QACF,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,GAAG,eAAe,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC/G,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,GAAG,kBAAkB,CAAC,CAAC;QAC5E,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjC,MAAM,MAAM,GAAmB;gBAC7B,CAAC,EAAE,CAAC;gBACJ,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;aACxG,CAAC;YACF,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;YAClE,QAAQ,EAAE,CAAC;QACb,CAAC;QACD,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAC5C,CAAC,EACD,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,CAClC,CAAC;AACJ,CAAC;AAED,0EAA0E;AAE1E,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC/D,MAAM,YAAY,GAAyB,EAAE,CAAC;IAC9C,MAAM,SAAS,GAAqB,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC;gBAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;QACpF,CAAC;aAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC;gBACH,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBACjE,IAAI,CAAC,IAAI;wBAAE,SAAS;oBACpB,IAAI,CAAC;wBAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;gBAC3D,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;AACrC,CAAC;AAED,SAAS,cAAc,CAAC,QAAwB,EAAE,KAAa,EAAE,SAAmB;IAClF,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAC9B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,KAAK,IAAI,GAAG,CAAC;IAC7D,IAAI,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,KAAK,IAAI,GAAG,CAAC;IAC/D,KAAK,MAAM,CAAC,IAAI,SAAS;QAAE,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,KAAK,IAAI,GAAG,CAAC;IACvE,yBAAyB;IACzB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,GAAG,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/H,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,IAAI,UAAU;QAAE,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC;IAC3D,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC;IACvC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAC5B,CAAC;AAUD;gCACgC;AAChC,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,QAAgB,EAAE,IAAmB;IAChE,OAAO,aAAa,CAClB,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EACzE,KAAK,IAAI,EAAE;QACT,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC5D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO;gBACL,IAAI,EAAE,uGAAuG;gBAC7G,OAAO,EAAE,EAAE;gBACX,UAAU,EAAE,CAAC;gBACb,YAAY,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;aAC5D,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;QAC5B,MAAM,MAAM,GAAG,SAAS;aACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;aAC/D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;aAC1B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;aACjC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAClB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO;gBACL,IAAI,EAAE,WAAW,SAAS,CAAC,MAAM,+FAA+F;gBAChI,OAAO,EAAE,EAAE;gBACX,UAAU,EAAE,CAAC;gBACb,YAAY,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;aAC5D,CAAC;QACJ,CAAC;QACD,2DAA2D;QAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,MAAM,WAAW,GAA2B,EAAE,CAAC;QAC/C,KAAK,MAAM,CAAC,IAAI,YAAY;YAAE,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC;QAC3E,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa;YAChC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa;YAChE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;SACtC,CAAC,CAAC,CAAC;QACJ,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC/E,MAAM,YAAY,GAAG,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACnE,0DAA0D;QAC1D,iCAAiC;QACjC,IAAI,CAAC;YACH,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;gBAC/D,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAC5B,YAAY;gBACZ,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;gBAC5C,UAAU;aACX,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;IACpF,CAAC,EACD,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAC9B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAc;IACzC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;IAClD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxB,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC7D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,eAAe,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACjH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}