nodebench-mcp 2.56.0 → 2.58.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.
@@ -0,0 +1,287 @@
1
+ /**
2
+ * contextInjection.ts — Tiered context injection middleware for NodeBench.
3
+ *
4
+ * Ensures message 1000 retains the same intent clarity as message 1.
5
+ *
6
+ * Architecture (Letta/MemGPT-inspired):
7
+ * PINNED (always in context, survives every compaction):
8
+ * - Canonical entity (mission, wedge, state, confidence)
9
+ * - Last packet summary
10
+ * - Active contradictions
11
+ * - Current session actions
12
+ *
13
+ * INJECTED ON DEMAND (retrieved when query is relevant):
14
+ * - Prior weekly reset summary
15
+ * - Relevant tracked milestones
16
+ * - Entity-specific history
17
+ * - Dogfood findings
18
+ *
19
+ * ARCHIVAL (searchable, never in context unless requested):
20
+ * - Full action history
21
+ * - All prior packets
22
+ * - All state diffs
23
+ * - Git log history
24
+ *
25
+ * The middleware reads from SQLite and prepends context before every tool call.
26
+ * Total pinned context budget: ~800 tokens (fits in any model's system prompt).
27
+ */
28
+ import { existsSync, readFileSync } from "fs";
29
+ import { join, resolve, dirname } from "path";
30
+ import { fileURLToPath } from "url";
31
+ import { getDb } from "../db.js";
32
+ const __filename = fileURLToPath(import.meta.url);
33
+ const __dirname = dirname(__filename);
34
+ /* ─── Helpers ────────────────────────────────────────────────────────────── */
35
+ function findProjectRoot() {
36
+ let dir = resolve(__dirname, "..", "..");
37
+ for (let i = 0; i < 5; i++) {
38
+ if (existsSync(join(dir, "CLAUDE.md")))
39
+ return dir;
40
+ dir = resolve(dir, "..");
41
+ }
42
+ return process.cwd();
43
+ }
44
+ function safeRead(path) {
45
+ try {
46
+ return existsSync(path) ? readFileSync(path, "utf-8") : null;
47
+ }
48
+ catch {
49
+ return null;
50
+ }
51
+ }
52
+ /* ─── Build Pinned Context ───────────────────────────────────────────────── */
53
+ function buildPinnedContext() {
54
+ const root = findProjectRoot();
55
+ // Parse CLAUDE.md for canonical identity
56
+ const claudeMd = safeRead(join(root, "CLAUDE.md"));
57
+ let canonicalMission = "Unknown";
58
+ let wedge = "Unknown";
59
+ if (claudeMd) {
60
+ const overviewMatch = claudeMd.match(/NodeBench\s*[—–-]\s*(.+?)(?:\.\s|$)/m);
61
+ if (overviewMatch)
62
+ canonicalMission = overviewMatch[1].trim();
63
+ const toolMatch = claudeMd.match(/(\d+)-tool/);
64
+ if (toolMatch)
65
+ wedge = `${toolMatch[1]}-tool MCP server with entity intelligence`;
66
+ }
67
+ // Query SQLite for session data
68
+ let sessionActionCount = 0;
69
+ let recentActions = [];
70
+ let lastPacketSummary = null;
71
+ let lastPacketTimestamp = null;
72
+ let activeContradictions = [];
73
+ try {
74
+ const db = getDb();
75
+ const sevenDaysAgo = new Date(Date.now() - 7 * 86_400_000).toISOString().slice(0, 10);
76
+ // Recent actions
77
+ const actions = db.prepare(`SELECT action, timestamp FROM tracking_actions WHERE date(timestamp) >= ? ORDER BY timestamp DESC LIMIT 3`).all(sevenDaysAgo);
78
+ recentActions = actions.map((a) => a.action);
79
+ sessionActionCount = db.prepare(`SELECT COUNT(*) as c FROM tracking_actions WHERE date(timestamp) >= ?`).get(sevenDaysAgo)?.c ?? 0;
80
+ // Last benchmark/packet report
81
+ try {
82
+ const lastReport = db.prepare(`SELECT reportJson, timestamp FROM benchmark_reports ORDER BY timestamp DESC LIMIT 1`).get();
83
+ if (lastReport) {
84
+ const report = JSON.parse(lastReport.reportJson);
85
+ lastPacketSummary = `Last benchmark: ${report.layer} — ${report.totalSessions} sessions, RCA ${Math.round((report.metrics?.rca ?? 0) * 100)}%, maturity ${report.maturityLabel ?? "unknown"}`;
86
+ lastPacketTimestamp = lastReport.timestamp;
87
+ }
88
+ }
89
+ catch { /* table may not exist */ }
90
+ // Check for contradictions in recent milestones
91
+ const contradictions = db.prepare(`SELECT description FROM tracking_milestones WHERE description LIKE '%contradiction%' OR description LIKE '%mismatch%' ORDER BY timestamp DESC LIMIT 3`).all();
92
+ activeContradictions = contradictions.map((c) => c.description);
93
+ }
94
+ catch { /* SQLite not ready */ }
95
+ const estimatedTokens = 150 + recentActions.length * 15 + activeContradictions.length * 20;
96
+ return {
97
+ canonicalMission,
98
+ wedge,
99
+ companyState: "building",
100
+ identityConfidence: activeContradictions.length === 0 ? 85 : Math.max(50, 85 - activeContradictions.length * 10),
101
+ lastPacketSummary,
102
+ lastPacketTimestamp,
103
+ activeContradictions,
104
+ sessionActionCount,
105
+ recentActions,
106
+ estimatedTokens,
107
+ };
108
+ }
109
+ /* ─── Build Injected Context ─────────────────────────────────────────────── */
110
+ function buildInjectedContext(query) {
111
+ let weeklyResetSummary = null;
112
+ let recentMilestones = [];
113
+ let entitySignals = [];
114
+ let dogfoodVerdict = null;
115
+ try {
116
+ const db = getDb();
117
+ const sevenDaysAgo = new Date(Date.now() - 7 * 86_400_000).toISOString().slice(0, 10);
118
+ // Weekly reset from milestones
119
+ const resetMilestone = db.prepare(`SELECT title, description, timestamp FROM tracking_milestones WHERE title LIKE '%weekly%reset%' ORDER BY timestamp DESC LIMIT 1`).get();
120
+ if (resetMilestone) {
121
+ weeklyResetSummary = `${resetMilestone.title} (${resetMilestone.timestamp?.slice(0, 10)}): ${resetMilestone.description?.slice(0, 100)}`;
122
+ }
123
+ // Recent milestones
124
+ const milestones = db.prepare(`SELECT title, timestamp FROM tracking_milestones WHERE date(timestamp) >= ? ORDER BY timestamp DESC LIMIT 5`).all(sevenDaysAgo);
125
+ recentMilestones = milestones.map((m) => ({ title: m.title, timestamp: m.timestamp }));
126
+ // Entity signals (if query mentions specific entities)
127
+ if (query) {
128
+ const entities = ["anthropic", "shopify", "nodebench", "supermemory"];
129
+ const matchedEntity = entities.find(e => query.toLowerCase().includes(e));
130
+ if (matchedEntity) {
131
+ const entityActions = db.prepare(`SELECT action FROM tracking_actions WHERE LOWER(action) LIKE ? ORDER BY timestamp DESC LIMIT 3`).all(`%${matchedEntity}%`);
132
+ entitySignals = entityActions.map((a) => a.action);
133
+ }
134
+ }
135
+ // Dogfood verdict from latest benchmark
136
+ try {
137
+ const bench = db.prepare(`SELECT layer, rca, prr FROM benchmark_reports ORDER BY timestamp DESC LIMIT 1`).get();
138
+ if (bench) {
139
+ dogfoodVerdict = `${bench.layer}: RCA ${Math.round(bench.rca * 100)}%, PRR ${Math.round(bench.prr * 100)}%`;
140
+ }
141
+ }
142
+ catch { /* table may not exist */ }
143
+ }
144
+ catch { /* SQLite not ready */ }
145
+ const estimatedTokens = 50 + recentMilestones.length * 12 + entitySignals.length * 15;
146
+ return { weeklyResetSummary, recentMilestones, entitySignals, dogfoodVerdict, estimatedTokens };
147
+ }
148
+ /* ─── Build Archival Pointers ────────────────────────────────────────────── */
149
+ function buildArchivalPointers() {
150
+ let totalActions = 0;
151
+ let totalMilestones = 0;
152
+ let totalStateDiffs = 0;
153
+ let oldestActionDate = null;
154
+ try {
155
+ const db = getDb();
156
+ totalActions = db.prepare(`SELECT COUNT(*) as c FROM tracking_actions`).get()?.c ?? 0;
157
+ totalMilestones = db.prepare(`SELECT COUNT(*) as c FROM tracking_milestones`).get()?.c ?? 0;
158
+ try {
159
+ totalStateDiffs = db.prepare(`SELECT COUNT(*) as c FROM benchmark_runs`).get()?.c ?? 0;
160
+ }
161
+ catch { /* table may not exist */ }
162
+ const oldest = db.prepare(`SELECT MIN(timestamp) as t FROM tracking_actions`).get();
163
+ oldestActionDate = oldest?.t?.slice(0, 10) ?? null;
164
+ }
165
+ catch { /* SQLite not ready */ }
166
+ return {
167
+ totalActions,
168
+ totalMilestones,
169
+ totalStateDiffs,
170
+ oldestActionDate,
171
+ retrievalTools: ["get_session_journal", "get_weekly_summary", "get_daily_log", "get_monthly_report", "get_benchmark_history"],
172
+ };
173
+ }
174
+ /* ─── Format System Prompt Prefix ────────────────────────────────────────── */
175
+ function formatSystemPromptPrefix(pinned, injected, archival) {
176
+ const lines = [
177
+ `[NODEBENCH CONTEXT — pinned across all messages, survives compaction]`,
178
+ `Identity: ${pinned.canonicalMission}`,
179
+ `Wedge: ${pinned.wedge}`,
180
+ `State: ${pinned.companyState} | Confidence: ${pinned.identityConfidence}%`,
181
+ ];
182
+ if (pinned.lastPacketSummary) {
183
+ lines.push(`Last packet: ${pinned.lastPacketSummary}`);
184
+ }
185
+ if (pinned.activeContradictions.length > 0) {
186
+ lines.push(`Active contradictions (${pinned.activeContradictions.length}): ${pinned.activeContradictions[0]?.slice(0, 80)}`);
187
+ }
188
+ if (pinned.sessionActionCount > 0) {
189
+ lines.push(`Session: ${pinned.sessionActionCount} actions tracked. Recent: ${pinned.recentActions.slice(0, 2).join("; ")}`);
190
+ }
191
+ if (injected.weeklyResetSummary) {
192
+ lines.push(`Weekly reset: ${injected.weeklyResetSummary}`);
193
+ }
194
+ if (injected.recentMilestones.length > 0) {
195
+ lines.push(`Milestones (${injected.recentMilestones.length}): ${injected.recentMilestones.map(m => m.title).join(", ")}`);
196
+ }
197
+ if (injected.dogfoodVerdict) {
198
+ lines.push(`Benchmark: ${injected.dogfoodVerdict}`);
199
+ }
200
+ if (archival.totalActions > 0) {
201
+ lines.push(`Archival: ${archival.totalActions} actions, ${archival.totalMilestones} milestones since ${archival.oldestActionDate ?? "unknown"}. Use ${archival.retrievalTools[0]} to access.`);
202
+ }
203
+ lines.push(`[END NODEBENCH CONTEXT]`);
204
+ return lines.join("\n");
205
+ }
206
+ /* ─── Public API ─────────────────────────────────────────────────────────── */
207
+ /**
208
+ * Build the full context bundle for injection into prompts/tools.
209
+ * Call this before dispatching any search query or MCP tool call.
210
+ */
211
+ export function buildContextBundle(query) {
212
+ const pinned = buildPinnedContext();
213
+ const injected = buildInjectedContext(query);
214
+ const archival = buildArchivalPointers();
215
+ const systemPromptPrefix = formatSystemPromptPrefix(pinned, injected, archival);
216
+ const totalEstimatedTokens = pinned.estimatedTokens + injected.estimatedTokens + 50;
217
+ return { pinned, injected, archival, systemPromptPrefix, totalEstimatedTokens };
218
+ }
219
+ /* ─── MCP Tools ──────────────────────────────────────────────────────────── */
220
+ export const contextInjectionTools = [
221
+ {
222
+ name: "get_context_bundle",
223
+ description: "Returns the full NodeBench context bundle: pinned identity (mission, wedge, confidence), " +
224
+ "last packet summary, active contradictions, recent actions, milestones, dogfood status, " +
225
+ "and archival pointers. Call this at the start of any session or before generating a packet " +
226
+ "to ensure continuity across messages. This is what makes message 1000 as good as message 1.",
227
+ inputSchema: {
228
+ type: "object",
229
+ properties: {
230
+ query: {
231
+ type: "string",
232
+ description: "Optional current query — enables entity-specific signal injection",
233
+ },
234
+ },
235
+ },
236
+ annotations: { readOnlyHint: true },
237
+ handler: async (args) => {
238
+ const bundle = buildContextBundle(args.query);
239
+ return {
240
+ systemPromptPrefix: bundle.systemPromptPrefix,
241
+ pinned: {
242
+ mission: bundle.pinned.canonicalMission,
243
+ wedge: bundle.pinned.wedge,
244
+ confidence: `${bundle.pinned.identityConfidence}%`,
245
+ lastPacket: bundle.pinned.lastPacketSummary,
246
+ contradictions: bundle.pinned.activeContradictions.length,
247
+ sessionActions: bundle.pinned.sessionActionCount,
248
+ recentActions: bundle.pinned.recentActions,
249
+ },
250
+ injected: {
251
+ weeklyReset: bundle.injected.weeklyResetSummary,
252
+ milestones: bundle.injected.recentMilestones.length,
253
+ entitySignals: bundle.injected.entitySignals.length,
254
+ dogfood: bundle.injected.dogfoodVerdict,
255
+ },
256
+ archival: bundle.archival,
257
+ tokenBudget: `~${bundle.totalEstimatedTokens} tokens`,
258
+ };
259
+ },
260
+ },
261
+ {
262
+ name: "inject_context_into_prompt",
263
+ description: "Wraps a user prompt with NodeBench's persistent context (identity, last packet, contradictions, " +
264
+ "session state). Use this to ensure any downstream LLM call has full continuity even after " +
265
+ "context window compaction. Returns the enriched prompt ready for dispatch.",
266
+ inputSchema: {
267
+ type: "object",
268
+ properties: {
269
+ prompt: { type: "string", description: "The user's raw prompt to enrich" },
270
+ },
271
+ required: ["prompt"],
272
+ },
273
+ annotations: { readOnlyHint: true },
274
+ handler: async (args) => {
275
+ const bundle = buildContextBundle(args.prompt);
276
+ const enrichedPrompt = `${bundle.systemPromptPrefix}\n\n---\n\nUser query: ${args.prompt}`;
277
+ return {
278
+ enrichedPrompt,
279
+ contextTokens: bundle.totalEstimatedTokens,
280
+ pinnedIdentity: bundle.pinned.canonicalMission,
281
+ contradictions: bundle.pinned.activeContradictions.length,
282
+ sessionActions: bundle.pinned.sessionActionCount,
283
+ };
284
+ },
285
+ },
286
+ ];
287
+ //# sourceMappingURL=contextInjection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextInjection.js","sourceRoot":"","sources":["../../src/tools/contextInjection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAGjC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAqDtC,gFAAgF;AAEhF,SAAS,eAAe;IACtB,IAAI,GAAG,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QACnD,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;AACvB,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC;QAAC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AAC9F,CAAC;AAED,gFAAgF;AAEhF,SAAS,kBAAkB;IACzB,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAE/B,yCAAyC;IACzC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IACnD,IAAI,gBAAgB,GAAG,SAAS,CAAC;IACjC,IAAI,KAAK,GAAG,SAAS,CAAC;IACtB,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC7E,IAAI,aAAa;YAAE,gBAAgB,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9D,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC/C,IAAI,SAAS;YAAE,KAAK,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,2CAA2C,CAAC;IACpF,CAAC;IAED,gCAAgC;IAChC,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAC3B,IAAI,aAAa,GAAa,EAAE,CAAC;IACjC,IAAI,iBAAiB,GAAkB,IAAI,CAAC;IAC5C,IAAI,mBAAmB,GAAkB,IAAI,CAAC;IAC9C,IAAI,oBAAoB,GAAa,EAAE,CAAC;IAExC,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAEtF,iBAAiB;QACjB,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CACxB,2GAA2G,CAC5G,CAAC,GAAG,CAAC,YAAY,CAAU,CAAC;QAC7B,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAClD,kBAAkB,GAAI,EAAE,CAAC,OAAO,CAC9B,uEAAuE,CACxE,CAAC,GAAG,CAAC,YAAY,CAAS,EAAE,CAAC,IAAI,CAAC,CAAC;QAEpC,+BAA+B;QAC/B,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAC3B,qFAAqF,CACtF,CAAC,GAAG,EAAS,CAAC;YACf,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;gBACjD,iBAAiB,GAAG,mBAAmB,MAAM,CAAC,KAAK,MAAM,MAAM,CAAC,aAAa,kBAAkB,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,eAAe,MAAM,CAAC,aAAa,IAAI,SAAS,EAAE,CAAC;gBAC9L,mBAAmB,GAAG,UAAU,CAAC,SAAS,CAAC;YAC7C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,yBAAyB,CAAC,CAAC;QAErC,gDAAgD;QAChD,MAAM,cAAc,GAAG,EAAE,CAAC,OAAO,CAC/B,uJAAuJ,CACxJ,CAAC,GAAG,EAAW,CAAC;QACjB,oBAAoB,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAEvE,CAAC;IAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC;IAElC,MAAM,eAAe,GAAG,GAAG,GAAG,aAAa,CAAC,MAAM,GAAG,EAAE,GAAG,oBAAoB,CAAC,MAAM,GAAG,EAAE,CAAC;IAE3F,OAAO;QACL,gBAAgB;QAChB,KAAK;QACL,YAAY,EAAE,UAAU;QACxB,kBAAkB,EAAE,oBAAoB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,oBAAoB,CAAC,MAAM,GAAG,EAAE,CAAC;QAChH,iBAAiB;QACjB,mBAAmB;QACnB,oBAAoB;QACpB,kBAAkB;QAClB,aAAa;QACb,eAAe;KAChB,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,kBAAkB,GAAkB,IAAI,CAAC;IAC7C,IAAI,gBAAgB,GAAgD,EAAE,CAAC;IACvE,IAAI,aAAa,GAAa,EAAE,CAAC;IACjC,IAAI,cAAc,GAAkB,IAAI,CAAC;IAEzC,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAEtF,+BAA+B;QAC/B,MAAM,cAAc,GAAG,EAAE,CAAC,OAAO,CAC/B,iIAAiI,CAClI,CAAC,GAAG,EAAS,CAAC;QACf,IAAI,cAAc,EAAE,CAAC;YACnB,kBAAkB,GAAG,GAAG,cAAc,CAAC,KAAK,KAAK,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QAC3I,CAAC;QAED,oBAAoB;QACpB,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAC3B,6GAA6G,CAC9G,CAAC,GAAG,CAAC,YAAY,CAAU,CAAC;QAC7B,gBAAgB,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAE5F,uDAAuD;QACvD,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,QAAQ,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;YACtE,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1E,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,aAAa,GAAG,EAAE,CAAC,OAAO,CAC9B,gGAAgG,CACjG,CAAC,GAAG,CAAC,IAAI,aAAa,GAAG,CAAU,CAAC;gBACrC,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,wCAAwC;QACxC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CACtB,+EAA+E,CAChF,CAAC,GAAG,EAAS,CAAC;YACf,IAAI,KAAK,EAAE,CAAC;gBACV,cAAc,GAAG,GAAG,KAAK,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;YAC9G,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,yBAAyB,CAAC,CAAC;IAEvC,CAAC;IAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC;IAElC,MAAM,eAAe,GAAG,EAAE,GAAG,gBAAgB,CAAC,MAAM,GAAG,EAAE,GAAG,aAAa,CAAC,MAAM,GAAG,EAAE,CAAC;IAEtF,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC;AAClG,CAAC;AAED,gFAAgF;AAEhF,SAAS,qBAAqB;IAC5B,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,gBAAgB,GAAkB,IAAI,CAAC;IAE3C,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,YAAY,GAAI,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC,GAAG,EAAU,EAAE,CAAC,IAAI,CAAC,CAAC;QAC/F,eAAe,GAAI,EAAE,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC,GAAG,EAAU,EAAE,CAAC,IAAI,CAAC,CAAC;QACrG,IAAI,CAAC;YACH,eAAe,GAAI,EAAE,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC,GAAG,EAAU,EAAE,CAAC,IAAI,CAAC,CAAC;QAClG,CAAC;QAAC,MAAM,CAAC,CAAC,yBAAyB,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,kDAAkD,CAAC,CAAC,GAAG,EAAS,CAAC;QAC3F,gBAAgB,GAAG,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC;IAElC,OAAO;QACL,YAAY;QACZ,eAAe;QACf,eAAe;QACf,gBAAgB;QAChB,cAAc,EAAE,CAAC,qBAAqB,EAAE,oBAAoB,EAAE,eAAe,EAAE,oBAAoB,EAAE,uBAAuB,CAAC;KAC9H,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF,SAAS,wBAAwB,CAAC,MAAqB,EAAE,QAAyB,EAAE,QAAyB;IAC3G,MAAM,KAAK,GAAa;QACtB,uEAAuE;QACvE,aAAa,MAAM,CAAC,gBAAgB,EAAE;QACtC,UAAU,MAAM,CAAC,KAAK,EAAE;QACxB,UAAU,MAAM,CAAC,YAAY,kBAAkB,MAAM,CAAC,kBAAkB,GAAG;KAC5E,CAAC;IAEF,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,MAAM,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,0BAA0B,MAAM,CAAC,oBAAoB,CAAC,MAAM,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/H,CAAC;IAED,IAAI,MAAM,CAAC,kBAAkB,GAAG,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,kBAAkB,6BAA6B,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9H,CAAC;IAED,IAAI,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,iBAAiB,QAAQ,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,QAAQ,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,eAAe,QAAQ,CAAC,gBAAgB,CAAC,MAAM,MAAM,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5H,CAAC;IAED,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,cAAc,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,QAAQ,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,YAAY,aAAa,QAAQ,CAAC,eAAe,qBAAqB,QAAQ,CAAC,gBAAgB,IAAI,SAAS,SAAS,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IACjM,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;IACzC,MAAM,kBAAkB,GAAG,wBAAwB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChF,MAAM,oBAAoB,GAAG,MAAM,CAAC,eAAe,GAAG,QAAQ,CAAC,eAAe,GAAG,EAAE,CAAC;IAEpF,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,CAAC;AAClF,CAAC;AAED,gFAAgF;AAEhF,MAAM,CAAC,MAAM,qBAAqB,GAAc;IAC9C;QACE,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EACT,2FAA2F;YAC3F,0FAA0F;YAC1F,6FAA6F;YAC7F,6FAA6F;QAC/F,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,mEAAmE;iBACjF;aACF;SACF;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;QACnC,OAAO,EAAE,KAAK,EAAE,IAAwB,EAAE,EAAE;YAC1C,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9C,OAAO;gBACL,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;gBAC7C,MAAM,EAAE;oBACN,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB;oBACvC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK;oBAC1B,UAAU,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,kBAAkB,GAAG;oBAClD,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,iBAAiB;oBAC3C,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM;oBACzD,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,kBAAkB;oBAChD,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa;iBAC3C;gBACD,QAAQ,EAAE;oBACR,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,kBAAkB;oBAC/C,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,MAAM;oBACnD,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM;oBACnD,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,cAAc;iBACxC;gBACD,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,WAAW,EAAE,IAAI,MAAM,CAAC,oBAAoB,SAAS;aACtD,CAAC;QACJ,CAAC;KACF;IAED;QACE,IAAI,EAAE,4BAA4B;QAClC,WAAW,EACT,kGAAkG;YAClG,4FAA4F;YAC5F,4EAA4E;QAC9E,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iCAAiC,EAAE;aAC3E;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;SACrB;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;QACnC,OAAO,EAAE,KAAK,EAAE,IAAwB,EAAE,EAAE;YAC1C,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/C,MAAM,cAAc,GAAG,GAAG,MAAM,CAAC,kBAAkB,0BAA0B,IAAI,CAAC,MAAM,EAAE,CAAC;YAC3F,OAAO;gBACL,cAAc;gBACd,aAAa,EAAE,MAAM,CAAC,oBAAoB;gBAC1C,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB;gBAC9C,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM;gBACzD,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,kBAAkB;aACjD,CAAC;QACJ,CAAC;KACF;CACF,CAAC"}