@colbymchenry/codegraph-darwin-x64 1.1.1 → 1.1.2
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/lib/dist/bin/codegraph.js +79 -52
- package/lib/dist/bin/codegraph.js.map +1 -1
- package/lib/dist/bin/command-supervision.d.ts +12 -0
- package/lib/dist/bin/command-supervision.d.ts.map +1 -0
- package/lib/dist/bin/command-supervision.js +76 -0
- package/lib/dist/bin/command-supervision.js.map +1 -0
- package/lib/dist/db/queries.d.ts.map +1 -1
- package/lib/dist/db/queries.js +10 -2
- package/lib/dist/db/queries.js.map +1 -1
- package/lib/dist/directory.d.ts +32 -0
- package/lib/dist/directory.d.ts.map +1 -1
- package/lib/dist/directory.js +83 -0
- package/lib/dist/directory.js.map +1 -1
- package/lib/dist/extraction/index.d.ts +13 -1
- package/lib/dist/extraction/index.d.ts.map +1 -1
- package/lib/dist/extraction/index.js +219 -213
- package/lib/dist/extraction/index.js.map +1 -1
- package/lib/dist/extraction/parse-pool.d.ts +126 -0
- package/lib/dist/extraction/parse-pool.d.ts.map +1 -0
- package/lib/dist/extraction/parse-pool.js +319 -0
- package/lib/dist/extraction/parse-pool.js.map +1 -0
- package/lib/dist/extraction/tree-sitter.d.ts.map +1 -1
- package/lib/dist/extraction/tree-sitter.js +48 -19
- package/lib/dist/extraction/tree-sitter.js.map +1 -1
- package/lib/dist/mcp/daemon-paths.d.ts +30 -3
- package/lib/dist/mcp/daemon-paths.d.ts.map +1 -1
- package/lib/dist/mcp/daemon-paths.js +50 -10
- package/lib/dist/mcp/daemon-paths.js.map +1 -1
- package/lib/dist/mcp/daemon-registry.d.ts.map +1 -1
- package/lib/dist/mcp/daemon-registry.js +7 -3
- package/lib/dist/mcp/daemon-registry.js.map +1 -1
- package/lib/dist/mcp/daemon.d.ts +38 -0
- package/lib/dist/mcp/daemon.d.ts.map +1 -1
- package/lib/dist/mcp/daemon.js +164 -31
- package/lib/dist/mcp/daemon.js.map +1 -1
- package/lib/dist/mcp/engine.d.ts +17 -0
- package/lib/dist/mcp/engine.d.ts.map +1 -1
- package/lib/dist/mcp/engine.js +73 -1
- package/lib/dist/mcp/engine.js.map +1 -1
- package/lib/dist/mcp/index.d.ts.map +1 -1
- package/lib/dist/mcp/index.js +25 -43
- package/lib/dist/mcp/index.js.map +1 -1
- package/lib/dist/mcp/ppid-watchdog.d.ts +18 -0
- package/lib/dist/mcp/ppid-watchdog.d.ts.map +1 -1
- package/lib/dist/mcp/ppid-watchdog.js +37 -0
- package/lib/dist/mcp/ppid-watchdog.js.map +1 -1
- package/lib/dist/mcp/query-pool.d.ts +94 -0
- package/lib/dist/mcp/query-pool.d.ts.map +1 -0
- package/lib/dist/mcp/query-pool.js +297 -0
- package/lib/dist/mcp/query-pool.js.map +1 -0
- package/lib/dist/mcp/query-worker.d.ts +24 -0
- package/lib/dist/mcp/query-worker.d.ts.map +1 -0
- package/lib/dist/mcp/query-worker.js +87 -0
- package/lib/dist/mcp/query-worker.js.map +1 -0
- package/lib/dist/mcp/tools.d.ts +57 -0
- package/lib/dist/mcp/tools.d.ts.map +1 -1
- package/lib/dist/mcp/tools.js +147 -37
- package/lib/dist/mcp/tools.js.map +1 -1
- package/lib/dist/project-config.d.ts +20 -0
- package/lib/dist/project-config.d.ts.map +1 -1
- package/lib/dist/project-config.js +42 -2
- package/lib/dist/project-config.js.map +1 -1
- package/lib/dist/resolution/c-fnptr-synthesizer.d.ts +0 -28
- package/lib/dist/resolution/c-fnptr-synthesizer.d.ts.map +1 -1
- package/lib/dist/resolution/c-fnptr-synthesizer.js +765 -79
- package/lib/dist/resolution/c-fnptr-synthesizer.js.map +1 -1
- package/lib/dist/resolution/name-matcher.d.ts.map +1 -1
- package/lib/dist/resolution/name-matcher.js +44 -0
- package/lib/dist/resolution/name-matcher.js.map +1 -1
- package/lib/node_modules/.package-lock.json +1 -1
- package/lib/package.json +1 -1
- package/package.json +1 -1
package/lib/dist/mcp/engine.d.ts
CHANGED
|
@@ -17,6 +17,15 @@ export interface MCPEngineOptions {
|
|
|
17
17
|
* cheap. Honors {@link watchDisabledReason} regardless.
|
|
18
18
|
*/
|
|
19
19
|
watch?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Whether to off-load read-tool dispatch to a worker-thread pool. Only the
|
|
22
|
+
* SHARED daemon wants this — it serves many concurrent clients on one event
|
|
23
|
+
* loop, so without a pool concurrent explores serialize and starve the MCP
|
|
24
|
+
* transport. Direct mode (one stdio client, no concurrency) leaves it off so a
|
|
25
|
+
* single call never pays a worker round-trip. `CODEGRAPH_QUERY_POOL_SIZE=0`
|
|
26
|
+
* disables it even in daemon mode.
|
|
27
|
+
*/
|
|
28
|
+
queryPool?: boolean;
|
|
20
29
|
}
|
|
21
30
|
/**
|
|
22
31
|
* Shared MCP engine. Thread-safe in the sense that multiple sessions can
|
|
@@ -32,7 +41,15 @@ export declare class MCPEngine {
|
|
|
32
41
|
private watcherStarted;
|
|
33
42
|
private opts;
|
|
34
43
|
private closed;
|
|
44
|
+
private queryPool;
|
|
35
45
|
constructor(opts?: MCPEngineOptions);
|
|
46
|
+
/**
|
|
47
|
+
* Start the worker-thread query pool once a default project is open (daemon
|
|
48
|
+
* mode only; honors `CODEGRAPH_QUERY_POOL_SIZE`). Idempotent and best-effort:
|
|
49
|
+
* if workers can't spawn on this platform the ToolHandler keeps serving reads
|
|
50
|
+
* in-process, so the pool can only help, never break, tool calls.
|
|
51
|
+
*/
|
|
52
|
+
private maybeStartPool;
|
|
36
53
|
/**
|
|
37
54
|
* Convenience for {@link MCPServer} compatibility: pre-seed an explicit
|
|
38
55
|
* project path (from the `--path` CLI flag) without yet opening it. This
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/mcp/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/mcp/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAYtC,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;GAKG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,WAAW,CAAc;IAIjC,OAAO,CAAC,WAAW,CAAuB;IAE1C,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,MAAM,CAAS;IAGvB,OAAO,CAAC,SAAS,CAA0B;gBAE/B,IAAI,GAAE,gBAAqB;IAKvC;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAkBtB;;;;;OAKG;IACH,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAK7C,0EAA0E;IAC1E,cAAc,IAAI,MAAM,GAAG,IAAI;IAI/B,yEAAyE;IACzE,cAAc,IAAI,WAAW;IAI7B,uDAAuD;IACvD,mBAAmB,IAAI,OAAO;IAI9B;;;;;;;;OAQG;IACG,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB1D;;;;OAIG;IACH,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAuB7C;;;OAGG;IACH,IAAI,IAAI,IAAI;YAiBE,YAAY;IAuB1B;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IAuDrB;;;;;;;;;OASG;IACH,OAAO,CAAC,WAAW;CAiBpB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAM5E"}
|
package/lib/dist/mcp/engine.js
CHANGED
|
@@ -10,12 +10,47 @@
|
|
|
10
10
|
* connection. Every session reads from the same SQLite WAL and the same
|
|
11
11
|
* inotify watch set — that's the entire point of issue #411.
|
|
12
12
|
*/
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
30
|
+
var ownKeys = function(o) {
|
|
31
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
32
|
+
var ar = [];
|
|
33
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
34
|
+
return ar;
|
|
35
|
+
};
|
|
36
|
+
return ownKeys(o);
|
|
37
|
+
};
|
|
38
|
+
return function (mod) {
|
|
39
|
+
if (mod && mod.__esModule) return mod;
|
|
40
|
+
var result = {};
|
|
41
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
42
|
+
__setModuleDefault(result, mod);
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
})();
|
|
13
46
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
47
|
exports.MCPEngine = void 0;
|
|
15
48
|
exports.parseDebounceEnv = parseDebounceEnv;
|
|
49
|
+
const os = __importStar(require("os"));
|
|
16
50
|
const directory_1 = require("../directory");
|
|
17
51
|
const sync_1 = require("../sync");
|
|
18
52
|
const tools_1 = require("./tools");
|
|
53
|
+
const query_pool_1 = require("./query-pool");
|
|
19
54
|
// Lazy-load the heavy CodeGraph chain (sqlite + query/graph/context layers) OFF
|
|
20
55
|
// the MCP startup path. It's only needed once a tool actually opens a project —
|
|
21
56
|
// not to answer initialize/tools-list — so deferring it lets `serve --mcp` (and
|
|
@@ -41,10 +76,38 @@ class MCPEngine {
|
|
|
41
76
|
watcherStarted = false;
|
|
42
77
|
opts;
|
|
43
78
|
closed = false;
|
|
79
|
+
// Off-loop read-tool pool (daemon mode only). Created lazily once the default
|
|
80
|
+
// project is open — workers each hold their own WAL read connection.
|
|
81
|
+
queryPool = null;
|
|
44
82
|
constructor(opts = {}) {
|
|
45
|
-
this.opts = { watch: opts.watch ?? true };
|
|
83
|
+
this.opts = { watch: opts.watch ?? true, queryPool: opts.queryPool ?? false };
|
|
46
84
|
this.toolHandler = new tools_1.ToolHandler(null);
|
|
47
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Start the worker-thread query pool once a default project is open (daemon
|
|
88
|
+
* mode only; honors `CODEGRAPH_QUERY_POOL_SIZE`). Idempotent and best-effort:
|
|
89
|
+
* if workers can't spawn on this platform the ToolHandler keeps serving reads
|
|
90
|
+
* in-process, so the pool can only help, never break, tool calls.
|
|
91
|
+
*/
|
|
92
|
+
maybeStartPool(root) {
|
|
93
|
+
if (!this.opts.queryPool || this.queryPool || this.closed)
|
|
94
|
+
return;
|
|
95
|
+
const size = (0, query_pool_1.resolvePoolSize)(process.env.CODEGRAPH_QUERY_POOL_SIZE, os.cpus().length);
|
|
96
|
+
if (size <= 0) {
|
|
97
|
+
process.stderr.write('[CodeGraph MCP] Query pool disabled (CODEGRAPH_QUERY_POOL_SIZE=0); serving reads in-process.\n');
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
this.queryPool = new query_pool_1.QueryPool({ root, size });
|
|
102
|
+
this.toolHandler.setQueryPool(this.queryPool);
|
|
103
|
+
process.stderr.write(`[CodeGraph MCP] Query pool: up to ${size} worker thread(s) for concurrent reads.\n`);
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
107
|
+
process.stderr.write(`[CodeGraph MCP] Query pool unavailable (${msg}); serving reads in-process.\n`);
|
|
108
|
+
this.queryPool = null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
48
111
|
/**
|
|
49
112
|
* Convenience for {@link MCPServer} compatibility: pre-seed an explicit
|
|
50
113
|
* project path (from the `--path` CLI flag) without yet opening it. This
|
|
@@ -127,6 +190,7 @@ class MCPEngine {
|
|
|
127
190
|
this.toolHandler.setDefaultCodeGraph(this.cg);
|
|
128
191
|
this.startWatching();
|
|
129
192
|
this.catchUpSync();
|
|
193
|
+
this.maybeStartPool(resolvedRoot);
|
|
130
194
|
}
|
|
131
195
|
catch {
|
|
132
196
|
// Still failing — caller will try again on the next tool call.
|
|
@@ -140,6 +204,13 @@ class MCPEngine {
|
|
|
140
204
|
if (this.closed)
|
|
141
205
|
return;
|
|
142
206
|
this.closed = true;
|
|
207
|
+
// Detach + terminate the worker pool first so no tool call routes to a
|
|
208
|
+
// worker mid-teardown; outstanding pool calls resolve with graceful guidance.
|
|
209
|
+
this.toolHandler.setQueryPool(null);
|
|
210
|
+
if (this.queryPool) {
|
|
211
|
+
void this.queryPool.destroy();
|
|
212
|
+
this.queryPool = null;
|
|
213
|
+
}
|
|
143
214
|
this.toolHandler.closeAll();
|
|
144
215
|
if (this.cg) {
|
|
145
216
|
try {
|
|
@@ -163,6 +234,7 @@ class MCPEngine {
|
|
|
163
234
|
this.toolHandler.setDefaultCodeGraph(this.cg);
|
|
164
235
|
this.startWatching();
|
|
165
236
|
this.catchUpSync();
|
|
237
|
+
this.maybeStartPool(resolvedRoot);
|
|
166
238
|
}
|
|
167
239
|
catch (err) {
|
|
168
240
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/mcp/engine.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/mcp/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAuIH;;;;;;;;;;GAUG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,WAAW,CAAgB;IAGnC,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,YAAY,CAA+C;IAGnE,OAAO,CAAC,gBAAgB,CAA+B;IAGvD,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,QAAQ,CAA4D;IAE5E,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,IAAI,CAA4D;gBAE5D,WAAW,CAAC,EAAE,MAAM;IAIhC;;;;;;;;;;;;OAYG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2C5B;;;;OAIG;IACH,IAAI,IAAI,IAAI;IA2BZ,uEAAuE;YACzD,WAAW;IA+BzB;;;;;;;;OAQG;YACW,kBAAkB;IAqChC;;;;;;;OAOG;YACW,0BAA0B;IAqCxC,iFAAiF;IACjF,OAAO,CAAC,qBAAqB;IAK7B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;CAoB5B;AAWD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE7C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC"}
|
package/lib/dist/mcp/index.js
CHANGED
|
@@ -84,12 +84,6 @@ const ppid_watchdog_1 = require("./ppid-watchdog");
|
|
|
84
84
|
const liveness_watchdog_1 = require("./liveness-watchdog");
|
|
85
85
|
const stdin_teardown_1 = require("./stdin-teardown");
|
|
86
86
|
const wasm_runtime_flags_1 = require("../extraction/wasm-runtime-flags");
|
|
87
|
-
/**
|
|
88
|
-
* How often to poll `process.ppid` to detect parent process death (see #277).
|
|
89
|
-
* 5s is a deliberate trade-off: the failure mode being guarded against is rare
|
|
90
|
-
* (parent SIGKILL'd), and longer poll = less wakeup overhead while idle.
|
|
91
|
-
*/
|
|
92
|
-
const DEFAULT_PPID_POLL_MS = 5000;
|
|
93
87
|
/**
|
|
94
88
|
* Env var that marks a process as the *detached daemon* itself (set by
|
|
95
89
|
* {@link spawnDetachedDaemon} when it re-invokes the CLI). Without it a
|
|
@@ -119,37 +113,6 @@ const TAKEOVER_RETRY_DELAY_MS = 100;
|
|
|
119
113
|
// path, this narrows the "No such tool available" race window.
|
|
120
114
|
const DAEMON_CONNECT_MAX_RETRIES = 240;
|
|
121
115
|
const DAEMON_CONNECT_RETRY_DELAY_MS = 25;
|
|
122
|
-
/**
|
|
123
|
-
* Resolve the PPID watchdog poll interval from an env override. A value of
|
|
124
|
-
* `0` disables the watchdog entirely (escape hatch for embedded scenarios
|
|
125
|
-
* where the parent legitimately re-parents the server on purpose). Anything
|
|
126
|
-
* non-numeric or negative falls back to the default.
|
|
127
|
-
*/
|
|
128
|
-
function parsePpidPollMs(raw) {
|
|
129
|
-
if (raw === undefined || raw === '')
|
|
130
|
-
return DEFAULT_PPID_POLL_MS;
|
|
131
|
-
const parsed = Number(raw);
|
|
132
|
-
if (!Number.isFinite(parsed))
|
|
133
|
-
return DEFAULT_PPID_POLL_MS;
|
|
134
|
-
if (parsed < 0)
|
|
135
|
-
return DEFAULT_PPID_POLL_MS;
|
|
136
|
-
return Math.floor(parsed);
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Parse the host PID propagated across the `--liftoff-only` re-exec
|
|
140
|
-
* ({@link HOST_PPID_ENV}). Returns a positive integer PID, or null when
|
|
141
|
-
* unset/invalid — the direct-launch path, where the watchdog falls back to
|
|
142
|
-
* `process.ppid` divergence. PIDs of 0/1 are rejected (0 = unknown, 1 = init,
|
|
143
|
-
* i.e. already orphaned), so the watchdog doesn't latch onto init.
|
|
144
|
-
*/
|
|
145
|
-
function parseHostPpid(raw) {
|
|
146
|
-
if (raw === undefined || raw === '')
|
|
147
|
-
return null;
|
|
148
|
-
const parsed = Number(raw);
|
|
149
|
-
if (!Number.isInteger(parsed) || parsed <= 1)
|
|
150
|
-
return null;
|
|
151
|
-
return parsed;
|
|
152
|
-
}
|
|
153
116
|
/** Whether `CODEGRAPH_NO_DAEMON` was set to a truthy value. */
|
|
154
117
|
function daemonOptOutSet() {
|
|
155
118
|
const raw = process.env.CODEGRAPH_NO_DAEMON;
|
|
@@ -258,7 +221,7 @@ class MCPServer {
|
|
|
258
221
|
// PPID watchdog baseline — captured at construction so we always have a
|
|
259
222
|
// baseline, even if start() runs after a fork-style reparent.
|
|
260
223
|
originalPpid = process.ppid;
|
|
261
|
-
hostPpid = parseHostPpid(process.env[wasm_runtime_flags_1.HOST_PPID_ENV]);
|
|
224
|
+
hostPpid = (0, ppid_watchdog_1.parseHostPpid)(process.env[wasm_runtime_flags_1.HOST_PPID_ENV]);
|
|
262
225
|
// Idempotency guard for stop().
|
|
263
226
|
stopped = false;
|
|
264
227
|
mode = 'unstarted';
|
|
@@ -424,10 +387,29 @@ class MCPServer {
|
|
|
424
387
|
* never wedges a session.
|
|
425
388
|
*/
|
|
426
389
|
async runProxyWithLocalHandshake(root) {
|
|
427
|
-
|
|
390
|
+
// The daemon may relocate its socket past an in-project filesystem that can't
|
|
391
|
+
// host one (ExFAT/FAT volumes, WSL2 DrvFs; #997) to the deterministic tmpdir
|
|
392
|
+
// fallback. We don't read the bound path from the lockfile — both sides walk
|
|
393
|
+
// the SAME ordered candidate list, so we converge on whichever the daemon
|
|
394
|
+
// bound with zero coordination. The in-project candidate is tried first, so a
|
|
395
|
+
// normal repo pays nothing extra (it connects on the very first probe).
|
|
396
|
+
const candidates = (0, daemon_paths_1.getDaemonSocketCandidates)(root);
|
|
397
|
+
const connectAnyCandidate = async () => {
|
|
398
|
+
for (const candidate of candidates) {
|
|
399
|
+
const s = await (0, proxy_1.connectWithHello)(candidate);
|
|
400
|
+
// A wrong-version daemon IS up — definitive; propagate so the caller
|
|
401
|
+
// serves in-process instead of spawning + polling for 6s. Don't keep
|
|
402
|
+
// probing fallbacks past it.
|
|
403
|
+
if (s === 'version-mismatch')
|
|
404
|
+
return s;
|
|
405
|
+
if (s)
|
|
406
|
+
return s;
|
|
407
|
+
}
|
|
408
|
+
return null;
|
|
409
|
+
};
|
|
428
410
|
const getDaemonSocket = async () => {
|
|
429
|
-
// Fast path: a daemon may already be listening.
|
|
430
|
-
const probe = await (
|
|
411
|
+
// Fast path: a daemon may already be listening (on either candidate).
|
|
412
|
+
const probe = await connectAnyCandidate();
|
|
431
413
|
if (probe === 'version-mismatch')
|
|
432
414
|
return null; // definitive — serve in-process, don't poll for 6s
|
|
433
415
|
if (probe)
|
|
@@ -436,7 +418,7 @@ class MCPServer {
|
|
|
436
418
|
spawnDetachedDaemon(root);
|
|
437
419
|
for (let attempt = 0; attempt < DAEMON_CONNECT_MAX_RETRIES; attempt++) {
|
|
438
420
|
await sleep(DAEMON_CONNECT_RETRY_DELAY_MS);
|
|
439
|
-
const s = await (
|
|
421
|
+
const s = await connectAnyCandidate();
|
|
440
422
|
if (s === 'version-mismatch')
|
|
441
423
|
return null;
|
|
442
424
|
if (s)
|
|
@@ -459,7 +441,7 @@ class MCPServer {
|
|
|
459
441
|
installPpidWatchdog() {
|
|
460
442
|
if (this.mode !== 'direct')
|
|
461
443
|
return;
|
|
462
|
-
const pollMs = parsePpidPollMs(process.env.CODEGRAPH_PPID_POLL_MS);
|
|
444
|
+
const pollMs = (0, ppid_watchdog_1.parsePpidPollMs)(process.env.CODEGRAPH_PPID_POLL_MS);
|
|
463
445
|
if (pollMs <= 0)
|
|
464
446
|
return;
|
|
465
447
|
this.ppidWatchdog = setInterval(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAC7B,iDAAoD;AACpD,4CAAyE;AACzE,2CAA6C;AAC7C,qCAAqC;AACrC,uCAAuC;AACvC,qCAKkB;AAClB,mCAAmE;AACnE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,4 +41,22 @@ export interface SupervisionState {
|
|
|
41
41
|
* supervisor and should shut down, or null while it is still supervised.
|
|
42
42
|
*/
|
|
43
43
|
export declare function supervisionLostReason(state: SupervisionState): string | null;
|
|
44
|
+
/** Default PPID poll cadence (ms). Shared by the MCP server and CLI commands. */
|
|
45
|
+
export declare const DEFAULT_PPID_POLL_MS = 5000;
|
|
46
|
+
/**
|
|
47
|
+
* Resolve the PPID watchdog poll interval from an env override
|
|
48
|
+
* (`CODEGRAPH_PPID_POLL_MS`). A value of `0` disables the watchdog entirely
|
|
49
|
+
* (escape hatch for embedded scenarios where the parent legitimately re-parents
|
|
50
|
+
* the process on purpose). Anything non-numeric or negative falls back to the
|
|
51
|
+
* default.
|
|
52
|
+
*/
|
|
53
|
+
export declare function parsePpidPollMs(raw: string | undefined): number;
|
|
54
|
+
/**
|
|
55
|
+
* Parse the host PID propagated across the `--liftoff-only` re-exec
|
|
56
|
+
* (`CODEGRAPH_HOST_PPID`). Returns a positive integer PID, or null when
|
|
57
|
+
* unset/invalid — the direct-launch path, where the watchdog falls back to
|
|
58
|
+
* `process.ppid` divergence. PIDs of 0/1 are rejected (0 = unknown, 1 = init,
|
|
59
|
+
* i.e. already orphaned), so the watchdog doesn't latch onto init.
|
|
60
|
+
*/
|
|
61
|
+
export declare function parseHostPpid(raw: string | undefined): number | null;
|
|
44
62
|
//# sourceMappingURL=ppid-watchdog.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ppid-watchdog.d.ts","sourceRoot":"","sources":["../../src/mcp/ppid-watchdog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0CAA0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,+EAA+E;IAC/E,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAClC,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAmB5E"}
|
|
1
|
+
{"version":3,"file":"ppid-watchdog.d.ts","sourceRoot":"","sources":["../../src/mcp/ppid-watchdog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0CAA0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,+EAA+E;IAC/E,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAClC,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAmB5E;AAED,iFAAiF;AACjF,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAEzC;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAM/D;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAKpE"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_PPID_POLL_MS = void 0;
|
|
3
4
|
exports.supervisionLostReason = supervisionLostReason;
|
|
5
|
+
exports.parsePpidPollMs = parsePpidPollMs;
|
|
6
|
+
exports.parseHostPpid = parseHostPpid;
|
|
4
7
|
/**
|
|
5
8
|
* Returns a human-readable reason string when the process has lost its
|
|
6
9
|
* supervisor and should shut down, or null while it is still supervised.
|
|
@@ -24,4 +27,38 @@ function supervisionLostReason(state) {
|
|
|
24
27
|
}
|
|
25
28
|
return null;
|
|
26
29
|
}
|
|
30
|
+
/** Default PPID poll cadence (ms). Shared by the MCP server and CLI commands. */
|
|
31
|
+
exports.DEFAULT_PPID_POLL_MS = 5000;
|
|
32
|
+
/**
|
|
33
|
+
* Resolve the PPID watchdog poll interval from an env override
|
|
34
|
+
* (`CODEGRAPH_PPID_POLL_MS`). A value of `0` disables the watchdog entirely
|
|
35
|
+
* (escape hatch for embedded scenarios where the parent legitimately re-parents
|
|
36
|
+
* the process on purpose). Anything non-numeric or negative falls back to the
|
|
37
|
+
* default.
|
|
38
|
+
*/
|
|
39
|
+
function parsePpidPollMs(raw) {
|
|
40
|
+
if (raw === undefined || raw === '')
|
|
41
|
+
return exports.DEFAULT_PPID_POLL_MS;
|
|
42
|
+
const parsed = Number(raw);
|
|
43
|
+
if (!Number.isFinite(parsed))
|
|
44
|
+
return exports.DEFAULT_PPID_POLL_MS;
|
|
45
|
+
if (parsed < 0)
|
|
46
|
+
return exports.DEFAULT_PPID_POLL_MS;
|
|
47
|
+
return Math.floor(parsed);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Parse the host PID propagated across the `--liftoff-only` re-exec
|
|
51
|
+
* (`CODEGRAPH_HOST_PPID`). Returns a positive integer PID, or null when
|
|
52
|
+
* unset/invalid — the direct-launch path, where the watchdog falls back to
|
|
53
|
+
* `process.ppid` divergence. PIDs of 0/1 are rejected (0 = unknown, 1 = init,
|
|
54
|
+
* i.e. already orphaned), so the watchdog doesn't latch onto init.
|
|
55
|
+
*/
|
|
56
|
+
function parseHostPpid(raw) {
|
|
57
|
+
if (raw === undefined || raw === '')
|
|
58
|
+
return null;
|
|
59
|
+
const parsed = Number(raw);
|
|
60
|
+
if (!Number.isInteger(parsed) || parsed <= 1)
|
|
61
|
+
return null;
|
|
62
|
+
return parsed;
|
|
63
|
+
}
|
|
27
64
|
//# sourceMappingURL=ppid-watchdog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ppid-watchdog.js","sourceRoot":"","sources":["../../src/mcp/ppid-watchdog.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ppid-watchdog.js","sourceRoot":"","sources":["../../src/mcp/ppid-watchdog.ts"],"names":[],"mappings":";;;AA2CA,sDAmBC;AAYD,0CAMC;AASD,sCAKC;AAvDD;;;GAGG;AACH,SAAgB,qBAAqB,CAAC,KAAuB;IAC3D,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC/D,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IAEpD,8EAA8E;IAC9E,IAAI,WAAW,KAAK,YAAY,EAAE,CAAC;QACjC,OAAO,QAAQ,YAAY,OAAO,WAAW,EAAE,CAAC;IAClD,CAAC;IACD,yEAAyE;IACzE,2EAA2E;IAC3E,0DAA0D;IAC1D,IAAI,QAAQ,KAAK,OAAO,IAAI,YAAY,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QACvE,OAAO,cAAc,YAAY,SAAS,CAAC;IAC7C,CAAC;IACD,uEAAuE;IACvE,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5C,OAAO,YAAY,QAAQ,SAAS,CAAC;IACvC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iFAAiF;AACpE,QAAA,oBAAoB,GAAG,IAAI,CAAC;AAEzC;;;;;;GAMG;AACH,SAAgB,eAAe,CAAC,GAAuB;IACrD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,4BAAoB,CAAC;IACjE,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,4BAAoB,CAAC;IAC1D,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,4BAAoB,CAAC;IAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,aAAa,CAAC,GAAuB;IACnD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1D,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query pool — runs CPU-heavy read-tool calls on a pool of worker threads so
|
|
3
|
+
* the shared daemon's main event loop stays free for the MCP transport.
|
|
4
|
+
*
|
|
5
|
+
* Why this exists: see {@link ./query-worker}. One daemon, one event loop, one
|
|
6
|
+
* synchronous SQLite connection serializes every concurrent `codegraph_explore`
|
|
7
|
+
* AND starves the transport (a 10-way wave delivered 0 transport heartbeats in
|
|
8
|
+
* 25s — responses can't flush until the whole batch drains, so clients time
|
|
9
|
+
* out). Spreading the dispatch across worker threads (each its own WAL read
|
|
10
|
+
* connection) restores true multi-core parallelism and an idle main loop.
|
|
11
|
+
*
|
|
12
|
+
* Properties:
|
|
13
|
+
* - lazy growth: one warm worker on construct, grows to `size` on demand, so a
|
|
14
|
+
* single-agent session pays for one connection and a 10-subagent burst grows
|
|
15
|
+
* to the core budget.
|
|
16
|
+
* - crash recovery: a dead worker is respawned and its in-flight call retried
|
|
17
|
+
* once; a poison call that keeps crashing fails gracefully (never wedges the
|
|
18
|
+
* pool). A crash budget trips a circuit breaker (`healthy` → false) so the
|
|
19
|
+
* caller falls back to in-process dispatch instead of thrashing respawns.
|
|
20
|
+
* - graceful backstop: a call that can't be served within `softTimeoutMs`
|
|
21
|
+
* resolves with SUCCESS-shaped "busy, retry" guidance — never `isError`, so
|
|
22
|
+
* a momentary overload can't teach the agent to abandon codegraph — instead
|
|
23
|
+
* of hanging past the client's hard timeout.
|
|
24
|
+
*/
|
|
25
|
+
import type { ToolResult } from './tools';
|
|
26
|
+
/**
|
|
27
|
+
* Minimal worker surface the pool drives — satisfied by a real `worker_threads`
|
|
28
|
+
* Worker. Abstracted so tests can inject a fake worker and exercise the pool's
|
|
29
|
+
* queue / growth / crash-recovery / backstop logic without spawning threads or
|
|
30
|
+
* needing a built `dist/`.
|
|
31
|
+
*/
|
|
32
|
+
export interface PoolWorker {
|
|
33
|
+
postMessage(msg: unknown): void;
|
|
34
|
+
terminate(): Promise<number> | void;
|
|
35
|
+
on(event: 'message', cb: (m: unknown) => void): void;
|
|
36
|
+
on(event: 'error', cb: (e: Error) => void): void;
|
|
37
|
+
on(event: 'exit', cb: (code: number) => void): void;
|
|
38
|
+
}
|
|
39
|
+
export interface QueryPoolOptions {
|
|
40
|
+
/** Default project root each worker opens at spawn. */
|
|
41
|
+
root: string;
|
|
42
|
+
/** Max worker threads. Defaults to `clamp(cores-1, 1, 16)`. */
|
|
43
|
+
size?: number;
|
|
44
|
+
/** Linger before a queued call gets busy-guidance. Default 45s. */
|
|
45
|
+
softTimeoutMs?: number;
|
|
46
|
+
/** Retries for an in-flight call whose worker crashed. Default 1. */
|
|
47
|
+
maxRetries?: number;
|
|
48
|
+
/** Worker factory (tests inject a fake). Defaults to a real `worker_threads` Worker. */
|
|
49
|
+
createWorker?: () => PoolWorker;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Resolve the pool size from the `CODEGRAPH_QUERY_POOL_SIZE` override and the
|
|
53
|
+
* machine's core count. `0` (or a negative) explicitly disables the pool (the
|
|
54
|
+
* caller serves in-process — today's behavior). Unset → `clamp(cores-1, 1, 16)`:
|
|
55
|
+
* leave a core for the main loop + OS, but never zero, since even one worker
|
|
56
|
+
* frees the transport and lets responses flush incrementally.
|
|
57
|
+
*/
|
|
58
|
+
export declare function resolvePoolSize(envVal: string | undefined, cpuCount: number): number;
|
|
59
|
+
export declare class QueryPool {
|
|
60
|
+
private idle;
|
|
61
|
+
private queue;
|
|
62
|
+
private inflight;
|
|
63
|
+
private workers;
|
|
64
|
+
private pendingWorkers;
|
|
65
|
+
private nextId;
|
|
66
|
+
private totalCrashes;
|
|
67
|
+
private destroyed;
|
|
68
|
+
private readonly root;
|
|
69
|
+
private readonly maxSize;
|
|
70
|
+
private readonly softTimeoutMs;
|
|
71
|
+
private readonly maxRetries;
|
|
72
|
+
private readonly createWorker;
|
|
73
|
+
constructor(opts: QueryPoolOptions);
|
|
74
|
+
/** Pool size cap (for logging/status). */
|
|
75
|
+
get size(): number;
|
|
76
|
+
/** Live worker count (for tests/status). */
|
|
77
|
+
get liveWorkers(): number;
|
|
78
|
+
/**
|
|
79
|
+
* False once the crash budget is exhausted (or after destroy). The ToolHandler
|
|
80
|
+
* checks this and falls back to in-process dispatch — a broken worker platform
|
|
81
|
+
* degrades to today's behavior instead of failing tool calls.
|
|
82
|
+
*/
|
|
83
|
+
get healthy(): boolean;
|
|
84
|
+
private spawnOne;
|
|
85
|
+
private onMessage;
|
|
86
|
+
private onWorkerGone;
|
|
87
|
+
private drain;
|
|
88
|
+
private settle;
|
|
89
|
+
/** Run a read tool on the pool. Always resolves (never rejects). */
|
|
90
|
+
run(toolName: string, args: Record<string, unknown>): Promise<ToolResult>;
|
|
91
|
+
/** Terminate all workers and answer any outstanding calls gracefully. */
|
|
92
|
+
destroy(): Promise<void>;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=query-pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-pool.d.ts","sourceRoot":"","sources":["../../src/mcp/query-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAK1C;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACpC,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;IACrD,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;IACjD,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;CACrD;AA6CD,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wFAAwF;IACxF,YAAY,CAAC,EAAE,MAAM,UAAU,CAAC;CACjC;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOpF;AAwBD,qBAAa,SAAS;IACpB,OAAO,CAAC,IAAI,CAAoB;IAChC,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,OAAO,CAAyB;IAMxC,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmB;gBAEpC,IAAI,EAAE,gBAAgB;IASlC,0CAA0C;IAC1C,IAAI,IAAI,IAAI,MAAM,CAAyB;IAE3C,4CAA4C;IAC5C,IAAI,WAAW,IAAI,MAAM,CAA8B;IAEvD;;;;OAIG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,OAAO,CAAC,QAAQ;IAgBhB,OAAO,CAAC,SAAS;IAqBjB,OAAO,CAAC,YAAY;IAqBpB,OAAO,CAAC,KAAK;IAuBb,OAAO,CAAC,MAAM;IAOd,oEAAoE;IACpE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAkBzE,yEAAyE;IACnE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAc/B"}
|