@pineforge/codegen-mcp 0.1.2 → 0.4.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/README.md CHANGED
@@ -6,12 +6,16 @@ machine — only the Pine source travels to the API.
6
6
 
7
7
  ## Tools
8
8
 
9
- | name | runs on | quota |
10
- |---|---|---|
11
- | `transpile_pine` | remote API | counts (refunded on compile error) |
12
- | `get_quota` | remote API | free |
13
- | `backtest_pine` | local Docker | counts 1 (the transpile call inside) |
14
- | `pull_engine_image` | local Docker | free |
9
+ | name | runs on | quota | purpose |
10
+ | ---------------------- | -------------------- | ---------------------------------------------- | ------------------------------------------------------------------------ |
11
+ | `transpile_pine` | remote API | counts (refunded on compile error) | Pine v6 → C++ translation unit |
12
+ | `get_quota` | remote API | free | Read current month's quota usage |
13
+ | `list_engine_params` | local (no I/O) | free | Catalog of every `overrides` + `runtime` knob accepted by the backtests |
14
+ | `backtest_pine` | local Docker | counts 1 (the transpile call inside) | Single backtest of a Pine source against an OHLCV CSV |
15
+ | `backtest_pine_grid` | local Docker | counts 1 (transpiled once for the whole sweep) | Cartesian sweep of `inputs` × `overrides` reusing one compile |
16
+ | `fetch_binance_ohlcv` | Binance public API | free | Write a backtest-ready CSV from Binance spot or USDT-perp klines |
17
+ | `binance_symbols` | Binance public API | free | List / filter Binance symbols (5-min in-process cache) |
18
+ | `pull_engine_image` | local Docker | free | Pre-pull the `pineforge-engine` runtime image |
15
19
 
16
20
  ## Install
17
21
 
@@ -30,7 +34,7 @@ Set env vars:
30
34
 
31
35
  ```bash
32
36
  export PINEFORGE_API_KEY="pf_..."
33
- export PINEFORGE_GATEWAY="https://codegen-gateway.luis-fca.workers.dev" # optional
37
+ export PINEFORGE_GATEWAY="https://codegen.pineforge.dev" # optional
34
38
  ```
35
39
 
36
40
  ## Client configuration
@@ -64,27 +68,154 @@ claude mcp add pineforge-codegen \
64
68
 
65
69
  Settings → MCP → New MCP Server → paste the JSON config above.
66
70
 
71
+ ## `list_engine_params` — discover knobs
72
+
73
+ Free, local, zero-I/O catalog of every key accepted by `backtest_pine` /
74
+ `backtest_pine_grid`, split into two groups:
75
+
76
+ - **`strategy_overrides`** — the 9 `strategy(...)` header fields the runtime
77
+ reads via `PINEFORGE_OVERRIDES`: `initial_capital`, `pyramiding`, `slippage`,
78
+ `commission_value`, `commission_type` (`percent` / `cash_per_order` /
79
+ `cash_per_contract`), `default_qty_value`, `default_qty_type` (`fixed` /
80
+ `percent_of_equity` / `cash`), `process_orders_on_close`, `close_entries_rule`
81
+ (`ANY` / `FIFO`).
82
+ - **`runtime_args`** — args to `run_backtest_full` (NOT part of the strategy()
83
+ header): `input_tf`, `script_tf`, `bar_magnifier`, `magnifier_samples`,
84
+ `magnifier_dist` (`uniform` / `cosine` / `triangle` / `endpoints` /
85
+ `front_loaded` / `back_loaded`).
86
+
87
+ Each entry is `{key, type, enum?, description}`. Call this first to learn what
88
+ the engine accepts before composing a `backtest_pine` request.
89
+
67
90
  ## `backtest_pine` example
68
91
 
69
92
  ```jsonc
70
93
  {
71
94
  "source": "//@version=6\nstrategy(\"sma cross\")\n...",
72
- "ohlcv_csv_path": "./btcusdt_15m_7d.csv"
95
+ "ohlcv_csv_path": "./btcusdt_15m_7d.csv",
96
+
97
+ // Optional: override Pine input.*() values without touching the source.
98
+ // Keys = the second arg of input.*(...) (e.g. "Fast Length").
99
+ "inputs": { "Fast Length": 8, "Slow Length": 21 },
100
+
101
+ // Optional: override strategy(...) header fields. Each key is typed —
102
+ // call list_engine_params for the catalog.
103
+ "overrides": {
104
+ "initial_capital": 100000,
105
+ "default_qty_type": "percent_of_equity",
106
+ "default_qty_value": 10,
107
+ "commission_type": "percent",
108
+ "commission_value": 0.04,
109
+ "slippage": 2,
110
+ "pyramiding": 0,
111
+ "process_orders_on_close": true,
112
+ "close_entries_rule": "ANY"
113
+ },
114
+
115
+ // Optional: engine runtime args (NOT strategy() header). Use script_tf
116
+ // to aggregate the input CSV into a coarser strategy timeframe — the
117
+ // engine REJECTS script_tf finer than input_tf with a structured error
118
+ // ({"engine":"pineforge","error":"..."}, exit code 1).
119
+ "runtime": {
120
+ "input_tf": "15",
121
+ "script_tf": "60",
122
+ "bar_magnifier": true,
123
+ "magnifier_samples": 8,
124
+ "magnifier_dist": "endpoints"
125
+ }
73
126
  }
74
127
  ```
75
128
 
129
+ `inputs` is forwarded as the `PINEFORGE_INPUTS` env var to the runtime image,
130
+ `overrides` as `PINEFORGE_OVERRIDES`, and each `runtime` field as a separate
131
+ `PINEFORGE_INPUT_TF` / `PINEFORGE_SCRIPT_TF` / `PINEFORGE_BAR_MAGNIFIER` /
132
+ `PINEFORGE_MAGNIFIER_SAMPLES` / `PINEFORGE_MAGNIFIER_DIST` env var. Empty /
133
+ unset → defaults from `strategy.pine`, with `input_tf` auto-detected from the
134
+ gap between the first two CSV rows.
135
+
76
136
  Returns the same JSON schema as the standalone `pineforge-engine` Docker image:
77
137
 
78
138
  ```jsonc
79
139
  {
80
140
  "engine": "pineforge",
81
141
  "summary": { "total_trades": 49, "net_pnl": -190.85, ... },
142
+ "applied_inputs": { "Fast Length": "8", "Slow Length": "21" },
143
+ "applied_overrides": { "default_qty_value": "5" },
82
144
  "trades": [ ... ],
83
145
  "elapsed_seconds": 0.0042,
84
146
  "_meta": { "strategy_cpp_bytes": 5079, "image": "ghcr.io/.../pineforge-engine:latest" }
85
147
  }
86
148
  ```
87
149
 
150
+ ## `backtest_pine_grid` — parameter sweep
151
+
152
+ Transpiles the Pine source **once** (one quota hit) then runs the same
153
+ compiled binary against the cartesian product of `inputs` × `overrides`.
154
+ Returns a ranked list plus the top entry under `best`.
155
+
156
+ ```jsonc
157
+ {
158
+ "source": "//@version=6\nstrategy(\"macd\")\n...",
159
+ "ohlcv_csv_path": "./btcusdt_15m_7d.csv",
160
+
161
+ // Each axis is {key: list-of-values}. All combinations are tried.
162
+ "inputs": {
163
+ "Fast Length": [8, 12, 19],
164
+ "Slow Length": [21, 26, 39]
165
+ },
166
+ "overrides": {
167
+ "default_qty_value": [1, 5],
168
+ "commission_value": [0.04]
169
+ },
170
+
171
+ // Optional knobs:
172
+ "fixed_inputs": { "Source": "close" }, // applied to every combo
173
+ "fixed_overrides": {}, // typed strategy() overrides
174
+ "runtime": { "input_tf": "15", // engine runtime args, fixed
175
+ "script_tf": "60" }, // across the sweep
176
+ "max_combinations": 64, // hard cap
177
+ "concurrency": 2, // parallel docker runs
178
+ "include_trades": false, // omit per-trade lists
179
+ "sort_by": "net_pnl" // ranking metric
180
+ }
181
+ ```
182
+
183
+ ## `fetch_binance_ohlcv` — pull market data
184
+
185
+ Writes a backtest-ready CSV (header `timestamp,open,high,low,close,volume`,
186
+ timestamp = open time in UNIX ms UTC) from Binance's public endpoints. No
187
+ auth required, no PineForge quota cost. Requests > 1000 bars are paginated
188
+ automatically. Output path is subject to the same cwd scope as
189
+ `ohlcv_csv_path` (relax with `PINEFORGE_ALLOW_ANYWHERE=1`).
190
+
191
+ ```jsonc
192
+ {
193
+ "symbol": "BTCUSDT",
194
+ "interval": "15m", // 1s, 1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 3d, 1w, 1M
195
+ "market": "spot", // or "usdt_perp" for USDT-margined perpetual futures
196
+ "limit": 672, // total bars; > 1000 paginates
197
+ "output_path": "./btcusdt_15m_7d.csv"
198
+ // Optional: "start_time" / "end_time" in UNIX ms UTC.
199
+ }
200
+ ```
201
+
202
+ ## `binance_symbols` — discover / validate symbols
203
+
204
+ Returns the list of symbols available on the Binance public API for OHLCV
205
+ fetching. Cached 5 min in-process. Use this to validate a symbol before
206
+ calling `fetch_binance_ohlcv`.
207
+
208
+ ```jsonc
209
+ {
210
+ "market": "usdt_perp",
211
+ "query": "BTC", // case-insensitive substring match
212
+ "quote_asset": "USDT",
213
+ "status": "TRADING",
214
+ "contract_type": "PERPETUAL", // futures-only filter
215
+ "limit": 50
216
+ }
217
+ ```
218
+
88
219
  ## Filesystem scope
89
220
 
90
221
  By default, OHLCV paths must be inside the current working directory of the MCP
package/dist/index.js CHANGED
@@ -3,9 +3,10 @@
3
3
  * @pineforge/codegen-mcp — local stdio MCP server.
4
4
  *
5
5
  * Bridges an AI agent to the hosted PineForge codegen API (transpile,
6
- * quota) AND to the user's local Docker daemon (backtest runner). Runs
7
- * on the user's machine so OHLCV files never leave it; only the Pine
8
- * source travels to the codegen API.
6
+ * quota), to the user's local Docker daemon (backtest runner + grid
7
+ * sweep), and to Binance public market-data endpoints (OHLCV CSV
8
+ * export, symbol lookup). Runs on the user's machine so OHLCV files
9
+ * never leave it; only the Pine source travels to the codegen API.
9
10
  *
10
11
  * Auth: PINEFORGE_API_KEY env var (required).
11
12
  * Gateway override: PINEFORGE_GATEWAY env var (default: production URL).
@@ -14,15 +15,20 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
14
15
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
15
16
  import { z } from "zod";
16
17
  import { spawn } from "node:child_process";
17
- import { mkdtemp, writeFile, rm, stat, readFile } from "node:fs/promises";
18
+ import { mkdtemp, mkdir, writeFile, rm, stat, readFile } from "node:fs/promises";
18
19
  import { tmpdir } from "node:os";
19
- import { join, resolve, isAbsolute } from "node:path";
20
+ import { join, resolve, isAbsolute, dirname } from "node:path";
21
+ import { VERSION } from "./version.js";
20
22
  // ─── Config ───────────────────────────────────────────────────────────────
21
- const GATEWAY = process.env.PINEFORGE_GATEWAY ?? "https://codegen-gateway.luis-fca.workers.dev";
23
+ const GATEWAY = process.env.PINEFORGE_GATEWAY ?? "https://codegen.pineforge.dev";
22
24
  const API_KEY = process.env.PINEFORGE_API_KEY ?? "";
23
25
  const DEFAULT_IMAGE = "ghcr.io/fullpass-4pass/pineforge-engine:latest";
24
26
  const ALLOW_ANYWHERE = process.env.PINEFORGE_ALLOW_ANYWHERE === "1";
25
27
  const DOCKER_TIMEOUT_MS = Number(process.env.PINEFORGE_DOCKER_TIMEOUT_MS ?? 120_000);
28
+ const BINANCE_SPOT_BASE = "https://api.binance.com";
29
+ const BINANCE_FAPI_BASE = "https://fapi.binance.com";
30
+ const BINANCE_KLINES_LIMIT = 1000;
31
+ const BINANCE_PAGE_DELAY_MS = 200;
26
32
  if (!API_KEY) {
27
33
  console.error("[pineforge-mcp] PINEFORGE_API_KEY env var is required");
28
34
  process.exit(2);
@@ -57,31 +63,96 @@ async function callGetQuota() {
57
63
  async function runBacktest(args) {
58
64
  const csvPath = await resolveCsvPath(args.ohlcv_csv_path);
59
65
  const image = args.image ?? DEFAULT_IMAGE;
60
- // 1. transpile via remote API
61
66
  const { cpp } = await callTranspile(args.source);
62
- // 2. write strategy.cpp into a tmp dir, mount that + the user's CSV
63
67
  const tmp = await mkdtemp(join(tmpdir(), "pineforge-bt-"));
64
68
  const cppPath = join(tmp, "strategy.cpp");
65
69
  await writeFile(cppPath, cpp, "utf8");
66
70
  try {
67
- const { stdout, stderr, code } = await dockerRun(image, cppPath, csvPath);
68
- if (code !== 0) {
69
- throw new Error(`docker exited ${code}\n` +
70
- `stderr (last 2KB):\n${stderr.slice(-2048)}`);
71
- }
72
- let report;
73
- try {
74
- report = JSON.parse(stdout);
75
- }
76
- catch {
77
- throw new Error(`backtest produced non-JSON output (first 500B):\n${stdout.slice(0, 500)}`);
78
- }
71
+ const report = await dockerBacktest({
72
+ image,
73
+ cppPath,
74
+ csvPath,
75
+ inputs: args.inputs,
76
+ overrides: args.overrides,
77
+ runtime: args.runtime,
78
+ });
79
79
  return { ...report, _meta: { strategy_cpp_bytes: cpp.length, image } };
80
80
  }
81
81
  finally {
82
82
  rm(tmp, { recursive: true, force: true }).catch(() => undefined);
83
83
  }
84
84
  }
85
+ async function runBacktestGrid(args) {
86
+ const csvPath = await resolveCsvPath(args.ohlcv_csv_path);
87
+ const image = args.image ?? DEFAULT_IMAGE;
88
+ const includeTrades = args.include_trades === true;
89
+ const sortBy = args.sort_by ?? "net_pnl";
90
+ const maxCombos = args.max_combinations ?? 64;
91
+ const concurrency = Math.max(1, Math.min(args.concurrency ?? 1, 8));
92
+ const combos = buildCombinations(args.inputs, args.overrides, args.fixed_inputs, args.fixed_overrides);
93
+ if (combos.length === 0) {
94
+ throw new Error("no parameter combinations produced — provide at least one inputs/overrides axis");
95
+ }
96
+ if (combos.length > maxCombos) {
97
+ throw new Error(`${combos.length} combinations exceeds max_combinations=${maxCombos}. ` +
98
+ `Either reduce the grid or raise max_combinations.`);
99
+ }
100
+ const { cpp } = await callTranspile(args.source);
101
+ const tmp = await mkdtemp(join(tmpdir(), "pineforge-grid-"));
102
+ const cppPath = join(tmp, "strategy.cpp");
103
+ await writeFile(cppPath, cpp, "utf8");
104
+ try {
105
+ const rows = await pMap(combos, concurrency, async (combo) => {
106
+ try {
107
+ const report = await dockerBacktest({
108
+ image, cppPath, csvPath,
109
+ inputs: combo.inputs, overrides: combo.overrides,
110
+ runtime: args.runtime,
111
+ });
112
+ return {
113
+ ok: true,
114
+ inputs: combo.inputs,
115
+ overrides: combo.overrides,
116
+ summary: report.summary,
117
+ applied_inputs: report.applied_inputs,
118
+ applied_overrides: report.applied_overrides,
119
+ elapsed_seconds: report.elapsed_seconds,
120
+ ...(includeTrades ? { trades: report.trades } : {}),
121
+ };
122
+ }
123
+ catch (e) {
124
+ return {
125
+ ok: false,
126
+ inputs: combo.inputs,
127
+ overrides: combo.overrides,
128
+ error: e instanceof Error ? e.message : String(e),
129
+ };
130
+ }
131
+ });
132
+ const succeeded = rows.filter(r => r.ok);
133
+ const failed = rows.filter(r => !r.ok);
134
+ const sortValue = (r) => {
135
+ if (!r.ok || !r.summary)
136
+ return -Infinity;
137
+ const v = r.summary[sortBy];
138
+ return typeof v === "number" ? v : -Infinity;
139
+ };
140
+ succeeded.sort((a, b) => sortValue(b) - sortValue(a));
141
+ return {
142
+ total_combinations: combos.length,
143
+ succeeded: succeeded.length,
144
+ failed: failed.length,
145
+ sort_by: sortBy,
146
+ image,
147
+ _meta: { strategy_cpp_bytes: cpp.length, concurrency },
148
+ best: succeeded[0] ?? null,
149
+ results: [...succeeded, ...failed],
150
+ };
151
+ }
152
+ finally {
153
+ rm(tmp, { recursive: true, force: true }).catch(() => undefined);
154
+ }
155
+ }
85
156
  async function pullImage(image) {
86
157
  const child = spawn("docker", ["pull", image], { stdio: ["ignore", "pipe", "pipe"] });
87
158
  const { stdout, stderr, code } = await collectChild(child, DOCKER_TIMEOUT_MS);
@@ -89,17 +160,73 @@ async function pullImage(image) {
89
160
  throw new Error(`docker pull failed (${code}): ${stderr.slice(-1024)}`);
90
161
  return { image, pulled: true, output: (stdout + stderr).trim().slice(-2048) };
91
162
  }
92
- // ─── Helpers ──────────────────────────────────────────────────────────────
93
- async function resolveCsvPath(p) {
163
+ // ─── Param-grid helpers ───────────────────────────────────────────────────
164
+ function stringifyParams(p) {
165
+ if (!p)
166
+ return {};
167
+ const out = {};
168
+ for (const [k, v] of Object.entries(p))
169
+ out[k] = String(v);
170
+ return out;
171
+ }
172
+ function cartesianProduct(grid) {
173
+ const keys = Object.keys(grid);
174
+ if (keys.length === 0)
175
+ return [{}];
176
+ let acc = [{}];
177
+ for (const k of keys) {
178
+ const values = grid[k] ?? [];
179
+ const next = [];
180
+ for (const partial of acc) {
181
+ for (const v of values) {
182
+ next.push({ ...partial, [k]: String(v) });
183
+ }
184
+ }
185
+ acc = next;
186
+ }
187
+ return acc;
188
+ }
189
+ function buildCombinations(inputsGrid, overridesGrid, fixedInputs, fixedOverrides) {
190
+ const inputCombos = cartesianProduct(inputsGrid ?? {});
191
+ const overrideCombos = cartesianProduct(overridesGrid ?? {});
192
+ const fixIn = stringifyParams(fixedInputs);
193
+ const fixOv = stringifyParams(fixedOverrides);
194
+ const out = [];
195
+ for (const i of inputCombos) {
196
+ for (const o of overrideCombos) {
197
+ out.push({ inputs: { ...fixIn, ...i }, overrides: { ...fixOv, ...o } });
198
+ }
199
+ }
200
+ return out;
201
+ }
202
+ async function pMap(items, n, fn) {
203
+ const results = new Array(items.length);
204
+ let next = 0;
205
+ const worker = async () => {
206
+ while (true) {
207
+ const i = next++;
208
+ if (i >= items.length)
209
+ return;
210
+ results[i] = await fn(items[i], i);
211
+ }
212
+ };
213
+ await Promise.all(Array.from({ length: Math.min(n, items.length) }, worker));
214
+ return results;
215
+ }
216
+ // ─── Path / CSV helpers ───────────────────────────────────────────────────
217
+ function resolveScopedPath(p, label) {
94
218
  const abs = isAbsolute(p) ? p : resolve(process.cwd(), p);
95
219
  if (!ALLOW_ANYWHERE && !abs.startsWith(process.cwd() + "/") && abs !== process.cwd()) {
96
- throw new Error(`OHLCV path '${abs}' is outside cwd '${process.cwd()}'. ` +
220
+ throw new Error(`${label} path '${abs}' is outside cwd '${process.cwd()}'. ` +
97
221
  `Set PINEFORGE_ALLOW_ANYWHERE=1 to override.`);
98
222
  }
223
+ return abs;
224
+ }
225
+ async function resolveCsvPath(p) {
226
+ const abs = resolveScopedPath(p, "OHLCV");
99
227
  const st = await stat(abs).catch(() => null);
100
228
  if (!st || !st.isFile())
101
229
  throw new Error(`OHLCV file not found: ${abs}`);
102
- // Sanity-check header line.
103
230
  const head = (await readFile(abs, "utf8")).slice(0, 200).split(/\r?\n/)[0] ?? "";
104
231
  const expected = ["timestamp", "open", "high", "low", "close", "volume"];
105
232
  const cols = head.toLowerCase().split(",").map((s) => s.trim());
@@ -108,15 +235,48 @@ async function resolveCsvPath(p) {
108
235
  }
109
236
  return abs;
110
237
  }
111
- async function dockerRun(image, cppPath, csvPath) {
112
- const child = spawn("docker", [
238
+ async function dockerBacktest(args) {
239
+ const dockerArgs = [
113
240
  "run", "--rm",
114
241
  "--network=none",
115
- "-v", `${cppPath}:/in/strategy.cpp:ro`,
116
- "-v", `${csvPath}:/in/ohlcv.csv:ro`,
117
- image,
118
- ], { stdio: ["ignore", "pipe", "pipe"] });
119
- return collectChild(child, DOCKER_TIMEOUT_MS);
242
+ ];
243
+ const inputsObj = stringifyParams(args.inputs);
244
+ const overridesObj = stringifyParams(args.overrides);
245
+ if (Object.keys(inputsObj).length) {
246
+ dockerArgs.push("-e", `PINEFORGE_INPUTS=${JSON.stringify(inputsObj)}`);
247
+ }
248
+ if (Object.keys(overridesObj).length) {
249
+ dockerArgs.push("-e", `PINEFORGE_OVERRIDES=${JSON.stringify(overridesObj)}`);
250
+ }
251
+ const r = args.runtime ?? {};
252
+ if (r.input_tf !== undefined && r.input_tf !== "") {
253
+ dockerArgs.push("-e", `PINEFORGE_INPUT_TF=${r.input_tf}`);
254
+ }
255
+ if (r.script_tf !== undefined && r.script_tf !== "") {
256
+ dockerArgs.push("-e", `PINEFORGE_SCRIPT_TF=${r.script_tf}`);
257
+ }
258
+ if (r.bar_magnifier !== undefined) {
259
+ dockerArgs.push("-e", `PINEFORGE_BAR_MAGNIFIER=${r.bar_magnifier ? "true" : "false"}`);
260
+ }
261
+ if (r.magnifier_samples !== undefined) {
262
+ dockerArgs.push("-e", `PINEFORGE_MAGNIFIER_SAMPLES=${r.magnifier_samples}`);
263
+ }
264
+ if (r.magnifier_dist !== undefined) {
265
+ dockerArgs.push("-e", `PINEFORGE_MAGNIFIER_DIST=${r.magnifier_dist}`);
266
+ }
267
+ dockerArgs.push("-v", `${args.cppPath}:/in/strategy.cpp:ro`, "-v", `${args.csvPath}:/in/ohlcv.csv:ro`, args.image);
268
+ const child = spawn("docker", dockerArgs, { stdio: ["ignore", "pipe", "pipe"] });
269
+ const { stdout, stderr, code } = await collectChild(child, DOCKER_TIMEOUT_MS);
270
+ if (code !== 0) {
271
+ throw new Error(`docker exited ${code}\n` +
272
+ `stderr (last 2KB):\n${stderr.slice(-2048)}`);
273
+ }
274
+ try {
275
+ return JSON.parse(stdout);
276
+ }
277
+ catch {
278
+ throw new Error(`backtest produced non-JSON output (first 500B):\n${stdout.slice(0, 500)}`);
279
+ }
120
280
  }
121
281
  function collectChild(child, timeoutMs) {
122
282
  return new Promise((resolveP, rejectP) => {
@@ -134,11 +294,364 @@ function collectChild(child, timeoutMs) {
134
294
  });
135
295
  });
136
296
  }
297
+ // ─── Binance public-API client ────────────────────────────────────────────
298
+ const BINANCE_INTERVAL_MS = {
299
+ "1s": 1_000,
300
+ "1m": 60_000, "3m": 180_000, "5m": 300_000, "15m": 900_000, "30m": 1_800_000,
301
+ "1h": 3_600_000, "2h": 7_200_000, "4h": 14_400_000, "6h": 21_600_000,
302
+ "8h": 28_800_000, "12h": 43_200_000,
303
+ "1d": 86_400_000, "3d": 259_200_000,
304
+ "1w": 604_800_000,
305
+ "1M": 30 * 86_400_000, // approximate
306
+ };
307
+ const BINANCE_INTERVALS = Object.keys(BINANCE_INTERVAL_MS);
308
+ function binanceKlinesUrl(market) {
309
+ return market === "spot"
310
+ ? `${BINANCE_SPOT_BASE}/api/v3/klines`
311
+ : `${BINANCE_FAPI_BASE}/fapi/v1/klines`;
312
+ }
313
+ function binanceExchangeInfoUrl(market) {
314
+ return market === "spot"
315
+ ? `${BINANCE_SPOT_BASE}/api/v3/exchangeInfo`
316
+ : `${BINANCE_FAPI_BASE}/fapi/v1/exchangeInfo`;
317
+ }
318
+ async function binanceGet(url) {
319
+ const resp = await fetch(url, {
320
+ headers: { "user-agent": `pineforge-codegen-mcp/${VERSION}` },
321
+ });
322
+ const text = await resp.text();
323
+ if (!resp.ok) {
324
+ throw new Error(`Binance ${resp.status} for ${url}: ${text.slice(0, 500)}`);
325
+ }
326
+ try {
327
+ return JSON.parse(text);
328
+ }
329
+ catch {
330
+ throw new Error(`Binance non-JSON response: ${text.slice(0, 200)}`);
331
+ }
332
+ }
333
+ async function fetchKlinesPage(market, symbol, interval, startTime, endTime, limit) {
334
+ const params = new URLSearchParams({
335
+ symbol: symbol.toUpperCase(),
336
+ interval,
337
+ limit: String(limit),
338
+ });
339
+ if (startTime !== undefined)
340
+ params.set("startTime", String(startTime));
341
+ if (endTime !== undefined)
342
+ params.set("endTime", String(endTime));
343
+ const url = `${binanceKlinesUrl(market)}?${params.toString()}`;
344
+ const data = await binanceGet(url);
345
+ if (!Array.isArray(data))
346
+ throw new Error(`Binance unexpected klines payload: ${JSON.stringify(data).slice(0, 200)}`);
347
+ return data;
348
+ }
349
+ async function fetchBinanceOhlcv(args) {
350
+ const intervalMs = BINANCE_INTERVAL_MS[args.interval];
351
+ if (intervalMs === undefined) {
352
+ throw new Error(`Unknown interval '${args.interval}'. Valid: ${Object.keys(BINANCE_INTERVAL_MS).join(", ")}`);
353
+ }
354
+ if (args.limit <= 0)
355
+ throw new Error("limit must be > 0");
356
+ if (args.limit > 100_000)
357
+ throw new Error("limit must be ≤ 100000 (sanity cap)");
358
+ const outAbs = resolveScopedPath(args.output_path, "output");
359
+ await mkdir(dirname(outAbs), { recursive: true });
360
+ const now = Date.now();
361
+ const endTime = args.end_time ?? now;
362
+ const startTime = args.start_time ?? Math.max(0, endTime - args.limit * intervalMs);
363
+ const collected = [];
364
+ let cursor = startTime;
365
+ let pages = 0;
366
+ while (collected.length < args.limit && cursor <= endTime) {
367
+ const remaining = args.limit - collected.length;
368
+ const pageLimit = Math.min(BINANCE_KLINES_LIMIT, remaining);
369
+ const page = await fetchKlinesPage(args.market, args.symbol, args.interval, cursor, endTime, pageLimit);
370
+ pages++;
371
+ if (page.length === 0)
372
+ break;
373
+ // Dedup against previous tail (Binance is inclusive on startTime).
374
+ const tail = collected[collected.length - 1];
375
+ const lastSeen = tail ? tail[0] : -1;
376
+ for (const k of page) {
377
+ if (k[0] > lastSeen)
378
+ collected.push(k);
379
+ }
380
+ if (page.length < pageLimit)
381
+ break;
382
+ const lastPage = page[page.length - 1];
383
+ cursor = lastPage[0] + intervalMs;
384
+ if (collected.length < args.limit && cursor <= endTime) {
385
+ await sleep(BINANCE_PAGE_DELAY_MS);
386
+ }
387
+ }
388
+ if (collected.length === 0) {
389
+ throw new Error(`Binance returned 0 bars for ${args.symbol} ${args.interval} (${args.market})`);
390
+ }
391
+ const lines = ["timestamp,open,high,low,close,volume"];
392
+ for (const k of collected) {
393
+ const ts = Number(k[0]);
394
+ if (!Number.isFinite(ts))
395
+ continue;
396
+ const o = sanitizeNumeric(k[1]);
397
+ const h = sanitizeNumeric(k[2]);
398
+ const l = sanitizeNumeric(k[3]);
399
+ const c = sanitizeNumeric(k[4]);
400
+ const v = sanitizeNumeric(k[5]);
401
+ lines.push(`${ts},${o},${h},${l},${c},${v}`);
402
+ }
403
+ const csv = lines.join("\n") + "\n";
404
+ await writeFile(outAbs, csv, "utf8");
405
+ const first = collected[0];
406
+ const last = collected[collected.length - 1];
407
+ return {
408
+ output_path: outAbs,
409
+ market: args.market,
410
+ symbol: args.symbol.toUpperCase(),
411
+ interval: args.interval,
412
+ bars: collected.length,
413
+ pages,
414
+ first_open_time: first[0],
415
+ last_open_time: last[0],
416
+ first_open_iso: new Date(first[0]).toISOString(),
417
+ last_open_iso: new Date(last[0]).toISOString(),
418
+ bytes: Buffer.byteLength(csv, "utf8"),
419
+ };
420
+ }
421
+ function sanitizeNumeric(raw) {
422
+ // Binance returns numeric strings; we keep them as strings to avoid
423
+ // float round-trip loss but reject anything non-numeric so the CSV
424
+ // stays parseable downstream.
425
+ const s = String(raw);
426
+ if (!/^-?\d+(\.\d+)?([eE][-+]?\d+)?$/.test(s)) {
427
+ throw new Error(`Non-numeric kline field: ${s}`);
428
+ }
429
+ return s;
430
+ }
431
+ function sleep(ms) {
432
+ return new Promise((r) => setTimeout(r, ms));
433
+ }
434
+ // Cache exchangeInfo for 5 min — symbol list rarely changes.
435
+ const SYMBOL_CACHE_TTL_MS = 5 * 60_000;
436
+ const symbolCache = new Map();
437
+ async function listBinanceSymbols(market) {
438
+ const now = Date.now();
439
+ const cached = symbolCache.get(market);
440
+ if (cached && now - cached.ts < SYMBOL_CACHE_TTL_MS)
441
+ return cached.symbols;
442
+ const data = await binanceGet(binanceExchangeInfoUrl(market));
443
+ if (!Array.isArray(data?.symbols)) {
444
+ throw new Error("Binance exchangeInfo: unexpected payload shape");
445
+ }
446
+ symbolCache.set(market, { ts: now, symbols: data.symbols });
447
+ return data.symbols;
448
+ }
449
+ async function binanceSymbols(args) {
450
+ const all = await listBinanceSymbols(args.market);
451
+ const limit = Math.max(1, Math.min(args.limit ?? 200, 2000));
452
+ const q = args.query?.toUpperCase();
453
+ const quote = args.quote_asset?.toUpperCase();
454
+ const base = args.base_asset?.toUpperCase();
455
+ const status = args.status?.toUpperCase();
456
+ const ct = args.contract_type?.toUpperCase();
457
+ const filtered = all.filter((s) => {
458
+ if (q && !s.symbol.toUpperCase().includes(q))
459
+ return false;
460
+ if (quote && s.quoteAsset?.toUpperCase() !== quote)
461
+ return false;
462
+ if (base && s.baseAsset?.toUpperCase() !== base)
463
+ return false;
464
+ if (status && s.status?.toUpperCase() !== status)
465
+ return false;
466
+ if (ct && s.contractType?.toUpperCase() !== ct)
467
+ return false;
468
+ return true;
469
+ });
470
+ const truncated = filtered.length > limit;
471
+ const slice = filtered.slice(0, limit).map((s) => ({
472
+ symbol: s.symbol,
473
+ base: s.baseAsset,
474
+ quote: s.quoteAsset,
475
+ status: s.status,
476
+ ...(s.contractType ? { contract_type: s.contractType } : {}),
477
+ }));
478
+ return {
479
+ market: args.market,
480
+ total_symbols: all.length,
481
+ matched: filtered.length,
482
+ returned: slice.length,
483
+ truncated,
484
+ symbols: slice,
485
+ };
486
+ }
487
+ // ─── MCP server wiring ────────────────────────────────────────────────────
137
488
  const asTextResult = (value) => ({
138
489
  content: [{ type: "text", text: JSON.stringify(value, null, 2) }],
139
490
  });
140
- // ─── MCP server wiring ────────────────────────────────────────────────────
141
- const server = new McpServer({ name: "pineforge-codegen-mcp", version: "0.1.0" }, { capabilities: { tools: {} } });
491
+ const ParamMapSchema = z.record(z.string(), z.union([z.string(), z.number(), z.boolean()]));
492
+ const ParamGridSchema = z.record(z.string(), z.array(z.union([z.string(), z.number(), z.boolean()])).min(1));
493
+ const MarketSchema = z.enum(["spot", "usdt_perp"]);
494
+ const IntervalSchema = z.enum(BINANCE_INTERVALS);
495
+ // ─── strategy() header overrides ──────────────────────────────────────────
496
+ //
497
+ // The pineforge-engine runtime accepts a fixed set of strategy(...) header
498
+ // overrides via PINEFORGE_OVERRIDES. Enumerating them here (instead of an
499
+ // opaque ParamMap) gives the agent the exact keys, value types, and enum
500
+ // values it can pass — and lets list_strategy_overrides expose the same
501
+ // catalog at runtime.
502
+ const COMMISSION_TYPES = ["percent", "cash_per_order", "cash_per_contract"];
503
+ const QTY_TYPES = ["fixed", "percent_of_equity", "cash"];
504
+ const CLOSE_ENTRIES_RULES = ["ANY", "FIFO"];
505
+ const STRATEGY_OVERRIDES_CATALOG = {
506
+ initial_capital: {
507
+ type: "number",
508
+ description: "Starting equity in account currency. Mirrors `strategy(initial_capital=...)`.",
509
+ },
510
+ pyramiding: {
511
+ type: "integer",
512
+ description: "Maximum same-direction entries before further entries are blocked. " +
513
+ "0 = single position. Mirrors `strategy(pyramiding=...)`.",
514
+ },
515
+ slippage: {
516
+ type: "integer",
517
+ description: "Per-fill slippage in ticks (mintick units). Mirrors `strategy(slippage=...)`.",
518
+ },
519
+ commission_value: {
520
+ type: "number",
521
+ description: "Commission magnitude. Units depend on commission_type. " +
522
+ "Mirrors `strategy(commission_value=...)`.",
523
+ },
524
+ commission_type: {
525
+ type: "enum",
526
+ enum: COMMISSION_TYPES,
527
+ description: "Commission units. 'percent' = percent of trade value, " +
528
+ "'cash_per_order' = fixed cash per order, " +
529
+ "'cash_per_contract' = fixed cash per contract. " +
530
+ "Mirrors `strategy(commission_type=...)`.",
531
+ },
532
+ default_qty_value: {
533
+ type: "number",
534
+ description: "Default order size, interpreted per default_qty_type. " +
535
+ "Mirrors `strategy(default_qty_value=...)`.",
536
+ },
537
+ default_qty_type: {
538
+ type: "enum",
539
+ enum: QTY_TYPES,
540
+ description: "Default order sizing mode. 'fixed' = contracts/shares, " +
541
+ "'percent_of_equity' = percent of current equity, " +
542
+ "'cash' = fixed cash amount per order. " +
543
+ "Mirrors `strategy(default_qty_type=...)`.",
544
+ },
545
+ process_orders_on_close: {
546
+ type: "boolean",
547
+ description: "When true, market orders submitted on a bar fill at that bar's close " +
548
+ "instead of waiting for the next bar's open. " +
549
+ "Mirrors `strategy(process_orders_on_close=...)`.",
550
+ },
551
+ close_entries_rule: {
552
+ type: "enum",
553
+ enum: CLOSE_ENTRIES_RULES,
554
+ description: "How `strategy.close(id)` resolves which entries to close. " +
555
+ "'FIFO' = first-in-first-out (default). " +
556
+ "'ANY' = match all entries with the same id. " +
557
+ "Mirrors `strategy(close_entries_rule=...)`.",
558
+ },
559
+ };
560
+ const StrategyOverridesSchema = z.object({
561
+ initial_capital: z.number().describe(STRATEGY_OVERRIDES_CATALOG.initial_capital.description).optional(),
562
+ pyramiding: z.number().int().min(0).describe(STRATEGY_OVERRIDES_CATALOG.pyramiding.description).optional(),
563
+ slippage: z.number().int().min(0).describe(STRATEGY_OVERRIDES_CATALOG.slippage.description).optional(),
564
+ commission_value: z.number().min(0).describe(STRATEGY_OVERRIDES_CATALOG.commission_value.description).optional(),
565
+ commission_type: z.enum(COMMISSION_TYPES).describe(STRATEGY_OVERRIDES_CATALOG.commission_type.description).optional(),
566
+ default_qty_value: z.number().describe(STRATEGY_OVERRIDES_CATALOG.default_qty_value.description).optional(),
567
+ default_qty_type: z.enum(QTY_TYPES).describe(STRATEGY_OVERRIDES_CATALOG.default_qty_type.description).optional(),
568
+ process_orders_on_close: z.boolean().describe(STRATEGY_OVERRIDES_CATALOG.process_orders_on_close.description).optional(),
569
+ close_entries_rule: z.enum(CLOSE_ENTRIES_RULES).describe(STRATEGY_OVERRIDES_CATALOG.close_entries_rule.description).optional(),
570
+ }).strict();
571
+ const StrategyOverridesGridSchema = z.object({
572
+ initial_capital: z.array(z.number()).min(1).optional(),
573
+ pyramiding: z.array(z.number().int().min(0)).min(1).optional(),
574
+ slippage: z.array(z.number().int().min(0)).min(1).optional(),
575
+ commission_value: z.array(z.number().min(0)).min(1).optional(),
576
+ commission_type: z.array(z.enum(COMMISSION_TYPES)).min(1).optional(),
577
+ default_qty_value: z.array(z.number()).min(1).optional(),
578
+ default_qty_type: z.array(z.enum(QTY_TYPES)).min(1).optional(),
579
+ process_orders_on_close: z.array(z.boolean()).min(1).optional(),
580
+ close_entries_rule: z.array(z.enum(CLOSE_ENTRIES_RULES)).min(1).optional(),
581
+ }).strict();
582
+ // ─── Runtime args (run_backtest_full args, NOT strategy() header) ─────────
583
+ //
584
+ // These are passed to pineforge-engine's run_backtest_full() rather than the
585
+ // per-strategy override table. They control how the engine consumes input
586
+ // bars (timeframe semantics, bar magnifier sub-bar sampling) and never
587
+ // appear in the Pine source. The engine validates them and surfaces any
588
+ // mismatch (e.g. script_tf finer than input_tf) through
589
+ // strategy_get_last_error() — agents see that as
590
+ // {"engine":"pineforge","error":"..."} on stdout, exit code 1.
591
+ const MAGNIFIER_DISTS = [
592
+ "uniform", "cosine", "triangle", "endpoints", "front_loaded", "back_loaded",
593
+ ];
594
+ const RUNTIME_ARGS_CATALOG = {
595
+ input_tf: {
596
+ type: "enum",
597
+ description: "Chart bar timeframe — the resolution of the OHLCV CSV being fed in. " +
598
+ "Use Pine timeframe strings: '1', '5', '15', '60', '240' (minutes), " +
599
+ "'D', '1D', 'W', '1W', 'M', '1M'. Empty / omitted = the engine " +
600
+ "auto-detects the timeframe from the gap between the first two bars. " +
601
+ "Set explicitly when the CSV's resolution is ambiguous, when fewer " +
602
+ "than 2 bars are present, or when registering request.security() " +
603
+ "evaluators that need the chart TF stated up front.",
604
+ },
605
+ script_tf: {
606
+ type: "enum",
607
+ description: "Strategy / script timeframe — the resolution at which the strategy's " +
608
+ "on_bar() runs. Empty / omitted = same as input_tf (no aggregation). " +
609
+ "Set to a coarser timeframe (e.g. input_tf='5', script_tf='60') to " +
610
+ "have the engine aggregate the input bars into higher-TF script bars " +
611
+ "before invoking the strategy. MUST be coarser than or equal to " +
612
+ "input_tf — finer values are rejected with the error " +
613
+ "'script timeframe must be coarser than or equal to input timeframe'. " +
614
+ "When the Pine source uses request.security() to pull a higher TF, " +
615
+ "leave script_tf empty (the security TF is encoded inside the Pine " +
616
+ "source, not here).",
617
+ },
618
+ bar_magnifier: {
619
+ type: "boolean",
620
+ description: "When true, the engine samples each input bar's price path at " +
621
+ "magnifier_samples sub-points and walks stop / limit / trailing " +
622
+ "orders against the sub-bars instead of the bar's OHLC corners. " +
623
+ "Improves intra-bar fill realism for strategies that hinge on " +
624
+ "wick fills, but multiplies engine work by ~magnifier_samples. " +
625
+ "Default false. Most useful when input_tf is coarse (15m+) and " +
626
+ "the strategy uses tight intra-bar exits.",
627
+ },
628
+ magnifier_samples: {
629
+ type: "integer",
630
+ description: "Sub-bar sample count when bar_magnifier=true. Minimum 2 " +
631
+ "(open + close); typical range 4–16. Higher values give smoother " +
632
+ "intra-bar fill simulation at linear cost. Ignored when " +
633
+ "bar_magnifier=false. Default 4.",
634
+ },
635
+ magnifier_dist: {
636
+ type: "enum",
637
+ enum: MAGNIFIER_DISTS,
638
+ description: "Distribution of sub-bar samples along the OHLC path when " +
639
+ "bar_magnifier=true. 'endpoints' (default) always includes the " +
640
+ "exact O/H/L/C corners and uniformly fills between them — best for " +
641
+ "TradingView parity. 'uniform' = equal spacing. 'cosine' = denser " +
642
+ "near segment endpoints. 'triangle' = denser near segment midpoints. " +
643
+ "'front_loaded' / 'back_loaded' = denser near open / close, " +
644
+ "simulating opening- or closing-impulse price action.",
645
+ },
646
+ };
647
+ const RuntimeArgsSchema = z.object({
648
+ input_tf: z.string().describe(RUNTIME_ARGS_CATALOG.input_tf.description).optional(),
649
+ script_tf: z.string().describe(RUNTIME_ARGS_CATALOG.script_tf.description).optional(),
650
+ bar_magnifier: z.boolean().describe(RUNTIME_ARGS_CATALOG.bar_magnifier.description).optional(),
651
+ magnifier_samples: z.number().int().min(2).describe(RUNTIME_ARGS_CATALOG.magnifier_samples.description).optional(),
652
+ magnifier_dist: z.enum(MAGNIFIER_DISTS).describe(RUNTIME_ARGS_CATALOG.magnifier_dist.description).optional(),
653
+ }).strict();
654
+ const server = new McpServer({ name: "pineforge-codegen-mcp", version: VERSION }, { capabilities: { tools: {} } });
142
655
  server.registerTool("transpile_pine", {
143
656
  description: "Transpile PineScript v6 source to a C++ translation unit using the hosted " +
144
657
  "PineForge codegen API. Compile failures DO NOT consume the monthly quota — " +
@@ -157,14 +670,141 @@ server.registerTool("backtest_pine", {
157
670
  description: "Transpile a PineScript v6 strategy and run it against an OHLCV CSV via the " +
158
671
  "pineforge-engine Docker image on the user's local machine. The OHLCV file " +
159
672
  "stays on the user's box; only the Pine source travels over the network. " +
160
- "Returns the parsed JSON report (summary, trades, elapsed_seconds).",
673
+ "Optional `inputs` overrides input.*() named values from the Pine source " +
674
+ "(keys = the second arg of input.*(...) calls, e.g. 'Fast Length'). " +
675
+ "Optional `overrides` overrides strategy(...) header fields " +
676
+ "(initial_capital, commission_value, default_qty_value, pyramiding, " +
677
+ "slippage, default_qty_type, commission_type, process_orders_on_close). " +
678
+ "Returns the parsed JSON report (summary, trades, applied_inputs, " +
679
+ "applied_overrides, elapsed_seconds). Use backtest_pine_grid for sweeps.",
161
680
  inputSchema: {
162
681
  source: z.string().describe("PineScript v6 source."),
163
682
  ohlcv_csv_path: z.string().describe("Absolute or cwd-relative path to OHLCV CSV with header " +
164
683
  "'timestamp,open,high,low,close,volume' (timestamp = UNIX ms UTC)."),
165
684
  image: z.string().optional().describe(`Docker image override. Defaults to ${DEFAULT_IMAGE}.`),
685
+ inputs: ParamMapSchema.optional().describe("Map of Pine input.*() names → value (string/number/bool). " +
686
+ "Sent as PINEFORGE_INPUTS env var to the runtime."),
687
+ overrides: StrategyOverridesSchema.optional().describe("strategy(...) header overrides. Each key maps to a single argument " +
688
+ "of the Pine `strategy()` call; only the keys you set are applied. " +
689
+ "Sent as PINEFORGE_OVERRIDES env var. Call list_engine_params " +
690
+ "for the full catalog with types and enum values."),
691
+ runtime: RuntimeArgsSchema.optional().describe("Engine runtime args (NOT strategy() header) controlling timeframe " +
692
+ "semantics and intra-bar fill simulation. input_tf / script_tf set " +
693
+ "the chart and strategy timeframes — script_tf must be coarser " +
694
+ "than or equal to input_tf or the engine rejects the run. " +
695
+ "bar_magnifier + magnifier_samples + magnifier_dist enable sub-bar " +
696
+ "price-path sampling for tighter stop / limit fills. Each field is " +
697
+ "optional and only forwarded to the container when set. Call " +
698
+ "list_engine_params for the full catalog."),
699
+ },
700
+ }, async ({ source, ohlcv_csv_path, image, inputs, overrides, runtime }) => asTextResult(await runBacktest({ source, ohlcv_csv_path, image, inputs, overrides, runtime })));
701
+ server.registerTool("backtest_pine_grid", {
702
+ description: "Run a parameter sweep: transpile the Pine source ONCE (single quota hit), " +
703
+ "then re-run the same compiled strategy against the OHLCV CSV across the " +
704
+ "cartesian product of `inputs` × `overrides` grids. Returns a ranked list " +
705
+ "of {inputs, overrides, summary, elapsed_seconds} entries sorted by `sort_by` " +
706
+ "descending, plus the top entry under `best`. Cap: max_combinations (default " +
707
+ "64). Set concurrency > 1 to run docker containers in parallel — each " +
708
+ "container has its own startup overhead, so 2-4 is usually plenty.",
709
+ inputSchema: {
710
+ source: z.string().describe("PineScript v6 source."),
711
+ ohlcv_csv_path: z.string().describe("Path to OHLCV CSV (same format as backtest_pine)."),
712
+ image: z.string().optional().describe(`Docker image override. Defaults to ${DEFAULT_IMAGE}.`),
713
+ inputs: ParamGridSchema.optional().describe("Grid of input.*() names → list of values to sweep. " +
714
+ "Example: {\"Fast Length\": [8, 12, 19], \"Slow Length\": [21, 26, 39]}"),
715
+ overrides: StrategyOverridesGridSchema.optional().describe("Grid of strategy(...) header overrides → list of values, one axis " +
716
+ "per key. Example: {\"default_qty_value\": [1, 5], \"commission_value\": [0.04]}. " +
717
+ "Call list_engine_params for the full catalog with types and enum values."),
718
+ fixed_inputs: ParamMapSchema.optional().describe("Inputs applied to every combo (overridden by per-combo `inputs` keys)."),
719
+ fixed_overrides: StrategyOverridesSchema.optional().describe("Overrides applied to every combo (overridden by per-combo `overrides` keys)."),
720
+ runtime: RuntimeArgsSchema.optional().describe("Engine runtime args applied to every combo in the sweep. Same " +
721
+ "shape as backtest_pine.runtime — input_tf / script_tf / " +
722
+ "bar_magnifier / magnifier_samples / magnifier_dist. Currently " +
723
+ "fixed across the grid (not swept); add to the grid axes through " +
724
+ "future versions if you need to vary them."),
725
+ max_combinations: z.number().int().min(1).max(1024).optional()
726
+ .describe("Hard cap on combinations. Default 64."),
727
+ concurrency: z.number().int().min(1).max(8).optional()
728
+ .describe("Parallel docker runs. Default 1."),
729
+ include_trades: z.boolean().optional()
730
+ .describe("Include the per-trade list in each result. Default false (saves tokens)."),
731
+ sort_by: z.enum(["net_pnl", "win_rate_pct", "max_drawdown", "total_trades"])
732
+ .optional().describe("summary.* field to rank by, descending. Default net_pnl."),
733
+ },
734
+ }, async (args) => asTextResult(await runBacktestGrid(args)));
735
+ server.registerTool("fetch_binance_ohlcv", {
736
+ description: "Fetch OHLCV candles from Binance public API and write a backtest-ready " +
737
+ "CSV (header: timestamp,open,high,low,close,volume; timestamp = open time " +
738
+ "in UNIX ms UTC). Supports `spot` and `usdt_perp` (USDT-margined " +
739
+ "perpetual futures). Requests larger than 1000 bars are paginated " +
740
+ "automatically. Free — no PineForge quota cost. The output path must " +
741
+ "live inside the MCP cwd unless PINEFORGE_ALLOW_ANYWHERE=1.",
742
+ inputSchema: {
743
+ symbol: z.string().min(2).describe("Binance symbol, e.g. 'BTCUSDT'. Use binance_symbols to validate."),
744
+ interval: IntervalSchema.describe("Kline interval. Spot supports 1s + 1m..1M; usdt_perp supports 1m..1M (no 1s)."),
745
+ market: MarketSchema.optional().describe("'spot' (default) or 'usdt_perp'."),
746
+ limit: z.number().int().min(1).max(100_000).optional()
747
+ .describe("Total bars to fetch. Default 1000. Paginated above 1000."),
748
+ start_time: z.number().int().nonnegative().optional()
749
+ .describe("UNIX ms UTC. If unset, derived from end_time/now and limit."),
750
+ end_time: z.number().int().nonnegative().optional()
751
+ .describe("UNIX ms UTC. Defaults to now."),
752
+ output_path: z.string().describe("Path to write the CSV (will create parent dirs as needed)."),
166
753
  },
167
- }, async ({ source, ohlcv_csv_path, image }) => asTextResult(await runBacktest({ source, ohlcv_csv_path, image })));
754
+ }, async ({ symbol, interval, market, limit, start_time, end_time, output_path }) => asTextResult(await fetchBinanceOhlcv({
755
+ symbol,
756
+ interval,
757
+ market: market ?? "spot",
758
+ limit: limit ?? 1000,
759
+ start_time,
760
+ end_time,
761
+ output_path,
762
+ })));
763
+ server.registerTool("binance_symbols", {
764
+ description: "List/validate symbols available on the Binance public API for OHLCV " +
765
+ "fetching. Filters: `query` (substring of the symbol), `quote_asset` " +
766
+ "(e.g. 'USDT'), `base_asset` (e.g. 'BTC'), `status` (e.g. 'TRADING'), " +
767
+ "`contract_type` (futures only, e.g. 'PERPETUAL'). Results are " +
768
+ "cached 5 min in process. Free.",
769
+ inputSchema: {
770
+ market: MarketSchema.describe("'spot' or 'usdt_perp'."),
771
+ query: z.string().optional().describe("Case-insensitive substring of the symbol."),
772
+ quote_asset: z.string().optional().describe("Filter by quote asset (e.g. 'USDT')."),
773
+ base_asset: z.string().optional().describe("Filter by base asset (e.g. 'BTC')."),
774
+ status: z.string().optional().describe("Filter by status. 'TRADING' returns active only."),
775
+ contract_type: z.string().optional().describe("Futures only. 'PERPETUAL' for usdt_perp swaps."),
776
+ limit: z.number().int().min(1).max(2000).optional()
777
+ .describe("Max symbols to return. Default 200."),
778
+ },
779
+ }, async (args) => asTextResult(await binanceSymbols(args)));
780
+ server.registerTool("list_engine_params", {
781
+ description: "Returns the full catalog of engine knobs accepted by backtest_pine / " +
782
+ "backtest_pine_grid in two groups: strategy_overrides (the 9 " +
783
+ "strategy(...) header fields the runtime reads via " +
784
+ "PINEFORGE_OVERRIDES — initial_capital, pyramiding, slippage, " +
785
+ "commission_value, commission_type, default_qty_value, " +
786
+ "default_qty_type, process_orders_on_close, close_entries_rule) and " +
787
+ "runtime_args (input_tf, script_tf, bar_magnifier, " +
788
+ "magnifier_samples, magnifier_dist — args to run_backtest_full, " +
789
+ "NOT part of the strategy() header). Each entry is " +
790
+ "{key, type, enum?, description}. Free — does not consume API quota " +
791
+ "or run docker. Use this to discover what knobs the engine exposes " +
792
+ "before issuing a backtest.",
793
+ inputSchema: {},
794
+ }, async () => asTextResult({
795
+ strategy_overrides: Object.entries(STRATEGY_OVERRIDES_CATALOG).map(([key, spec]) => ({
796
+ key,
797
+ type: spec.type,
798
+ ...(spec.enum ? { enum: [...spec.enum] } : {}),
799
+ description: spec.description,
800
+ })),
801
+ runtime_args: Object.entries(RUNTIME_ARGS_CATALOG).map(([key, spec]) => ({
802
+ key,
803
+ type: spec.type,
804
+ ...(spec.enum ? { enum: [...spec.enum] } : {}),
805
+ description: spec.description,
806
+ })),
807
+ }));
168
808
  server.registerTool("pull_engine_image", {
169
809
  description: "Run `docker pull` for the pineforge-engine runtime image on the user's " +
170
810
  "machine. Does not consume API quota. Useful before the first backtest_pine " +
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,6EAA6E;AAE7E,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,+BAA+B,CAAC;AACjF,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;AACpD,MAAM,aAAa,GAAG,gDAAgD,CAAC;AACvE,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG,CAAC;AACpE,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,OAAO,CAAC,CAAC;AAErF,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;AACpD,MAAM,iBAAiB,GAAG,0BAA0B,CAAC;AACrD,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAClC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAElC,IAAI,CAAC,OAAO,EAAE,CAAC;IACb,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;IACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAMD,KAAK,UAAU,aAAa,CAAC,MAAc;IACzC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,YAAY,EAAE;QAC/C,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE;QAC/D,IAAI,EAAE,MAAM;KACb,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAU;QACnB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACnD,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE;QAChD,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,GAAG;KACvD,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;IAC5E,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC9B,CAAC;AAED,KAAK,UAAU,YAAY;IACzB,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE;QAC3C,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE;KAClC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;IAC5E,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAuCD,KAAK,UAAU,WAAW,CAAC,IAAkB;IAC3C,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,aAAa,CAAC;IAC1C,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEjD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC1C,MAAM,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAEtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC;YAClC,KAAK;YACL,OAAO;YACP,OAAO;YACP,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAC;QACH,OAAO,EAAE,GAAI,MAAiB,EAAE,KAAK,EAAE,EAAE,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;IACrF,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,IAAsB;IACnD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,aAAa,CAAC;IAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC;IACnD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC;IAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAEpE,MAAM,MAAM,GAAG,iBAAiB,CAC9B,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,eAAe,CACrB,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;IACrG,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACb,GAAG,MAAM,CAAC,MAAM,0CAA0C,SAAS,IAAI;YACvE,mDAAmD,CACpD,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC1C,MAAM,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAEtC,IAAI,CAAC;QAaH,MAAM,IAAI,GAAG,MAAM,IAAI,CACrB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC;oBAClC,KAAK,EAAE,OAAO,EAAE,OAAO;oBACvB,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS;oBAChD,OAAO,EAAE,IAAI,CAAC,OAAO;iBACtB,CACkF,CAAC;gBACpF,OAAO;oBACL,EAAE,EAAE,IAAI;oBACR,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,cAAc,EAAE,MAAM,CAAC,cAAc;oBACrC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;oBAC3C,eAAe,EAAE,MAAM,CAAC,eAAe;oBACvC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACpD,CAAC;YACJ,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;iBAClD,CAAC;YACJ,CAAC;QACH,CAAC,CACF,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAEvC,MAAM,SAAS,GAAG,CAAC,CAAM,EAAU,EAAE;YACnC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO;gBAAE,OAAO,CAAC,QAAQ,CAAC;YAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC5B,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC/C,CAAC,CAAC;QACF,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAEtD,OAAO;YACL,kBAAkB,EAAE,MAAM,CAAC,MAAM;YACjC,SAAS,EAAE,SAAS,CAAC,MAAM;YAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,OAAO,EAAE,MAAM;YACf,KAAK;YACL,KAAK,EAAE,EAAE,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE;YACtD,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI;YAC1B,OAAO,EAAE,CAAC,GAAG,SAAS,EAAE,GAAG,MAAM,CAAC;SACnC,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,KAAa;IACpC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACtF,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;IAC9E,IAAI,IAAI,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxF,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;AAChF,CAAC;AAED,6EAA6E;AAE7E,SAAS,eAAe,CAAC,CAAY;IACnC,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAClB,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3D,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAsD;IAC9E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IACnC,IAAI,GAAG,GAA6B,CAAC,EAAE,CAAC,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,IAAI,GAA6B,EAAE,CAAC;QAC1C,KAAK,MAAM,OAAO,IAAI,GAAG,EAAE,CAAC;YAC1B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QACD,GAAG,GAAG,IAAI,CAAC;IACb,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,iBAAiB,CACxB,UAAsB,EACtB,aAAyB,EACzB,WAAsB,EACtB,cAAyB;IAEzB,MAAM,WAAW,GAAG,gBAAgB,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,cAAc,GAAG,gBAAgB,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAiF,EAAE,CAAC;IAC7F,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;YAC/B,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,IAAI,CAAO,KAAU,EAAE,CAAS,EAAE,EAAmC;IAClF,MAAM,OAAO,GAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;QACxB,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM;gBAAE,OAAO;YAC9B,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAM,EAAE,CAAC,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC;IACF,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7E,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,6EAA6E;AAE7E,SAAS,iBAAiB,CAAC,CAAS,EAAE,KAAa;IACjD,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1D,IAAI,CAAC,cAAc,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,IAAI,GAAG,KAAK,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;QACrF,MAAM,IAAI,KAAK,CACb,GAAG,KAAK,UAAU,GAAG,qBAAqB,OAAO,CAAC,GAAG,EAAE,KAAK;YAC5D,6CAA6C,CAC9C,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,CAAS;IACrC,MAAM,GAAG,GAAG,iBAAiB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;IACzE,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACjF,MAAM,QAAQ,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACzE,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAChE,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,oCAAoC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CACvE,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAMD,KAAK,UAAU,cAAc,CAAC,IAO7B;IACC,MAAM,UAAU,GAAa;QAC3B,KAAK,EAAE,MAAM;QACb,gBAAgB;KACjB,CAAC;IACF,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,MAA8B,CAAC,CAAC;IACvE,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,SAAiC,CAAC,CAAC;IAC7E,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC;QAClC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,CAAC;QACrC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,uBAAuB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,QAAQ,KAAK,EAAE,EAAE,CAAC;QAClD,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,KAAK,EAAE,EAAE,CAAC;QACpD,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,CAAC,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QAClC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,CAAC,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACtC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,+BAA+B,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,CAAC,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACnC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,4BAA4B,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,UAAU,CAAC,IAAI,CACb,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,sBAAsB,EAC3C,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,mBAAmB,EACxC,IAAI,CAAC,KAAK,CACX,CAAC;IAEF,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACjF,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;IAC9E,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,iBAAiB,IAAI,IAAI;YACzB,uBAAuB,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAC7C,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,oDAAoD,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAC3E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAA+B,EAAE,SAAiB;IACtE,OAAO,IAAI,OAAO,CAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE;QACrD,IAAI,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;QAC7B,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtB,OAAO,CAAC,IAAI,KAAK,CAAC,0BAA0B,SAAS,IAAI,CAAC,CAAC,CAAC;QAC9D,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,6EAA6E;AAE7E,MAAM,mBAAmB,GAA2B;IAClD,IAAI,EAAE,KAAK;IACX,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS;IAC5E,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU;IACpE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU;IACnC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW;IACnC,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,EAAE,GAAG,UAAU,EAAE,cAAc;CACtC,CAAC;AAEF,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAA0B,CAAC;AAIpF,SAAS,gBAAgB,CAAC,MAAqB;IAC7C,OAAO,MAAM,KAAK,MAAM;QACtB,CAAC,CAAC,GAAG,iBAAiB,gBAAgB;QACtC,CAAC,CAAC,GAAG,iBAAiB,iBAAiB,CAAC;AAC5C,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAqB;IACnD,OAAO,MAAM,KAAK,MAAM;QACtB,CAAC,CAAC,GAAG,iBAAiB,sBAAsB;QAC5C,CAAC,CAAC,GAAG,iBAAiB,uBAAuB,CAAC;AAClD,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,GAAW;IACnC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC5B,OAAO,EAAE,EAAE,YAAY,EAAE,yBAAyB,OAAO,EAAE,EAAE;KAC9D,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,MAAM,QAAQ,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAAC,CAAC;IAChC,MAAM,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;AAChF,CAAC;AAOD,KAAK,UAAU,eAAe,CAC5B,MAAqB,EACrB,MAAc,EACd,QAAgB,EAChB,SAA6B,EAC7B,OAA2B,EAC3B,KAAa;IAEb,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE;QAC5B,QAAQ;QACR,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;KACrB,CAAC,CAAC;IACH,IAAI,SAAS,KAAK,SAAS;QAAE,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IACxE,IAAI,OAAO,KAAK,SAAS;QAAE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAClE,MAAM,GAAG,GAAG,GAAG,gBAAgB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;IAC/D,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,CAAY,CAAC;IAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACtH,OAAO,IAAI,CAAC;AACd,CAAC;AAYD,KAAK,UAAU,iBAAiB,CAAC,IAAoB;IACnD,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,qBAAqB,IAAI,CAAC,QAAQ,aAAa,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7F,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAC1D,IAAI,IAAI,CAAC,KAAK,GAAG,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IAEjF,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC7D,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAElD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC;IAEpF,MAAM,SAAS,GAAY,EAAE,CAAC;IAC9B,IAAI,MAAM,GAAG,SAAS,CAAC;IACvB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;QAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC;QAChD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,MAAM,eAAe,CAChC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CACpE,CAAC;QACF,KAAK,EAAE,CAAC;QACR,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM;QAE7B,mEAAmE;QACnE,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ;gBAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,GAAG,SAAS;YAAE,MAAM;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;QACxC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;QAClC,IAAI,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;YACvD,MAAM,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAClG,CAAC;IAED,MAAM,KAAK,GAAa,CAAC,sCAAsC,CAAC,CAAC;IACjE,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,SAAS;QACnC,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACpC,MAAM,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAErC,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IAC9C,OAAO;QACL,WAAW,EAAE,MAAM;QACnB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;QACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,IAAI,EAAE,SAAS,CAAC,MAAM;QACtB,KAAK;QACL,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC;QACzB,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC;QACvB,cAAc,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;QAChD,aAAa,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;QAC9C,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;KACtC,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,GAAY;IACnC,oEAAoE;IACpE,mEAAmE;IACnE,8BAA8B;IAC9B,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,IAAI,CAAC,gCAAgC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,6DAA6D;AAC7D,MAAM,mBAAmB,GAAG,CAAC,GAAG,MAAM,CAAC;AACvC,MAAM,WAAW,GAAiE,IAAI,GAAG,EAAE,CAAC;AAU5F,KAAK,UAAU,kBAAkB,CAAC,MAAqB;IACrD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,EAAE,GAAG,mBAAmB;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC;IAE3E,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAiC,CAAC;IAC9F,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5D,OAAO,IAAI,CAAC,OAAO,CAAC;AACtB,CAAC;AAYD,KAAK,UAAU,cAAc,CAAC,IAAiB;IAC7C,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7D,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;IAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE,CAAC;IAE7C,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAChC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3D,IAAI,KAAK,IAAI,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,KAAK,KAAK;YAAE,OAAO,KAAK,CAAC;QACjE,IAAI,IAAI,IAAI,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QAC9D,IAAI,MAAM,IAAI,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,MAAM;YAAE,OAAO,KAAK,CAAC;QAC/D,IAAI,EAAE,IAAI,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE;YAAE,OAAO,KAAK,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC;IAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjD,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,IAAI,EAAE,CAAC,CAAC,SAAS;QACjB,KAAK,EAAE,CAAC,CAAC,UAAU;QACnB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7D,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,aAAa,EAAE,GAAG,CAAC,MAAM;QACzB,OAAO,EAAE,QAAQ,CAAC,MAAM;QACxB,QAAQ,EAAE,KAAK,CAAC,MAAM;QACtB,SAAS;QACT,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC;AAED,6EAA6E;AAE7E,MAAM,YAAY,GAAG,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC;IACxC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;CAC3E,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAC7B,CAAC,CAAC,MAAM,EAAE,EACV,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAC/C,CAAC;AACF,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAC9B,CAAC,CAAC,MAAM,EAAE,EACV,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAC/D,CAAC;AACF,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;AACnD,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAEjD,6EAA6E;AAC7E,EAAE;AACF,2EAA2E;AAC3E,0EAA0E;AAC1E,yEAAyE;AACzE,wEAAwE;AACxE,sBAAsB;AACtB,MAAM,gBAAgB,GAAG,CAAC,SAAS,EAAE,gBAAgB,EAAE,mBAAmB,CAAU,CAAC;AACrF,MAAM,SAAS,GAAG,CAAC,OAAO,EAAE,mBAAmB,EAAE,MAAM,CAAU,CAAC;AAClE,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,MAAM,CAAU,CAAC;AAQrD,MAAM,0BAA0B,GAAiC;IAC/D,eAAe,EAAE;QACf,IAAI,EAAE,QAAQ;QACd,WAAW,EACT,+EAA+E;KAClF;IACD,UAAU,EAAE;QACV,IAAI,EAAE,SAAS;QACf,WAAW,EACT,qEAAqE;YACrE,0DAA0D;KAC7D;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,SAAS;QACf,WAAW,EACT,+EAA+E;KAClF;IACD,gBAAgB,EAAE;QAChB,IAAI,EAAE,QAAQ;QACd,WAAW,EACT,yDAAyD;YACzD,2CAA2C;KAC9C;IACD,eAAe,EAAE;QACf,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,gBAAgB;QACtB,WAAW,EACT,wDAAwD;YACxD,2CAA2C;YAC3C,iDAAiD;YACjD,0CAA0C;KAC7C;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,QAAQ;QACd,WAAW,EACT,wDAAwD;YACxD,4CAA4C;KAC/C;IACD,gBAAgB,EAAE;QAChB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,SAAS;QACf,WAAW,EACT,yDAAyD;YACzD,mDAAmD;YACnD,wCAAwC;YACxC,2CAA2C;KAC9C;IACD,uBAAuB,EAAE;QACvB,IAAI,EAAE,SAAS;QACf,WAAW,EACT,uEAAuE;YACvE,8CAA8C;YAC9C,kDAAkD;KACrD;IACD,kBAAkB,EAAE;QAClB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,mBAAmB;QACzB,WAAW,EACT,4DAA4D;YAC5D,yCAAyC;YACzC,8CAA8C;YAC9C,6CAA6C;KAChD;CACF,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC,eAAgB,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE;IACxG,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC,UAAW,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE;IAC3G,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC,QAAS,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE;IACvG,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC,gBAAiB,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE;IACjH,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC,eAAgB,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE;IACtH,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC,iBAAkB,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE;IAC5G,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC,gBAAiB,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE;IACjH,uBAAuB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC,uBAAwB,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE;IACzH,kBAAkB,EAAE,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC,kBAAmB,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE;CAChI,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACtD,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC9D,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC5D,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC9D,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpE,iBAAiB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACxD,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC9D,uBAAuB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC/D,kBAAkB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC3E,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,6EAA6E;AAC7E,EAAE;AACF,6EAA6E;AAC7E,0EAA0E;AAC1E,uEAAuE;AACvE,wEAAwE;AACxE,wDAAwD;AACxD,iDAAiD;AACjD,+DAA+D;AAC/D,MAAM,eAAe,GAAG;IACtB,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa;CACnE,CAAC;AAIX,MAAM,oBAAoB,GAAgC;IACxD,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM;QACZ,WAAW,EACT,sEAAsE;YACtE,qEAAqE;YACrE,gEAAgE;YAChE,sEAAsE;YACtE,oEAAoE;YACpE,kEAAkE;YAClE,oDAAoD;KACvD;IACD,SAAS,EAAE;QACT,IAAI,EAAE,MAAM;QACZ,WAAW,EACT,uEAAuE;YACvE,sEAAsE;YACtE,oEAAoE;YACpE,sEAAsE;YACtE,iEAAiE;YACjE,sDAAsD;YACtD,uEAAuE;YACvE,oEAAoE;YACpE,oEAAoE;YACpE,oBAAoB;KACvB;IACD,aAAa,EAAE;QACb,IAAI,EAAE,SAAS;QACf,WAAW,EACT,+DAA+D;YAC/D,iEAAiE;YACjE,iEAAiE;YACjE,+DAA+D;YAC/D,gEAAgE;YAChE,gEAAgE;YAChE,0CAA0C;KAC7C;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,SAAS;QACf,WAAW,EACT,0DAA0D;YAC1D,kEAAkE;YAClE,yDAAyD;YACzD,iCAAiC;KACpC;IACD,cAAc,EAAE;QACd,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,eAAe;QACrB,WAAW,EACT,2DAA2D;YAC3D,gEAAgE;YAChE,oEAAoE;YACpE,mEAAmE;YACnE,sEAAsE;YACtE,6DAA6D;YAC7D,sDAAsD;KACzD;CACF,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC,QAAS,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE;IACpF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC,SAAU,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE;IACtF,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC,aAAc,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE;IAC/F,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC,iBAAkB,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE;IACnH,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC,cAAe,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE;CAC9G,CAAC,CAAC,MAAM,EAAE,CAAC;AAIZ,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,OAAO,EAAE,EACnD,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;IACE,WAAW,EACT,4EAA4E;QAC5E,6EAA6E;QAC7E,6EAA6E;QAC7E,2BAA2B;IAC7B,WAAW,EAAE;QACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;KACjF;CACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC,CAChE,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,WAAW,EACX;IACE,WAAW,EACT,8EAA8E;QAC9E,yEAAyE;IAC3E,WAAW,EAAE,EAAE;CAChB,EACD,KAAK,IAAI,EAAE,CAAC,YAAY,CAAC,MAAM,YAAY,EAAE,CAAC,CAC/C,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;IACE,WAAW,EACT,6EAA6E;QAC7E,4EAA4E;QAC5E,0EAA0E;QAC1E,0EAA0E;QAC1E,qEAAqE;QACrE,6DAA6D;QAC7D,qEAAqE;QACrE,yEAAyE;QACzE,mEAAmE;QACnE,yEAAyE;IAC3E,WAAW,EAAE;QACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QACpD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CACjC,yDAAyD;YACzD,mEAAmE,CACpE;QACD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACnC,sCAAsC,aAAa,GAAG,CACvD;QACD,MAAM,EAAE,cAAc,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACxC,4DAA4D;YAC5D,kDAAkD,CACnD;QACD,SAAS,EAAE,uBAAuB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACpD,qEAAqE;YACrE,oEAAoE;YACpE,+DAA+D;YAC/D,kDAAkD,CACnD;QACD,OAAO,EAAE,iBAAiB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAC5C,oEAAoE;YACpE,oEAAoE;YACpE,gEAAgE;YAChE,2DAA2D;YAC3D,oEAAoE;YACpE,oEAAoE;YACpE,8DAA8D;YAC9D,0CAA0C,CAC3C;KACF;CACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,CACtE,YAAY,CAAC,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,CACjG,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;IACE,WAAW,EACT,4EAA4E;QAC5E,0EAA0E;QAC1E,2EAA2E;QAC3E,+EAA+E;QAC/E,8EAA8E;QAC9E,uEAAuE;QACvE,mEAAmE;IACrE,WAAW,EAAE;QACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QACpD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;QACxF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,aAAa,GAAG,CAAC;QAC7F,MAAM,EAAE,eAAe,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACzC,qDAAqD;YACrD,wEAAwE,CACzE;QACD,SAAS,EAAE,2BAA2B,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACxD,oEAAoE;YACpE,mFAAmF;YACnF,0EAA0E,CAC3E;QACD,YAAY,EAAE,cAAc,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAC9C,wEAAwE,CACzE;QACD,eAAe,EAAE,uBAAuB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAC1D,8EAA8E,CAC/E;QACD,OAAO,EAAE,iBAAiB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAC5C,gEAAgE;YAChE,0DAA0D;YAC1D,gEAAgE;YAChE,kEAAkE;YAClE,2CAA2C,CAC5C;QACD,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;aAC3D,QAAQ,CAAC,uCAAuC,CAAC;QACpD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;aACnD,QAAQ,CAAC,kCAAkC,CAAC;QAC/C,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;aACnC,QAAQ,CAAC,0EAA0E,CAAC;QACvF,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;aACzE,QAAQ,EAAE,CAAC,QAAQ,CAAC,0DAA0D,CAAC;KACnF;CACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,eAAe,CAAC,IAAwB,CAAC,CAAC,CAC9E,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,qBAAqB,EACrB;IACE,WAAW,EACT,yEAAyE;QACzE,2EAA2E;QAC3E,kEAAkE;QAClE,mEAAmE;QACnE,sEAAsE;QACtE,4DAA4D;IAC9D,WAAW,EAAE;QACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kEAAkE,CAAC;QACtG,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAC/B,+EAA+E,CAChF;QACD,MAAM,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QAC5E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE;aACnD,QAAQ,CAAC,0DAA0D,CAAC;QACvE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;aAClD,QAAQ,CAAC,6DAA6D,CAAC;QAC1E,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;aAChD,QAAQ,CAAC,+BAA+B,CAAC;QAC5C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAC9B,4DAA4D,CAC7D;KACF;CACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,CAC/E,YAAY,CAAC,MAAM,iBAAiB,CAAC;IACnC,MAAM;IACN,QAAQ;IACR,MAAM,EAAE,MAAM,IAAI,MAAM;IACxB,KAAK,EAAE,KAAK,IAAI,IAAI;IACpB,UAAU;IACV,QAAQ;IACR,WAAW;CACZ,CAAC,CAAC,CACN,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;IACE,WAAW,EACT,sEAAsE;QACtE,sEAAsE;QACtE,uEAAuE;QACvE,gEAAgE;QAChE,gCAAgC;IAClC,WAAW,EAAE;QACX,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACvD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;QAClF,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;QACnF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QAChF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;QAC1F,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAC3C,gDAAgD,CACjD;QACD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;aAChD,QAAQ,CAAC,qCAAqC,CAAC;KACnD;CACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,cAAc,CAAC,IAAmB,CAAC,CAAC,CACxE,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;IACE,WAAW,EACT,uEAAuE;QACvE,8DAA8D;QAC9D,oDAAoD;QACpD,+DAA+D;QAC/D,wDAAwD;QACxD,qEAAqE;QACrE,oDAAoD;QACpD,iEAAiE;QACjE,oDAAoD;QACpD,qEAAqE;QACrE,oEAAoE;QACpE,4BAA4B;IAC9B,WAAW,EAAE,EAAE;CAChB,EACD,KAAK,IAAI,EAAE,CAAC,YAAY,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACnF,GAAG;QACH,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC,CAAC;IACH,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACvE,GAAG;QACH,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC,CAAC;CACJ,CAAC,CACH,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;IACE,WAAW,EACT,yEAAyE;QACzE,6EAA6E;QAC7E,OAAO;IACT,WAAW,EAAE;QACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACnC,8BAA8B,aAAa,GAAG,CAC/C;KACF;CACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,SAAS,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC,CAC3E,CAAC;AAEF,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAChC,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,OAAO,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ // AUTO-GENERATED by scripts/sync-version.mjs from /VERSION — do not edit.
2
+ export const VERSION = "0.4.0";
3
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pineforge/codegen-mcp",
3
- "version": "0.1.2",
4
- "description": "Local MCP server: PineScript v6 → C++ via the PineForge codegen API + local Docker backtest runner.",
3
+ "version": "0.4.0",
4
+ "description": "Local MCP server: PineScript v6 → C++ via the PineForge codegen API + local Docker backtest runner with parameter sweeps + Binance OHLCV exporter.",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "pineforge-codegen-mcp": "dist/index.js"
@@ -16,7 +16,10 @@
16
16
  "node": ">=20"
17
17
  },
18
18
  "scripts": {
19
+ "sync-version": "node scripts/sync-version.mjs",
20
+ "prebuild": "npm run sync-version",
19
21
  "build": "tsc",
22
+ "predev": "npm run sync-version",
20
23
  "dev": "tsx src/index.ts",
21
24
  "prepublishOnly": "npm run build"
22
25
  },