@mcptoolshop/venvkit 0.2.5 → 1.0.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.es.md +143 -132
- package/README.fr.md +143 -132
- package/README.hi.md +143 -136
- package/README.it.md +143 -132
- package/README.ja.md +143 -132
- package/README.md +15 -4
- package/README.pt-BR.md +143 -132
- package/README.zh.md +143 -132
- package/dist/doctorLite.d.ts +75 -0
- package/dist/doctorLite.d.ts.map +1 -0
- package/dist/doctorLite.js +705 -0
- package/dist/doctorLite.js.map +1 -0
- package/dist/doctorLite.test.d.ts +2 -0
- package/dist/doctorLite.test.d.ts.map +1 -0
- package/dist/doctorLite.test.js +268 -0
- package/dist/doctorLite.test.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/integration.test.d.ts +2 -0
- package/dist/integration.test.d.ts.map +1 -0
- package/dist/integration.test.js +245 -0
- package/dist/integration.test.js.map +1 -0
- package/dist/mapRender.d.ts +105 -0
- package/dist/mapRender.d.ts.map +1 -0
- package/dist/mapRender.js +718 -0
- package/dist/mapRender.js.map +1 -0
- package/dist/mapRender.test.d.ts +2 -0
- package/dist/mapRender.test.d.ts.map +1 -0
- package/dist/mapRender.test.js +571 -0
- package/dist/mapRender.test.js.map +1 -0
- package/dist/map_cli.d.ts +3 -0
- package/dist/map_cli.d.ts.map +1 -0
- package/dist/map_cli.js +278 -0
- package/dist/map_cli.js.map +1 -0
- package/dist/map_cli.test.d.ts +2 -0
- package/dist/map_cli.test.d.ts.map +1 -0
- package/dist/map_cli.test.js +320 -0
- package/dist/map_cli.test.js.map +1 -0
- package/dist/runLog.d.ts +71 -0
- package/dist/runLog.d.ts.map +1 -0
- package/dist/runLog.js +98 -0
- package/dist/runLog.js.map +1 -0
- package/dist/runLog.test.d.ts +2 -0
- package/dist/runLog.test.d.ts.map +1 -0
- package/dist/runLog.test.js +327 -0
- package/dist/runLog.test.js.map +1 -0
- package/dist/scanEnvPaths.d.ts +18 -0
- package/dist/scanEnvPaths.d.ts.map +1 -0
- package/dist/scanEnvPaths.js +177 -0
- package/dist/scanEnvPaths.js.map +1 -0
- package/dist/scanEnvPaths.test.d.ts +2 -0
- package/dist/scanEnvPaths.test.d.ts.map +1 -0
- package/dist/scanEnvPaths.test.js +250 -0
- package/dist/scanEnvPaths.test.js.map +1 -0
- package/dist/taskCluster.d.ts +62 -0
- package/dist/taskCluster.d.ts.map +1 -0
- package/dist/taskCluster.js +180 -0
- package/dist/taskCluster.js.map +1 -0
- package/dist/taskCluster.test.d.ts +2 -0
- package/dist/taskCluster.test.d.ts.map +1 -0
- package/dist/taskCluster.test.js +375 -0
- package/dist/taskCluster.test.js.map +1 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +26 -0
- package/dist/vitest.config.js.map +1 -0
- package/dist/windows.test.d.ts +6 -0
- package/dist/windows.test.d.ts.map +1 -0
- package/dist/windows.test.js +121 -0
- package/dist/windows.test.js.map +1 -0
- package/package.json +6 -2
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
// runLog.test.ts
|
|
2
|
+
// Unit tests for run log append + read
|
|
3
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
4
|
+
import * as fs from "node:fs/promises";
|
|
5
|
+
import * as path from "node:path";
|
|
6
|
+
import * as os from "node:os";
|
|
7
|
+
import { newRunId, appendRunLog, readRunLog, summarizeRuns, } from "./runLog.js";
|
|
8
|
+
function makeRunEvent(overrides = {}) {
|
|
9
|
+
return {
|
|
10
|
+
version: "1.0",
|
|
11
|
+
runId: overrides.runId ?? newRunId(),
|
|
12
|
+
at: overrides.at ?? new Date().toISOString(),
|
|
13
|
+
cwd: overrides.cwd ?? "/repo",
|
|
14
|
+
task: overrides.task ?? {
|
|
15
|
+
name: overrides.taskName ?? "pytest",
|
|
16
|
+
command: "pytest tests/",
|
|
17
|
+
args: ["tests/"],
|
|
18
|
+
requirements: {
|
|
19
|
+
packages: ["pytest"],
|
|
20
|
+
tags: ["test"],
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
selected: overrides.selected ?? {
|
|
24
|
+
pythonPath: overrides.pythonPath ?? "C:\\repo\\.venv\\Scripts\\python.exe",
|
|
25
|
+
score: 95,
|
|
26
|
+
status: "good",
|
|
27
|
+
},
|
|
28
|
+
outcome: overrides.outcome ?? {
|
|
29
|
+
ok: overrides.ok ?? true,
|
|
30
|
+
exitCode: overrides.ok === false ? 1 : 0,
|
|
31
|
+
durationMs: 1500,
|
|
32
|
+
errorClass: overrides.ok === false ? (overrides.errorClass ?? "RUNTIME_ERROR") : undefined,
|
|
33
|
+
stderrSnippet: overrides.ok === false ? "AssertionError: expected true" : undefined,
|
|
34
|
+
},
|
|
35
|
+
doctor: overrides.doctor,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
describe("runLog", () => {
|
|
39
|
+
describe("newRunId", () => {
|
|
40
|
+
it("generates UUID when no input provided", () => {
|
|
41
|
+
const id1 = newRunId();
|
|
42
|
+
const id2 = newRunId();
|
|
43
|
+
expect(id1).not.toBe(id2);
|
|
44
|
+
// UUID format
|
|
45
|
+
expect(id1).toMatch(/^[\da-f-]{36}$/i);
|
|
46
|
+
});
|
|
47
|
+
it("generates deterministic ID from input", () => {
|
|
48
|
+
const id1 = newRunId("pytest|pytest tests/|2024-01-01");
|
|
49
|
+
const id2 = newRunId("pytest|pytest tests/|2024-01-01");
|
|
50
|
+
expect(id1).toBe(id2);
|
|
51
|
+
expect(id1).toMatch(/^run_[\da-f]{16}$/);
|
|
52
|
+
});
|
|
53
|
+
it("different inputs produce different IDs", () => {
|
|
54
|
+
const id1 = newRunId("task1");
|
|
55
|
+
const id2 = newRunId("task2");
|
|
56
|
+
expect(id1).not.toBe(id2);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe("appendRunLog + readRunLog", () => {
|
|
60
|
+
let tempDir;
|
|
61
|
+
let logPath;
|
|
62
|
+
beforeEach(async () => {
|
|
63
|
+
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "venvkit-test-"));
|
|
64
|
+
logPath = path.join(tempDir, "runs.jsonl");
|
|
65
|
+
});
|
|
66
|
+
afterEach(async () => {
|
|
67
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
68
|
+
});
|
|
69
|
+
it("appends and reads a single event", async () => {
|
|
70
|
+
const evt = makeRunEvent({ taskName: "lint" });
|
|
71
|
+
await appendRunLog(logPath, evt);
|
|
72
|
+
const runs = await readRunLog(logPath);
|
|
73
|
+
expect(runs).toHaveLength(1);
|
|
74
|
+
expect(runs[0]?.task.name).toBe("lint");
|
|
75
|
+
expect(runs[0]?.version).toBe("1.0");
|
|
76
|
+
});
|
|
77
|
+
it("appends multiple events", async () => {
|
|
78
|
+
await appendRunLog(logPath, makeRunEvent({ taskName: "test1" }));
|
|
79
|
+
await appendRunLog(logPath, makeRunEvent({ taskName: "test2" }));
|
|
80
|
+
await appendRunLog(logPath, makeRunEvent({ taskName: "test3" }));
|
|
81
|
+
const runs = await readRunLog(logPath);
|
|
82
|
+
expect(runs).toHaveLength(3);
|
|
83
|
+
expect(runs.map((r) => r.task.name)).toEqual(["test1", "test2", "test3"]);
|
|
84
|
+
});
|
|
85
|
+
it("returns empty array for missing file", async () => {
|
|
86
|
+
const runs = await readRunLog(path.join(tempDir, "nonexistent.jsonl"));
|
|
87
|
+
expect(runs).toEqual([]);
|
|
88
|
+
});
|
|
89
|
+
it("skips malformed lines gracefully", async () => {
|
|
90
|
+
// Write valid + invalid lines
|
|
91
|
+
await fs.writeFile(logPath, [
|
|
92
|
+
JSON.stringify(makeRunEvent({ taskName: "valid1" })),
|
|
93
|
+
"{ broken json",
|
|
94
|
+
"",
|
|
95
|
+
JSON.stringify(makeRunEvent({ taskName: "valid2" })),
|
|
96
|
+
'{"version": "0.9", "old": true}', // wrong version
|
|
97
|
+
].join("\n"), "utf8");
|
|
98
|
+
const runs = await readRunLog(logPath);
|
|
99
|
+
expect(runs).toHaveLength(2);
|
|
100
|
+
expect(runs.map((r) => r.task.name)).toEqual(["valid1", "valid2"]);
|
|
101
|
+
});
|
|
102
|
+
it("respects maxLines option", async () => {
|
|
103
|
+
for (let i = 0; i < 10; i++) {
|
|
104
|
+
await appendRunLog(logPath, makeRunEvent({ taskName: `task${i}` }));
|
|
105
|
+
}
|
|
106
|
+
const runs = await readRunLog(logPath, { maxLines: 3 });
|
|
107
|
+
expect(runs).toHaveLength(3);
|
|
108
|
+
// Should be last 3 lines
|
|
109
|
+
expect(runs.map((r) => r.task.name)).toEqual(["task7", "task8", "task9"]);
|
|
110
|
+
});
|
|
111
|
+
it("creates parent directories if needed", async () => {
|
|
112
|
+
const nestedPath = path.join(tempDir, "deep", "nested", "dir", "runs.jsonl");
|
|
113
|
+
await appendRunLog(nestedPath, makeRunEvent({ taskName: "nested" }));
|
|
114
|
+
const runs = await readRunLog(nestedPath);
|
|
115
|
+
expect(runs).toHaveLength(1);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
describe("summarizeRuns", () => {
|
|
119
|
+
it("counts passed and failed runs", () => {
|
|
120
|
+
const runs = [
|
|
121
|
+
makeRunEvent({ ok: true }),
|
|
122
|
+
makeRunEvent({ ok: true }),
|
|
123
|
+
makeRunEvent({ ok: false }),
|
|
124
|
+
];
|
|
125
|
+
const summary = summarizeRuns(runs);
|
|
126
|
+
expect(summary.total).toBe(3);
|
|
127
|
+
expect(summary.passed).toBe(2);
|
|
128
|
+
expect(summary.failed).toBe(1);
|
|
129
|
+
});
|
|
130
|
+
it("groups by task name", () => {
|
|
131
|
+
const runs = [
|
|
132
|
+
makeRunEvent({ taskName: "pytest", ok: true }),
|
|
133
|
+
makeRunEvent({ taskName: "pytest", ok: false }),
|
|
134
|
+
makeRunEvent({ taskName: "lint", ok: true }),
|
|
135
|
+
];
|
|
136
|
+
const summary = summarizeRuns(runs);
|
|
137
|
+
expect(summary.byTask.get("pytest")).toEqual({ passed: 1, failed: 1 });
|
|
138
|
+
expect(summary.byTask.get("lint")).toEqual({ passed: 1, failed: 0 });
|
|
139
|
+
});
|
|
140
|
+
it("groups by env path", () => {
|
|
141
|
+
const runs = [
|
|
142
|
+
makeRunEvent({ pythonPath: "C:\\env1\\python.exe", ok: true }),
|
|
143
|
+
makeRunEvent({ pythonPath: "C:\\env1\\python.exe", ok: false }),
|
|
144
|
+
makeRunEvent({ pythonPath: "C:\\env2\\python.exe", ok: true }),
|
|
145
|
+
];
|
|
146
|
+
const summary = summarizeRuns(runs);
|
|
147
|
+
expect(summary.byEnv.get("C:\\env1\\python.exe")).toEqual({ passed: 1, failed: 1 });
|
|
148
|
+
expect(summary.byEnv.get("C:\\env2\\python.exe")).toEqual({ passed: 1, failed: 0 });
|
|
149
|
+
});
|
|
150
|
+
it("handles empty array", () => {
|
|
151
|
+
const summary = summarizeRuns([]);
|
|
152
|
+
expect(summary.total).toBe(0);
|
|
153
|
+
expect(summary.passed).toBe(0);
|
|
154
|
+
expect(summary.failed).toBe(0);
|
|
155
|
+
expect(summary.byTask.size).toBe(0);
|
|
156
|
+
expect(summary.byEnv.size).toBe(0);
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
describe("task lifecycle logging", () => {
|
|
160
|
+
let tempDir;
|
|
161
|
+
let logPath;
|
|
162
|
+
beforeEach(async () => {
|
|
163
|
+
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "venvkit-lifecycle-"));
|
|
164
|
+
logPath = path.join(tempDir, "lifecycle.jsonl");
|
|
165
|
+
});
|
|
166
|
+
afterEach(async () => {
|
|
167
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
168
|
+
});
|
|
169
|
+
it("records task start with timestamp", async () => {
|
|
170
|
+
const startTime = new Date().toISOString();
|
|
171
|
+
const evt = makeRunEvent({
|
|
172
|
+
at: startTime,
|
|
173
|
+
taskName: "pytest",
|
|
174
|
+
ok: true,
|
|
175
|
+
});
|
|
176
|
+
await appendRunLog(logPath, evt);
|
|
177
|
+
const runs = await readRunLog(logPath);
|
|
178
|
+
expect(runs).toHaveLength(1);
|
|
179
|
+
expect(runs[0]?.at).toBe(startTime);
|
|
180
|
+
expect(runs[0]?.task.name).toBe("pytest");
|
|
181
|
+
});
|
|
182
|
+
it("records task completion with exit code", async () => {
|
|
183
|
+
const evt = makeRunEvent({
|
|
184
|
+
ok: true,
|
|
185
|
+
outcome: { ok: true, exitCode: 0, durationMs: 1234 },
|
|
186
|
+
});
|
|
187
|
+
await appendRunLog(logPath, evt);
|
|
188
|
+
const runs = await readRunLog(logPath);
|
|
189
|
+
expect(runs[0]?.outcome.ok).toBe(true);
|
|
190
|
+
expect(runs[0]?.outcome.exitCode).toBe(0);
|
|
191
|
+
expect(runs[0]?.outcome.durationMs).toBe(1234);
|
|
192
|
+
});
|
|
193
|
+
it("records task failure with error class", async () => {
|
|
194
|
+
const evt = makeRunEvent({
|
|
195
|
+
ok: false,
|
|
196
|
+
errorClass: "SSL_BROKEN",
|
|
197
|
+
});
|
|
198
|
+
await appendRunLog(logPath, evt);
|
|
199
|
+
const runs = await readRunLog(logPath);
|
|
200
|
+
expect(runs[0]?.outcome.ok).toBe(false);
|
|
201
|
+
expect(runs[0]?.outcome.errorClass).toBe("SSL_BROKEN");
|
|
202
|
+
});
|
|
203
|
+
it("records task failure with stderr snippet", async () => {
|
|
204
|
+
const evt = {
|
|
205
|
+
...makeRunEvent({ ok: false }),
|
|
206
|
+
outcome: {
|
|
207
|
+
ok: false,
|
|
208
|
+
exitCode: 1,
|
|
209
|
+
errorClass: "IMPORT_ERROR",
|
|
210
|
+
stderrSnippet: "ModuleNotFoundError: No module named 'torch'",
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
await appendRunLog(logPath, evt);
|
|
214
|
+
const runs = await readRunLog(logPath);
|
|
215
|
+
expect(runs[0]?.outcome.stderrSnippet).toContain("ModuleNotFoundError");
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
describe("concurrent task handling", () => {
|
|
219
|
+
let tempDir;
|
|
220
|
+
let logPath;
|
|
221
|
+
beforeEach(async () => {
|
|
222
|
+
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "venvkit-concurrent-"));
|
|
223
|
+
logPath = path.join(tempDir, "concurrent.jsonl");
|
|
224
|
+
});
|
|
225
|
+
afterEach(async () => {
|
|
226
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
227
|
+
});
|
|
228
|
+
it("handles concurrent appends from multiple tasks", async () => {
|
|
229
|
+
// Simulate multiple concurrent task completions
|
|
230
|
+
const events = Array.from({ length: 10 }, (_, i) => makeRunEvent({ taskName: `task${i}`, runId: `run_concurrent_${i}` }));
|
|
231
|
+
// Append all concurrently
|
|
232
|
+
await Promise.all(events.map((evt) => appendRunLog(logPath, evt)));
|
|
233
|
+
const runs = await readRunLog(logPath);
|
|
234
|
+
// All events should be recorded
|
|
235
|
+
expect(runs).toHaveLength(10);
|
|
236
|
+
const runIds = runs.map((r) => r.runId);
|
|
237
|
+
events.forEach((evt) => {
|
|
238
|
+
expect(runIds).toContain(evt.runId);
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
it("maintains event order within single task", async () => {
|
|
242
|
+
// Write sequentially to maintain order
|
|
243
|
+
for (let i = 0; i < 5; i++) {
|
|
244
|
+
await appendRunLog(logPath, makeRunEvent({ taskName: "sequential", runId: `run_seq_${i}` }));
|
|
245
|
+
}
|
|
246
|
+
const runs = await readRunLog(logPath);
|
|
247
|
+
expect(runs).toHaveLength(5);
|
|
248
|
+
for (let i = 0; i < 5; i++) {
|
|
249
|
+
expect(runs[i]?.runId).toBe(`run_seq_${i}`);
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
describe("log persistence and retrieval", () => {
|
|
254
|
+
let tempDir;
|
|
255
|
+
let logPath;
|
|
256
|
+
beforeEach(async () => {
|
|
257
|
+
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "venvkit-persist-"));
|
|
258
|
+
logPath = path.join(tempDir, "persist.jsonl");
|
|
259
|
+
});
|
|
260
|
+
afterEach(async () => {
|
|
261
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
262
|
+
});
|
|
263
|
+
it("persists events across sessions", async () => {
|
|
264
|
+
// Session 1: write events
|
|
265
|
+
await appendRunLog(logPath, makeRunEvent({ taskName: "session1", runId: "run_s1" }));
|
|
266
|
+
await appendRunLog(logPath, makeRunEvent({ taskName: "session1", runId: "run_s2" }));
|
|
267
|
+
// Session 2: read and write more
|
|
268
|
+
const initialRuns = await readRunLog(logPath);
|
|
269
|
+
expect(initialRuns).toHaveLength(2);
|
|
270
|
+
await appendRunLog(logPath, makeRunEvent({ taskName: "session2", runId: "run_s3" }));
|
|
271
|
+
// Session 3: verify all present
|
|
272
|
+
const finalRuns = await readRunLog(logPath);
|
|
273
|
+
expect(finalRuns).toHaveLength(3);
|
|
274
|
+
expect(finalRuns.map((r) => r.runId)).toEqual(["run_s1", "run_s2", "run_s3"]);
|
|
275
|
+
});
|
|
276
|
+
it("retrieves runs by various criteria", async () => {
|
|
277
|
+
await appendRunLog(logPath, makeRunEvent({ taskName: "pytest", ok: true }));
|
|
278
|
+
await appendRunLog(logPath, makeRunEvent({ taskName: "pytest", ok: false }));
|
|
279
|
+
await appendRunLog(logPath, makeRunEvent({ taskName: "lint", ok: true }));
|
|
280
|
+
const runs = await readRunLog(logPath);
|
|
281
|
+
const summary = summarizeRuns(runs);
|
|
282
|
+
// Can filter by task
|
|
283
|
+
expect(summary.byTask.get("pytest")).toEqual({ passed: 1, failed: 1 });
|
|
284
|
+
expect(summary.byTask.get("lint")).toEqual({ passed: 1, failed: 0 });
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
describe("log file operations", () => {
|
|
288
|
+
let tempDir;
|
|
289
|
+
let logPath;
|
|
290
|
+
beforeEach(async () => {
|
|
291
|
+
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "venvkit-ops-"));
|
|
292
|
+
logPath = path.join(tempDir, "ops.jsonl");
|
|
293
|
+
});
|
|
294
|
+
afterEach(async () => {
|
|
295
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
296
|
+
});
|
|
297
|
+
it("handles log file with only newlines", async () => {
|
|
298
|
+
await fs.writeFile(logPath, "\n\n\n", "utf8");
|
|
299
|
+
const runs = await readRunLog(logPath);
|
|
300
|
+
expect(runs).toHaveLength(0);
|
|
301
|
+
});
|
|
302
|
+
it("handles very large events", async () => {
|
|
303
|
+
const largeStderr = "x".repeat(10000);
|
|
304
|
+
const evt = {
|
|
305
|
+
...makeRunEvent({ ok: false }),
|
|
306
|
+
outcome: {
|
|
307
|
+
ok: false,
|
|
308
|
+
exitCode: 1,
|
|
309
|
+
stderrSnippet: largeStderr,
|
|
310
|
+
},
|
|
311
|
+
};
|
|
312
|
+
await appendRunLog(logPath, evt);
|
|
313
|
+
const runs = await readRunLog(logPath);
|
|
314
|
+
expect(runs).toHaveLength(1);
|
|
315
|
+
expect(runs[0]?.outcome.stderrSnippet).toBe(largeStderr);
|
|
316
|
+
});
|
|
317
|
+
it("clears log by overwriting", async () => {
|
|
318
|
+
await appendRunLog(logPath, makeRunEvent({ runId: "run_1" }));
|
|
319
|
+
await appendRunLog(logPath, makeRunEvent({ runId: "run_2" }));
|
|
320
|
+
// Clear by overwriting with empty content
|
|
321
|
+
await fs.writeFile(logPath, "", "utf8");
|
|
322
|
+
const runs = await readRunLog(logPath);
|
|
323
|
+
expect(runs).toHaveLength(0);
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
//# sourceMappingURL=runLog.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runLog.test.js","sourceRoot":"","sources":["../runLog.test.ts"],"names":[],"mappings":"AAAA,iBAAiB;AACjB,uCAAuC;AAEvC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAM,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,aAAa,GAEd,MAAM,aAAa,CAAC;AAErB,SAAS,YAAY,CACnB,YAKI,EAAE;IAEN,OAAO;QACL,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,QAAQ,EAAE;QACpC,EAAE,EAAE,SAAS,CAAC,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5C,GAAG,EAAE,SAAS,CAAC,GAAG,IAAI,OAAO;QAC7B,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI;YACtB,IAAI,EAAE,SAAS,CAAC,QAAQ,IAAI,QAAQ;YACpC,OAAO,EAAE,eAAe;YACxB,IAAI,EAAE,CAAC,QAAQ,CAAC;YAChB,YAAY,EAAE;gBACZ,QAAQ,EAAE,CAAC,QAAQ,CAAC;gBACpB,IAAI,EAAE,CAAC,MAAM,CAAC;aACf;SACF;QACD,QAAQ,EAAE,SAAS,CAAC,QAAQ,IAAI;YAC9B,UAAU,EAAE,SAAS,CAAC,UAAU,IAAI,sCAAsC;YAC1E,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,MAAM;SACf;QACD,OAAO,EAAE,SAAS,CAAC,OAAO,IAAI;YAC5B,EAAE,EAAE,SAAS,CAAC,EAAE,IAAI,IAAI;YACxB,QAAQ,EAAE,SAAS,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,UAAU,EAAE,IAAI;YAChB,UAAU,EAAE,SAAS,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS;YAC1F,aAAa,EAAE,SAAS,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,SAAS;SACpF;QACD,MAAM,EAAE,SAAS,CAAC,MAAM;KACzB,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;YAEvB,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC1B,cAAc;YACd,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,GAAG,GAAG,QAAQ,CAAC,iCAAiC,CAAC,CAAC;YACxD,MAAM,GAAG,GAAG,QAAQ,CAAC,iCAAiC,CAAC,CAAC;YAExD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtB,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC9B,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAE9B,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,IAAI,OAAe,CAAC;QACpB,IAAI,OAAe,CAAC;QAEpB,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;YACpE,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/C,MAAM,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAEjC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;YAEvC,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;YACvC,MAAM,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;YACjE,MAAM,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;YACjE,MAAM,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;YAEjE,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;YAEvC,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC;YAEvE,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAChD,8BAA8B;YAC9B,MAAM,EAAE,CAAC,SAAS,CAChB,OAAO,EACP;gBACE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACpD,eAAe;gBACf,EAAE;gBACF,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACpD,iCAAiC,EAAE,gBAAgB;aACpD,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,MAAM,CACP,CAAC;YAEF,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;YAEvC,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;YACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,MAAM,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACtE,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;YAExD,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC7B,yBAAyB;YACzB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;YAC7E,MAAM,YAAY,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;YAErE,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,IAAI,GAAG;gBACX,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;gBAC1B,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;gBAC1B,YAAY,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;aAC5B,CAAC;YAEF,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YAEpC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;YAC7B,MAAM,IAAI,GAAG;gBACX,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;gBAC9C,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;gBAC/C,YAAY,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;aAC7C,CAAC;YAEF,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YAEpC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YACvE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;YAC5B,MAAM,IAAI,GAAG;gBACX,YAAY,CAAC,EAAE,UAAU,EAAE,sBAAsB,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;gBAC9D,YAAY,CAAC,EAAE,UAAU,EAAE,sBAAsB,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;gBAC/D,YAAY,CAAC,EAAE,UAAU,EAAE,sBAAsB,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;aAC/D,CAAC;YAEF,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YAEpC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YACpF,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;YAC7B,MAAM,OAAO,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;YAElC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,IAAI,OAAe,CAAC;QACpB,IAAI,OAAe,CAAC;QAEpB,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;YACzE,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC3C,MAAM,GAAG,GAAG,YAAY,CAAC;gBACvB,EAAE,EAAE,SAAS;gBACb,QAAQ,EAAE,QAAQ;gBAClB,EAAE,EAAE,IAAI;aACT,CAAC,CAAC;YAEH,MAAM,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;YAEvC,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,GAAG,GAAG,YAAY,CAAC;gBACvB,EAAE,EAAE,IAAI;gBACR,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE;aACrD,CAAC,CAAC;YAEH,MAAM,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;YAEvC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,GAAG,GAAG,YAAY,CAAC;gBACvB,EAAE,EAAE,KAAK;gBACT,UAAU,EAAE,YAAY;aACzB,CAAC,CAAC;YAEH,MAAM,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;YAEvC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,GAAG,GAAkB;gBACzB,GAAG,YAAY,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;gBAC9B,OAAO,EAAE;oBACP,EAAE,EAAE,KAAK;oBACT,QAAQ,EAAE,CAAC;oBACX,UAAU,EAAE,cAAc;oBAC1B,aAAa,EAAE,8CAA8C;iBAC9D;aACF,CAAC;YAEF,MAAM,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;YAEvC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,IAAI,OAAe,CAAC;QACpB,IAAI,OAAe,CAAC;QAEpB,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC;YAC1E,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,gDAAgD;YAChD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACjD,YAAY,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,kBAAkB,CAAC,EAAE,EAAE,CAAC,CACrE,CAAC;YAEF,0BAA0B;YAC1B,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;YAEnE,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;YAEvC,gCAAgC;YAChC,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACxC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACrB,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,uCAAuC;YACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,MAAM,YAAY,CAChB,OAAO,EACP,YAAY,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,CAChE,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;YAEvC,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;QAC7C,IAAI,OAAe,CAAC;QACpB,IAAI,OAAe,CAAC;QAEpB,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;YACvE,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,0BAA0B;YAC1B,MAAM,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;YACrF,MAAM,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;YAErF,iCAAiC;YACjC,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;YAC9C,MAAM,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAEpC,MAAM,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;YAErF,gCAAgC;YAChC,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC5E,MAAM,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YAC7E,MAAM,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAE1E,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YAEpC,qBAAqB;YACrB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YACvE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,IAAI,OAAe,CAAC;QACpB,IAAI,OAAe,CAAC;QAEpB,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;YACnE,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YAE9C,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;YAEvC,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;YACzC,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACtC,MAAM,GAAG,GAAkB;gBACzB,GAAG,YAAY,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;gBAC9B,OAAO,EAAE;oBACP,EAAE,EAAE,KAAK;oBACT,QAAQ,EAAE,CAAC;oBACX,aAAa,EAAE,WAAW;iBAC3B;aACF,CAAC;YAEF,MAAM,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;YAEvC,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;YACzC,MAAM,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;YAC9D,MAAM,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;YAE9D,0CAA0C;YAC1C,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;YAExC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;YAEvC,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type ScanOptions = {
|
|
2
|
+
roots: string[];
|
|
3
|
+
maxDepth?: number;
|
|
4
|
+
includeHidden?: boolean;
|
|
5
|
+
includeUserHomeCache?: boolean;
|
|
6
|
+
dedupe?: boolean;
|
|
7
|
+
};
|
|
8
|
+
export type ScanResult = {
|
|
9
|
+
pythonPaths: string[];
|
|
10
|
+
meta: {
|
|
11
|
+
scannedRoots: string[];
|
|
12
|
+
maxDepth: number;
|
|
13
|
+
foundVenvs: number;
|
|
14
|
+
foundBases: number;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
export declare function scanEnvPaths(options: ScanOptions): Promise<ScanResult>;
|
|
18
|
+
//# sourceMappingURL=scanEnvPaths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanEnvPaths.d.ts","sourceRoot":"","sources":["../scanEnvPaths.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,EAAE;QACJ,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH,CAAC;AA0HF,wBAAsB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAiD5E"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
// scanEnvPaths.ts
|
|
2
|
+
//
|
|
3
|
+
// Discover Python environments on disk (venv + base interpreters) in a fast, pragmatic way.
|
|
4
|
+
// Outputs python executable paths you can feed into doctorLite + mapRender.
|
|
5
|
+
//
|
|
6
|
+
// Strategy (safe + useful defaults):
|
|
7
|
+
// - Project-local: .venv, venv, env, .python, .pyenv (common patterns)
|
|
8
|
+
// - Workspace roots you pass in
|
|
9
|
+
// - Global cache: ~/.venvkit/envs (if you use it)
|
|
10
|
+
// - Also looks for any directory containing pyvenv.cfg and a python executable.
|
|
11
|
+
//
|
|
12
|
+
// Notes:
|
|
13
|
+
// - This is discovery only. You still call doctorLite for health + facts.
|
|
14
|
+
// - On Windows we look for Scripts/python.exe; on POSIX bin/python.
|
|
15
|
+
import * as fs from "node:fs/promises";
|
|
16
|
+
import * as path from "node:path";
|
|
17
|
+
import * as os from "node:os";
|
|
18
|
+
// Well-known venv directory names that start with "." — exempt from hidden-dir skip
|
|
19
|
+
const VENV_DIR_NAMES = new Set([".venv", ".python", ".pyenv"]);
|
|
20
|
+
function isWin() {
|
|
21
|
+
return os.platform() === "win32";
|
|
22
|
+
}
|
|
23
|
+
function norm(p) {
|
|
24
|
+
return isWin() ? p.toLowerCase() : p;
|
|
25
|
+
}
|
|
26
|
+
async function exists(p) {
|
|
27
|
+
try {
|
|
28
|
+
await fs.stat(p);
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function isDir(p) {
|
|
36
|
+
try {
|
|
37
|
+
return (await fs.stat(p)).isDirectory();
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function venvPythonCandidates(venvRoot) {
|
|
44
|
+
return isWin()
|
|
45
|
+
? [path.join(venvRoot, "Scripts", "python.exe"), path.join(venvRoot, "Scripts", "python")]
|
|
46
|
+
: [path.join(venvRoot, "bin", "python"), path.join(venvRoot, "bin", "python3")];
|
|
47
|
+
}
|
|
48
|
+
async function detectVenvAt(dir) {
|
|
49
|
+
const cfg = path.join(dir, "pyvenv.cfg");
|
|
50
|
+
if (!(await exists(cfg)))
|
|
51
|
+
return null;
|
|
52
|
+
for (const py of venvPythonCandidates(dir)) {
|
|
53
|
+
if (await exists(py))
|
|
54
|
+
return py;
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
async function listDirSafe(dir) {
|
|
59
|
+
try {
|
|
60
|
+
return await fs.readdir(dir);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function walkForVenvs(root, maxDepth, includeHidden, out) {
|
|
67
|
+
const stack = [{ dir: root, depth: 0 }];
|
|
68
|
+
while (stack.length) {
|
|
69
|
+
const cur = stack.pop();
|
|
70
|
+
if (cur.depth > maxDepth)
|
|
71
|
+
continue;
|
|
72
|
+
// quick venv detection at this directory
|
|
73
|
+
const venvPy = await detectVenvAt(cur.dir);
|
|
74
|
+
if (venvPy) {
|
|
75
|
+
out.push(venvPy);
|
|
76
|
+
// Do not descend into this venv further (keeps scan fast)
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const children = await listDirSafe(cur.dir);
|
|
80
|
+
for (const name of children) {
|
|
81
|
+
// Skip common heavy directories (always, regardless of hidden flag)
|
|
82
|
+
if (name === "node_modules" || name === "dist" || name === "build" || name === ".git")
|
|
83
|
+
continue;
|
|
84
|
+
// Skip hidden dirs, but exempt well-known venv directory names
|
|
85
|
+
if (!includeHidden && name.startsWith(".") && !VENV_DIR_NAMES.has(name))
|
|
86
|
+
continue;
|
|
87
|
+
const full = path.join(cur.dir, name);
|
|
88
|
+
if (!(await isDir(full)))
|
|
89
|
+
continue;
|
|
90
|
+
stack.push({ dir: full, depth: cur.depth + 1 });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async function discoverProjectLocalRoots(root) {
|
|
95
|
+
const candidates = [".venv", "venv", "env", ".python", ".pyenv"];
|
|
96
|
+
const out = [];
|
|
97
|
+
for (const c of candidates) {
|
|
98
|
+
const p = path.join(root, c);
|
|
99
|
+
if (await isDir(p))
|
|
100
|
+
out.push(p);
|
|
101
|
+
}
|
|
102
|
+
return out;
|
|
103
|
+
}
|
|
104
|
+
async function discoverBasePythons() {
|
|
105
|
+
// Best-effort:
|
|
106
|
+
// - On Windows: common install locations
|
|
107
|
+
// - On POSIX: common binaries
|
|
108
|
+
const out = [];
|
|
109
|
+
if (isWin()) {
|
|
110
|
+
const possible = [
|
|
111
|
+
"C:\\Python312\\python.exe",
|
|
112
|
+
"C:\\Python311\\python.exe",
|
|
113
|
+
"C:\\Python310\\python.exe",
|
|
114
|
+
"C:\\Program Files\\Python312\\python.exe",
|
|
115
|
+
"C:\\Program Files\\Python311\\python.exe",
|
|
116
|
+
"C:\\Program Files\\Python310\\python.exe",
|
|
117
|
+
path.join(os.homedir(), "AppData", "Local", "Programs", "Python", "Python312", "python.exe"),
|
|
118
|
+
path.join(os.homedir(), "AppData", "Local", "Programs", "Python", "Python311", "python.exe"),
|
|
119
|
+
path.join(os.homedir(), "AppData", "Local", "Programs", "Python", "Python310", "python.exe"),
|
|
120
|
+
];
|
|
121
|
+
for (const p of possible)
|
|
122
|
+
if (await exists(p))
|
|
123
|
+
out.push(p);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
const possible = ["/usr/bin/python3", "/usr/local/bin/python3", "/opt/homebrew/bin/python3", "/usr/bin/python"];
|
|
127
|
+
for (const p of possible)
|
|
128
|
+
if (await exists(p))
|
|
129
|
+
out.push(p);
|
|
130
|
+
}
|
|
131
|
+
return out;
|
|
132
|
+
}
|
|
133
|
+
export async function scanEnvPaths(options) {
|
|
134
|
+
const maxDepth = options.maxDepth ?? 5;
|
|
135
|
+
const includeHidden = options.includeHidden ?? false;
|
|
136
|
+
const includeUserHomeCache = options.includeUserHomeCache ?? true;
|
|
137
|
+
const dedupe = options.dedupe ?? true;
|
|
138
|
+
const roots = [...options.roots];
|
|
139
|
+
if (includeUserHomeCache) {
|
|
140
|
+
roots.push(path.join(os.homedir(), ".venvkit", "envs"));
|
|
141
|
+
roots.push(path.join(os.homedir(), ".virtualenvs"));
|
|
142
|
+
}
|
|
143
|
+
const pythonPaths = [];
|
|
144
|
+
// Fast pass: project-local patterns in each root
|
|
145
|
+
for (const r of options.roots) {
|
|
146
|
+
const locals = await discoverProjectLocalRoots(r);
|
|
147
|
+
for (const venvRoot of locals) {
|
|
148
|
+
const py = await detectVenvAt(venvRoot);
|
|
149
|
+
if (py)
|
|
150
|
+
pythonPaths.push(py);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Walk: find pyvenv.cfg
|
|
154
|
+
for (const root of roots) {
|
|
155
|
+
if (!(await isDir(root)))
|
|
156
|
+
continue;
|
|
157
|
+
await walkForVenvs(root, maxDepth, includeHidden, pythonPaths);
|
|
158
|
+
}
|
|
159
|
+
// Optional: base interpreter candidates
|
|
160
|
+
const bases = await discoverBasePythons();
|
|
161
|
+
for (const b of bases)
|
|
162
|
+
pythonPaths.push(b);
|
|
163
|
+
const final = dedupe ? [...new Map(pythonPaths.map((p) => [norm(p), p])).values()] : pythonPaths;
|
|
164
|
+
// crude counts
|
|
165
|
+
const foundBases = bases.length;
|
|
166
|
+
const foundVenvs = Math.max(0, final.length - foundBases);
|
|
167
|
+
return {
|
|
168
|
+
pythonPaths: final,
|
|
169
|
+
meta: {
|
|
170
|
+
scannedRoots: roots,
|
|
171
|
+
maxDepth,
|
|
172
|
+
foundVenvs,
|
|
173
|
+
foundBases,
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=scanEnvPaths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanEnvPaths.js","sourceRoot":"","sources":["../scanEnvPaths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanEnvPaths.test.d.ts","sourceRoot":"","sources":["../scanEnvPaths.test.ts"],"names":[],"mappings":""}
|