nodebench-mcp 2.65.0 → 2.67.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/benchmarks/claudeCodeIntegration.d.ts +12 -0
- package/dist/benchmarks/claudeCodeIntegration.js +382 -0
- package/dist/benchmarks/claudeCodeIntegration.js.map +1 -0
- package/dist/benchmarks/investorDemo.d.ts +18 -0
- package/dist/benchmarks/investorDemo.js +397 -0
- package/dist/benchmarks/investorDemo.js.map +1 -0
- package/dist/benchmarks/llmJudgeEval.d.ts +3 -0
- package/dist/benchmarks/llmJudgeEval.js +232 -15
- package/dist/benchmarks/llmJudgeEval.js.map +1 -1
- package/dist/benchmarks/searchQualityEval.js +10 -10
- package/dist/benchmarks/searchQualityEval.js.map +1 -1
- package/dist/tools/causalMemoryTools.js +11 -0
- package/dist/tools/causalMemoryTools.js.map +1 -1
- package/dist/tools/progressiveDiscoveryTools.d.ts +2 -1
- package/dist/tools/progressiveDiscoveryTools.js +202 -2
- package/dist/tools/progressiveDiscoveryTools.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* claudeCodeIntegration.ts — Real MCP stdio integration test for NodeBench.
|
|
3
|
+
*
|
|
4
|
+
* Tests NodeBench MCP exactly as Claude Code uses it: spawns the server as a
|
|
5
|
+
* child process and communicates via JSON-RPC over stdio (line-delimited JSON).
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* npx tsx src/benchmarks/claudeCodeIntegration.ts
|
|
9
|
+
*
|
|
10
|
+
* Requires: `npm run build` first (spawns dist/index.js).
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* claudeCodeIntegration.ts — Real MCP stdio integration test for NodeBench.
|
|
3
|
+
*
|
|
4
|
+
* Tests NodeBench MCP exactly as Claude Code uses it: spawns the server as a
|
|
5
|
+
* child process and communicates via JSON-RPC over stdio (line-delimited JSON).
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* npx tsx src/benchmarks/claudeCodeIntegration.ts
|
|
9
|
+
*
|
|
10
|
+
* Requires: `npm run build` first (spawns dist/index.js).
|
|
11
|
+
*/
|
|
12
|
+
import { spawn } from "node:child_process";
|
|
13
|
+
import { join, dirname } from "node:path";
|
|
14
|
+
import { readFileSync } from "node:fs";
|
|
15
|
+
import { fileURLToPath } from "node:url";
|
|
16
|
+
import { createInterface } from "node:readline";
|
|
17
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
18
|
+
const __dirname = dirname(__filename);
|
|
19
|
+
/* ═══════════════════════════════════════════════════════════════════════════ */
|
|
20
|
+
/* Environment */
|
|
21
|
+
/* ═══════════════════════════════════════════════════════════════════════════ */
|
|
22
|
+
function loadEnv() {
|
|
23
|
+
if (process.env.GEMINI_API_KEY)
|
|
24
|
+
return;
|
|
25
|
+
const paths = [".env.local", "../.env.local", "../../.env.local"];
|
|
26
|
+
for (const p of paths) {
|
|
27
|
+
try {
|
|
28
|
+
const content = readFileSync(join(process.cwd(), p), "utf-8");
|
|
29
|
+
for (const line of content.split("\n")) {
|
|
30
|
+
const match = line.match(/^(GEMINI_API_KEY)\s*=\s*(.+)$/);
|
|
31
|
+
if (match) {
|
|
32
|
+
process.env[match[1]] = match[2].trim();
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
/* skip missing files */
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
loadEnv();
|
|
43
|
+
class McpStdioClient {
|
|
44
|
+
proc;
|
|
45
|
+
nextId = 1;
|
|
46
|
+
pending = new Map();
|
|
47
|
+
rl;
|
|
48
|
+
ready;
|
|
49
|
+
constructor(serverPath, args) {
|
|
50
|
+
// __dirname = src/benchmarks/ -> go up two levels to package root
|
|
51
|
+
const pkgDir = join(__dirname, "..", "..");
|
|
52
|
+
const resolvedServer = join(pkgDir, serverPath);
|
|
53
|
+
this.proc = spawn("node", [resolvedServer, ...args], {
|
|
54
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
55
|
+
env: { ...process.env, NODE_NO_WARNINGS: "1" },
|
|
56
|
+
cwd: pkgDir,
|
|
57
|
+
});
|
|
58
|
+
// Capture stderr for debugging but don't block
|
|
59
|
+
this.proc.stderr?.on("data", (chunk) => {
|
|
60
|
+
const text = chunk.toString().trim();
|
|
61
|
+
if (text && process.env.DEBUG_MCP) {
|
|
62
|
+
process.stderr.write(` [server stderr] ${text}\n`);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
// Read line-delimited JSON from stdout
|
|
66
|
+
this.rl = createInterface({ input: this.proc.stdout, crlfDelay: Infinity });
|
|
67
|
+
this.rl.on("line", (line) => {
|
|
68
|
+
const trimmed = line.trim();
|
|
69
|
+
if (!trimmed || !trimmed.startsWith("{"))
|
|
70
|
+
return; // skip non-JSON lines
|
|
71
|
+
try {
|
|
72
|
+
const msg = JSON.parse(trimmed);
|
|
73
|
+
if (msg.id != null && this.pending.has(msg.id)) {
|
|
74
|
+
const entry = this.pending.get(msg.id);
|
|
75
|
+
clearTimeout(entry.timer);
|
|
76
|
+
this.pending.delete(msg.id);
|
|
77
|
+
entry.resolve(msg);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// not JSON — ignore (log lines, etc.)
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
// Wait for the process to be writable
|
|
85
|
+
this.ready = new Promise((resolve) => {
|
|
86
|
+
if (this.proc.stdin?.writable) {
|
|
87
|
+
resolve();
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
this.proc.stdin?.once("ready", resolve);
|
|
91
|
+
// fallback: resolve after a short delay
|
|
92
|
+
setTimeout(resolve, 500);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/** Send a JSON-RPC request and wait for the matching response. */
|
|
97
|
+
async request(method, params, timeoutMs = 30_000) {
|
|
98
|
+
await this.ready;
|
|
99
|
+
const id = this.nextId++;
|
|
100
|
+
const msg = { jsonrpc: "2.0", id, method, params };
|
|
101
|
+
const line = JSON.stringify(msg) + "\n";
|
|
102
|
+
return new Promise((resolve, reject) => {
|
|
103
|
+
const timer = setTimeout(() => {
|
|
104
|
+
this.pending.delete(id);
|
|
105
|
+
reject(new Error(`Timeout after ${timeoutMs}ms for ${method} (id=${id})`));
|
|
106
|
+
}, timeoutMs);
|
|
107
|
+
this.pending.set(id, { resolve, reject, timer });
|
|
108
|
+
this.proc.stdin.write(line);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
/** Send a JSON-RPC notification (no id, no response expected). */
|
|
112
|
+
async notify(method, params) {
|
|
113
|
+
await this.ready;
|
|
114
|
+
const msg = { jsonrpc: "2.0", method, params };
|
|
115
|
+
const line = JSON.stringify(msg) + "\n";
|
|
116
|
+
this.proc.stdin.write(line);
|
|
117
|
+
// Give the server a moment to process
|
|
118
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
119
|
+
}
|
|
120
|
+
/** Call an MCP tool via tools/call. */
|
|
121
|
+
async callTool(name, args = {}, timeoutMs = 30_000) {
|
|
122
|
+
return this.request("tools/call", { name, arguments: args }, timeoutMs);
|
|
123
|
+
}
|
|
124
|
+
/** Shut down the child process. */
|
|
125
|
+
async close() {
|
|
126
|
+
for (const [, entry] of this.pending) {
|
|
127
|
+
clearTimeout(entry.timer);
|
|
128
|
+
entry.reject(new Error("Client closing"));
|
|
129
|
+
}
|
|
130
|
+
this.pending.clear();
|
|
131
|
+
this.rl.close();
|
|
132
|
+
this.proc.stdin?.end();
|
|
133
|
+
this.proc.kill("SIGTERM");
|
|
134
|
+
// Wait for exit
|
|
135
|
+
await new Promise((resolve) => {
|
|
136
|
+
const t = setTimeout(() => {
|
|
137
|
+
this.proc.kill("SIGKILL");
|
|
138
|
+
resolve();
|
|
139
|
+
}, 5_000);
|
|
140
|
+
this.proc.once("exit", () => {
|
|
141
|
+
clearTimeout(t);
|
|
142
|
+
resolve();
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
const results = [];
|
|
148
|
+
async function runTest(name, fn) {
|
|
149
|
+
const t0 = Date.now();
|
|
150
|
+
try {
|
|
151
|
+
const { passed, detail } = await fn();
|
|
152
|
+
results.push({ name, passed, durationMs: Date.now() - t0, detail });
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
results.push({
|
|
156
|
+
name,
|
|
157
|
+
passed: false,
|
|
158
|
+
durationMs: Date.now() - t0,
|
|
159
|
+
error: err instanceof Error ? err.message : String(err),
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/* ═══════════════════════════════════════════════════════════════════════════ */
|
|
164
|
+
/* Main */
|
|
165
|
+
/* ═══════════════════════════════════════════════════════════════════════════ */
|
|
166
|
+
async function main() {
|
|
167
|
+
console.log("╔══════════════════════════════════════════════════════════════╗");
|
|
168
|
+
console.log("║ NodeBench MCP — Claude Code Integration Tests ║");
|
|
169
|
+
console.log("║ Transport: stdio (JSON-RPC over stdin/stdout) ║");
|
|
170
|
+
console.log("╚══════════════════════════════════════════════════════════════╝\n");
|
|
171
|
+
// Spawn the MCP server
|
|
172
|
+
const client = new McpStdioClient("dist/index.js", [
|
|
173
|
+
"--preset", "starter",
|
|
174
|
+
"--no-toon",
|
|
175
|
+
"--no-embedding",
|
|
176
|
+
]);
|
|
177
|
+
// Allow server to initialize DB, load toolsets
|
|
178
|
+
await new Promise((r) => setTimeout(r, 2_000));
|
|
179
|
+
let initialToolCount = 0;
|
|
180
|
+
/* ── Test 1: Initialize ────────────────────────────────────────────────── */
|
|
181
|
+
await runTest("1. Initialize", async () => {
|
|
182
|
+
const res = await client.request("initialize", {
|
|
183
|
+
protocolVersion: "2024-11-05",
|
|
184
|
+
capabilities: {},
|
|
185
|
+
clientInfo: { name: "claude-code-integration-test", version: "1.0.0" },
|
|
186
|
+
});
|
|
187
|
+
if (res.error) {
|
|
188
|
+
return { passed: false, detail: `Error: ${res.error.message}` };
|
|
189
|
+
}
|
|
190
|
+
const result = res.result;
|
|
191
|
+
const serverInfo = result?.serverInfo;
|
|
192
|
+
const hasServerInfo = !!serverInfo?.name;
|
|
193
|
+
const nameContainsNodebench = serverInfo?.name?.includes("nodebench") ?? false;
|
|
194
|
+
// Send initialized notification
|
|
195
|
+
await client.notify("notifications/initialized");
|
|
196
|
+
return {
|
|
197
|
+
passed: hasServerInfo && nameContainsNodebench,
|
|
198
|
+
detail: `serverInfo.name = "${serverInfo?.name ?? "missing"}"`,
|
|
199
|
+
};
|
|
200
|
+
});
|
|
201
|
+
/* ── Test 2: List Tools ────────────────────────────────────────────────── */
|
|
202
|
+
await runTest("2. List Tools (starter preset)", async () => {
|
|
203
|
+
const res = await client.request("tools/list", {});
|
|
204
|
+
if (res.error) {
|
|
205
|
+
return { passed: false, detail: `Error: ${res.error.message}` };
|
|
206
|
+
}
|
|
207
|
+
const result = res.result;
|
|
208
|
+
const tools = result?.tools;
|
|
209
|
+
if (!Array.isArray(tools)) {
|
|
210
|
+
return { passed: false, detail: "No tools array in response" };
|
|
211
|
+
}
|
|
212
|
+
initialToolCount = tools.length;
|
|
213
|
+
// Starter preset = deep_sim (7) + meta/progressive discovery overhead (~12)
|
|
214
|
+
// Expected: ~19 tools. Allow range 10-30 for flexibility.
|
|
215
|
+
const countOk = tools.length >= 10 && tools.length <= 30;
|
|
216
|
+
// Verify each tool has required fields
|
|
217
|
+
const wellFormed = tools.every((t) => {
|
|
218
|
+
const tool = t;
|
|
219
|
+
return (typeof tool.name === "string" &&
|
|
220
|
+
typeof tool.description === "string" &&
|
|
221
|
+
tool.inputSchema != null);
|
|
222
|
+
});
|
|
223
|
+
return {
|
|
224
|
+
passed: countOk && wellFormed,
|
|
225
|
+
detail: `${tools.length} tools, all well-formed: ${wellFormed}`,
|
|
226
|
+
};
|
|
227
|
+
});
|
|
228
|
+
/* ── Test 3: Progressive Discovery ─────────────────────────────────────── */
|
|
229
|
+
await runTest("3. Progressive Discovery (discover_tools)", async () => {
|
|
230
|
+
const res = await client.callTool("discover_tools", {
|
|
231
|
+
query: "founder weekly reset",
|
|
232
|
+
});
|
|
233
|
+
if (res.error) {
|
|
234
|
+
return { passed: false, detail: `Error: ${res.error.message}` };
|
|
235
|
+
}
|
|
236
|
+
const result = res.result;
|
|
237
|
+
const text = result?.content?.[0]?.text ?? "";
|
|
238
|
+
let parsed;
|
|
239
|
+
try {
|
|
240
|
+
parsed = JSON.parse(text);
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
return { passed: false, detail: `Response is not JSON: ${text.slice(0, 200)}` };
|
|
244
|
+
}
|
|
245
|
+
const matches = parsed.matches;
|
|
246
|
+
const hasMatches = Array.isArray(matches) && matches.length > 0;
|
|
247
|
+
// Check that it suggests loading a toolset
|
|
248
|
+
const suggestsToolset = text.includes("load_toolset") ||
|
|
249
|
+
text.includes("founder") ||
|
|
250
|
+
(parsed._unloadedToolsetHits != null);
|
|
251
|
+
return {
|
|
252
|
+
passed: hasMatches && suggestsToolset,
|
|
253
|
+
detail: `${matches?.length ?? 0} matches, suggests toolset: ${suggestsToolset}`,
|
|
254
|
+
};
|
|
255
|
+
});
|
|
256
|
+
/* ── Test 4: Dynamic Loading (load_toolset) ────────────────────────────── */
|
|
257
|
+
await runTest("4. Dynamic Loading (load_toolset -> founder)", async () => {
|
|
258
|
+
const res = await client.callTool("load_toolset", {
|
|
259
|
+
toolset: "founder",
|
|
260
|
+
});
|
|
261
|
+
if (res.error) {
|
|
262
|
+
return { passed: false, detail: `Error: ${res.error.message}` };
|
|
263
|
+
}
|
|
264
|
+
// Give server time to register new tools and send listChanged notification
|
|
265
|
+
await new Promise((r) => setTimeout(r, 1_500));
|
|
266
|
+
// Re-list tools
|
|
267
|
+
const listRes = await client.request("tools/list", {});
|
|
268
|
+
const listResult = listRes.result;
|
|
269
|
+
const newCount = listResult?.tools?.length ?? 0;
|
|
270
|
+
const increased = newCount > initialToolCount;
|
|
271
|
+
return {
|
|
272
|
+
passed: increased,
|
|
273
|
+
detail: `Before: ${initialToolCount}, after: ${newCount} (delta: +${newCount - initialToolCount})`,
|
|
274
|
+
};
|
|
275
|
+
});
|
|
276
|
+
/* ── Test 5: Tool Execution (founder_local_synthesize) ─────────────────── */
|
|
277
|
+
await runTest("5. Tool Execution (founder_local_synthesize)", async () => {
|
|
278
|
+
const res = await client.callTool("founder_local_synthesize", { query: "What is NodeBench?" }, 30_000);
|
|
279
|
+
if (res.error) {
|
|
280
|
+
return { passed: false, detail: `Error: ${res.error.message}` };
|
|
281
|
+
}
|
|
282
|
+
const result = res.result;
|
|
283
|
+
const text = result?.content?.[0]?.text ?? "";
|
|
284
|
+
if (!text) {
|
|
285
|
+
return { passed: false, detail: "Empty response text" };
|
|
286
|
+
}
|
|
287
|
+
let parsed;
|
|
288
|
+
try {
|
|
289
|
+
parsed = JSON.parse(text);
|
|
290
|
+
}
|
|
291
|
+
catch {
|
|
292
|
+
// Some tools return plain text — that's also acceptable
|
|
293
|
+
return {
|
|
294
|
+
passed: text.length > 20,
|
|
295
|
+
detail: `Plain text response (${text.length} chars)`,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
// Check for structured output (summary, keyFindings, or other expected fields)
|
|
299
|
+
const hasStructure = parsed.summary != null ||
|
|
300
|
+
parsed.keyFindings != null ||
|
|
301
|
+
parsed.packet != null ||
|
|
302
|
+
parsed.synthesis != null ||
|
|
303
|
+
parsed.answer != null;
|
|
304
|
+
const noError = parsed.error == null;
|
|
305
|
+
return {
|
|
306
|
+
passed: noError && (hasStructure || text.length > 50),
|
|
307
|
+
detail: `Structured: ${hasStructure}, keys: [${Object.keys(parsed).slice(0, 5).join(", ")}]`,
|
|
308
|
+
};
|
|
309
|
+
});
|
|
310
|
+
/* ── Test 6: Memory Persistence (record_event + get_event_ledger) ──────── */
|
|
311
|
+
await runTest("6. Memory Persistence (record_event -> get_event_ledger)", async () => {
|
|
312
|
+
const testEntityId = `test-entity-${Date.now()}`;
|
|
313
|
+
const testSummary = `Integration test event at ${new Date().toISOString()}`;
|
|
314
|
+
// Record an event
|
|
315
|
+
const recordRes = await client.callTool("record_event", {
|
|
316
|
+
eventType: "agent_action",
|
|
317
|
+
actorType: "agent",
|
|
318
|
+
entityType: "test",
|
|
319
|
+
entityId: testEntityId,
|
|
320
|
+
summary: testSummary,
|
|
321
|
+
});
|
|
322
|
+
if (recordRes.error) {
|
|
323
|
+
return { passed: false, detail: `record_event error: ${recordRes.error.message}` };
|
|
324
|
+
}
|
|
325
|
+
const recordResult = recordRes.result;
|
|
326
|
+
const recordText = recordResult?.content?.[0]?.text ?? "";
|
|
327
|
+
let recordParsed;
|
|
328
|
+
try {
|
|
329
|
+
recordParsed = JSON.parse(recordText);
|
|
330
|
+
}
|
|
331
|
+
catch {
|
|
332
|
+
return { passed: false, detail: `record_event response not JSON: ${recordText.slice(0, 200)}` };
|
|
333
|
+
}
|
|
334
|
+
const eventId = recordParsed.eventId;
|
|
335
|
+
if (!eventId) {
|
|
336
|
+
return { passed: false, detail: "No eventId in record_event response" };
|
|
337
|
+
}
|
|
338
|
+
// Query the ledger for our event
|
|
339
|
+
const ledgerRes = await client.callTool("get_event_ledger", {
|
|
340
|
+
entityId: testEntityId,
|
|
341
|
+
});
|
|
342
|
+
if (ledgerRes.error) {
|
|
343
|
+
return { passed: false, detail: `get_event_ledger error: ${ledgerRes.error.message}` };
|
|
344
|
+
}
|
|
345
|
+
const ledgerResult = ledgerRes.result;
|
|
346
|
+
const ledgerText = ledgerResult?.content?.[0]?.text ?? "";
|
|
347
|
+
// The event should appear somewhere in the ledger response
|
|
348
|
+
const eventFound = ledgerText.includes(testEntityId) || ledgerText.includes(eventId);
|
|
349
|
+
return {
|
|
350
|
+
passed: eventFound,
|
|
351
|
+
detail: `eventId: ${eventId}, found in ledger: ${eventFound}`,
|
|
352
|
+
};
|
|
353
|
+
});
|
|
354
|
+
/* ── Cleanup ───────────────────────────────────────────────────────────── */
|
|
355
|
+
await client.close();
|
|
356
|
+
/* ── Report ────────────────────────────────────────────────────────────── */
|
|
357
|
+
console.log("\n" + "═".repeat(64));
|
|
358
|
+
console.log(" RESULTS");
|
|
359
|
+
console.log("═".repeat(64));
|
|
360
|
+
for (const r of results) {
|
|
361
|
+
const status = r.passed ? "\x1b[32mPASS\x1b[0m" : "\x1b[31mFAIL\x1b[0m";
|
|
362
|
+
const timing = `${r.durationMs}ms`;
|
|
363
|
+
console.log(` ${status} ${r.name} (${timing})`);
|
|
364
|
+
if (r.detail)
|
|
365
|
+
console.log(` ${r.detail}`);
|
|
366
|
+
if (r.error)
|
|
367
|
+
console.log(` \x1b[31mError: ${r.error}\x1b[0m`);
|
|
368
|
+
}
|
|
369
|
+
const passed = results.filter((r) => r.passed).length;
|
|
370
|
+
const total = results.length;
|
|
371
|
+
const pct = Math.round((passed / total) * 100);
|
|
372
|
+
const color = pct === 100 ? "\x1b[32m" : pct >= 50 ? "\x1b[33m" : "\x1b[31m";
|
|
373
|
+
console.log("\n" + "═".repeat(64));
|
|
374
|
+
console.log(` ${color}${passed}/${total} passed (${pct}%)\x1b[0m`);
|
|
375
|
+
console.log("═".repeat(64) + "\n");
|
|
376
|
+
process.exit(passed === total ? 0 : 1);
|
|
377
|
+
}
|
|
378
|
+
main().catch((err) => {
|
|
379
|
+
console.error("Fatal error:", err);
|
|
380
|
+
process.exit(2);
|
|
381
|
+
});
|
|
382
|
+
//# sourceMappingURL=claudeCodeIntegration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claudeCodeIntegration.js","sourceRoot":"","sources":["../../src/benchmarks/claudeCodeIntegration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAiC,MAAM,eAAe,CAAC;AAE/E,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,iFAAiF;AACjF,gFAAgF;AAChF,iFAAiF;AAEjF,SAAS,OAAO;IACd,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc;QAAE,OAAO;IACvC,MAAM,KAAK,GAAG,CAAC,YAAY,EAAE,eAAe,EAAE,kBAAkB,CAAC,CAAC;IAClE,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC9D,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;gBAC1D,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACxC,OAAO;gBACT,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;AACH,CAAC;AAED,OAAO,EAAE,CAAC;AAoBV,MAAM,cAAc;IACV,IAAI,CAAe;IACnB,MAAM,GAAG,CAAC,CAAC;IACX,OAAO,GAAG,IAAI,GAAG,EAIrB,CAAC;IACG,EAAE,CAAc;IAChB,KAAK,CAAgB;IAE7B,YAAY,UAAkB,EAAE,IAAc;QAC5C,kEAAkE;QAClE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC3C,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAEhD,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,EAAE;YACnD,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE;YAC9C,GAAG,EAAE,MAAM;SACZ,CAAC,CAAC;QAEH,+CAA+C;QAC/C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;YACrC,IAAI,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;gBAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,IAAI,IAAI,CAAC,CAAC;YACtD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,uCAAuC;QACvC,IAAI,CAAC,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,MAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,OAAO,CAAC,sBAAsB;YACxE,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAoB,CAAC;gBACnD,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;oBAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;oBACxC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBAC1B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAC5B,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,sCAAsC;YACxC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,sCAAsC;QACtC,IAAI,CAAC,KAAK,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACzC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC;gBAC9B,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACxC,wCAAwC;gBACxC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,kEAAkE;IAClE,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,MAAgC,EAAE,SAAS,GAAG,MAAM;QAChF,MAAM,IAAI,CAAC,KAAK,CAAC;QACjB,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,GAAG,GAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACnE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QAExC,OAAO,IAAI,OAAO,CAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACxB,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,SAAS,UAAU,MAAM,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;YAC7E,CAAC,EAAE,SAAS,CAAC,CAAC;YAEd,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,IAAI,CAAC,KAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,kEAAkE;IAClE,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,MAAgC;QAC3D,MAAM,IAAI,CAAC,KAAK,CAAC;QACjB,MAAM,GAAG,GAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,KAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,sCAAsC;QACtC,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,uCAAuC;IACvC,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,OAAgC,EAAE,EAAE,SAAS,GAAG,MAAM;QACjF,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;IAC1E,CAAC;IAED,mCAAmC;IACnC,KAAK,CAAC,KAAK;QACT,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACrC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1B,gBAAgB;QAChB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE;gBACxB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC1B,OAAO,EAAE,CAAC;YACZ,CAAC,EAAE,KAAK,CAAC,CAAC;YACV,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;gBAC1B,YAAY,CAAC,CAAC,CAAC,CAAC;gBAChB,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAcD,MAAM,OAAO,GAAiB,EAAE,CAAC;AAEjC,KAAK,UAAU,OAAO,CACpB,IAAY,EACZ,EAAuD;IAEvD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACtE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC;YACX,IAAI;YACJ,MAAM,EAAE,KAAK;YACb,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE;YAC3B,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,iFAAiF;AACjF,gFAAgF;AAChF,iFAAiF;AAEjF,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC;IAElF,uBAAuB;IACvB,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,eAAe,EAAE;QACjD,UAAU,EAAE,SAAS;QACrB,WAAW;QACX,gBAAgB;KACjB,CAAC,CAAC;IAEH,+CAA+C;IAC/C,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAErD,IAAI,gBAAgB,GAAG,CAAC,CAAC;IAEzB,8EAA8E;IAC9E,MAAM,OAAO,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE;YAC7C,eAAe,EAAE,YAAY;YAC7B,YAAY,EAAE,EAAE;YAChB,UAAU,EAAE,EAAE,IAAI,EAAE,8BAA8B,EAAE,OAAO,EAAE,OAAO,EAAE;SACvE,CAAC,CAAC;QAEH,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACd,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAClE,CAAC;QAED,MAAM,MAAM,GAAG,GAAG,CAAC,MAA6C,CAAC;QACjE,MAAM,UAAU,GAAG,MAAM,EAAE,UAA2C,CAAC;QACvE,MAAM,aAAa,GAAG,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC;QACzC,MAAM,qBAAqB,GAAG,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC;QAE/E,gCAAgC;QAChC,MAAM,MAAM,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC;QAEjD,OAAO;YACL,MAAM,EAAE,aAAa,IAAI,qBAAqB;YAC9C,MAAM,EAAE,sBAAsB,UAAU,EAAE,IAAI,IAAI,SAAS,GAAG;SAC/D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,8EAA8E;IAC9E,MAAM,OAAO,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAEnD,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACd,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAClE,CAAC;QAED,MAAM,MAAM,GAAG,GAAG,CAAC,MAA2C,CAAC;QAC/D,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC;QACjE,CAAC;QAED,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC;QAEhC,4EAA4E;QAC5E,0DAA0D;QAC1D,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;QAEzD,uCAAuC;QACvC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE;YAC5C,MAAM,IAAI,GAAG,CAA4B,CAAC;YAC1C,OAAO,CACL,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;gBAC7B,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ;gBACpC,IAAI,CAAC,WAAW,IAAI,IAAI,CACzB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,MAAM,EAAE,OAAO,IAAI,UAAU;YAC7B,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,4BAA4B,UAAU,EAAE;SAChE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,8EAA8E;IAC9E,MAAM,OAAO,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,gBAAgB,EAAE;YAClD,KAAK,EAAE,sBAAsB;SAC9B,CAAC,CAAC;QAEH,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACd,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAClE,CAAC;QAED,MAAM,MAAM,GAAG,GAAG,CAAC,MAA4D,CAAC;QAChF,MAAM,IAAI,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;QAE9C,IAAI,MAA+B,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;QAClF,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAgC,CAAC;QACxD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAEhE,2CAA2C;QAC3C,MAAM,eAAe,GACnB,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC7B,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YACxB,CAAC,MAAM,CAAC,oBAAoB,IAAI,IAAI,CAAC,CAAC;QAExC,OAAO;YACL,MAAM,EAAE,UAAU,IAAI,eAAe;YACrC,MAAM,EAAE,GAAG,OAAO,EAAE,MAAM,IAAI,CAAC,+BAA+B,eAAe,EAAE;SAChF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,8EAA8E;IAC9E,MAAM,OAAO,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE;YAChD,OAAO,EAAE,SAAS;SACnB,CAAC,CAAC;QAEH,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACd,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAClE,CAAC;QAED,2EAA2E;QAC3E,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QAErD,gBAAgB;QAChB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,OAAO,CAAC,MAA2C,CAAC;QACvE,MAAM,QAAQ,GAAG,UAAU,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC;QAEhD,MAAM,SAAS,GAAG,QAAQ,GAAG,gBAAgB,CAAC;QAE9C,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,WAAW,gBAAgB,YAAY,QAAQ,aAAa,QAAQ,GAAG,gBAAgB,GAAG;SACnG,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,8EAA8E;IAC9E,MAAM,OAAO,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,CAC/B,0BAA0B,EAC1B,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAC/B,MAAM,CACP,CAAC;QAEF,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACd,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAClE,CAAC;QAED,MAAM,MAAM,GAAG,GAAG,CAAC,MAA4D,CAAC;QAChF,MAAM,IAAI,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;QAE9C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC;QAC1D,CAAC;QAED,IAAI,MAA+B,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,wDAAwD;YACxD,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE;gBACxB,MAAM,EAAE,wBAAwB,IAAI,CAAC,MAAM,SAAS;aACrD,CAAC;QACJ,CAAC;QAED,+EAA+E;QAC/E,MAAM,YAAY,GAChB,MAAM,CAAC,OAAO,IAAI,IAAI;YACtB,MAAM,CAAC,WAAW,IAAI,IAAI;YAC1B,MAAM,CAAC,MAAM,IAAI,IAAI;YACrB,MAAM,CAAC,SAAS,IAAI,IAAI;YACxB,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC;QACxB,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC;QAErC,OAAO;YACL,MAAM,EAAE,OAAO,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;YACrD,MAAM,EAAE,eAAe,YAAY,YAAY,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;SAC7F,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,8EAA8E;IAC9E,MAAM,OAAO,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,YAAY,GAAG,eAAe,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACjD,MAAM,WAAW,GAAG,6BAA6B,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;QAE5E,kBAAkB;QAClB,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE;YACtD,SAAS,EAAE,cAAc;YACzB,SAAS,EAAE,OAAO;YAClB,UAAU,EAAE,MAAM;YAClB,QAAQ,EAAE,YAAY;YACtB,OAAO,EAAE,WAAW;SACrB,CAAC,CAAC;QAEH,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAuB,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QACrF,CAAC;QAED,MAAM,YAAY,GAAG,SAAS,CAAC,MAA4D,CAAC;QAC5F,MAAM,UAAU,GAAG,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;QAC1D,IAAI,YAAqC,CAAC;QAC1C,IAAI,CAAC;YACH,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,mCAAmC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;QAClG,CAAC;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,OAA6B,CAAC;QAC3D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,qCAAqC,EAAE,CAAC;QAC1E,CAAC;QAED,iCAAiC;QACjC,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,kBAAkB,EAAE;YAC1D,QAAQ,EAAE,YAAY;SACvB,CAAC,CAAC;QAEH,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,2BAA2B,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QACzF,CAAC;QAED,MAAM,YAAY,GAAG,SAAS,CAAC,MAA4D,CAAC;QAC5F,MAAM,UAAU,GAAG,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;QAE1D,2DAA2D;QAC3D,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAErF,OAAO;YACL,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,YAAY,OAAO,sBAAsB,UAAU,EAAE;SAC9D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,8EAA8E;IAC9E,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IAErB,8EAA8E;IAC9E,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,qBAAqB,CAAC;QACxE,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,KAAK,CAAC,CAAC,IAAI,MAAM,MAAM,GAAG,CAAC,CAAC;QACnD,IAAI,CAAC,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IACtD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;IAE7E,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,MAAM,IAAI,KAAK,YAAY,GAAG,WAAW,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IAEnC,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env npx tsx
|
|
2
|
+
/**
|
|
3
|
+
* investorDemo.ts — Self-running investor proof script for NodeBench MCP.
|
|
4
|
+
*
|
|
5
|
+
* Proves the full stack works end-to-end in under 60 seconds:
|
|
6
|
+
* 1. Setup sanity (starter preset, discovery)
|
|
7
|
+
* 2. Progressive discovery (dynamic toolset expansion)
|
|
8
|
+
* 3. Real intelligence (Gemini-synthesized analysis)
|
|
9
|
+
* 4. Memory compounding (compaction-resilient state)
|
|
10
|
+
* 5. Agent compatibility (multi-agent validation)
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* cd packages/mcp-local
|
|
14
|
+
* npx tsx src/benchmarks/investorDemo.ts
|
|
15
|
+
*
|
|
16
|
+
* Env: GEMINI_API_KEY (loads from .env.local if not in environment)
|
|
17
|
+
*/
|
|
18
|
+
export {};
|