codex-mirror 0.1.1

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.
Files changed (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +244 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/core/clone-manager.d.ts +21 -0
  7. package/dist/core/clone-manager.js +229 -0
  8. package/dist/core/clone-manager.js.map +1 -0
  9. package/dist/core/clone-name.d.ts +8 -0
  10. package/dist/core/clone-name.js +93 -0
  11. package/dist/core/clone-name.js.map +1 -0
  12. package/dist/core/context.d.ts +6 -0
  13. package/dist/core/context.js +12 -0
  14. package/dist/core/context.js.map +1 -0
  15. package/dist/core/doctor.d.ts +10 -0
  16. package/dist/core/doctor.js +102 -0
  17. package/dist/core/doctor.js.map +1 -0
  18. package/dist/core/launcher.d.ts +7 -0
  19. package/dist/core/launcher.js +36 -0
  20. package/dist/core/launcher.js.map +1 -0
  21. package/dist/core/registry.d.ts +19 -0
  22. package/dist/core/registry.js +134 -0
  23. package/dist/core/registry.js.map +1 -0
  24. package/dist/core/runtime-cloner.d.ts +10 -0
  25. package/dist/core/runtime-cloner.js +74 -0
  26. package/dist/core/runtime-cloner.js.map +1 -0
  27. package/dist/core/wrapper-manager.d.ts +15 -0
  28. package/dist/core/wrapper-manager.js +56 -0
  29. package/dist/core/wrapper-manager.js.map +1 -0
  30. package/dist/tui/index.d.ts +12 -0
  31. package/dist/tui/index.js +512 -0
  32. package/dist/tui/index.js.map +1 -0
  33. package/dist/tui/menu.d.ts +71 -0
  34. package/dist/tui/menu.js +487 -0
  35. package/dist/tui/menu.js.map +1 -0
  36. package/dist/types.d.ts +43 -0
  37. package/dist/types.js +2 -0
  38. package/dist/types.js.map +1 -0
  39. package/dist/utils/fs.d.ts +9 -0
  40. package/dist/utils/fs.js +53 -0
  41. package/dist/utils/fs.js.map +1 -0
  42. package/dist/utils/logger.d.ts +9 -0
  43. package/dist/utils/logger.js +22 -0
  44. package/dist/utils/logger.js.map +1 -0
  45. package/dist/utils/process.d.ts +20 -0
  46. package/dist/utils/process.js +90 -0
  47. package/dist/utils/process.js.map +1 -0
  48. package/package.json +50 -0
@@ -0,0 +1,487 @@
1
+ import { confirm, input, select } from "@inquirer/prompts";
2
+ export async function promptMenu(options) {
3
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
4
+ return promptMenuFallback(options);
5
+ }
6
+ if (options.items.length === 0) {
7
+ throw new Error("Menu requires at least one item");
8
+ }
9
+ return runRawSession((session) => {
10
+ let selected = clamp(options.initialIndex ?? 0, 0, options.items.length - 1);
11
+ const mountedAt = Date.now();
12
+ session.render(() => {
13
+ const lines = buildMenuLines(options, selected);
14
+ return renderFrame(lines, process.stdout.columns ?? 100);
15
+ });
16
+ session.onKey((key) => {
17
+ if (key.kind === "ctrl-c") {
18
+ if (options.cancelValue !== undefined) {
19
+ session.resolve(options.cancelValue);
20
+ return;
21
+ }
22
+ session.reject(new Error("Aborted by user"));
23
+ return;
24
+ }
25
+ // Ignore likely buffered bytes from previous prompt interactions.
26
+ if (Date.now() - mountedAt < 140) {
27
+ return;
28
+ }
29
+ if (key.kind === "escape") {
30
+ if (options.cancelValue !== undefined) {
31
+ session.resolve(options.cancelValue);
32
+ return;
33
+ }
34
+ session.reject(new Error("Aborted by user"));
35
+ return;
36
+ }
37
+ if (key.kind === "up" || (key.kind === "char" && key.value.toLowerCase() === "k")) {
38
+ selected = wrap(selected - 1, options.items.length);
39
+ session.repaint();
40
+ return;
41
+ }
42
+ if (key.kind === "down" || (key.kind === "char" && key.value.toLowerCase() === "j")) {
43
+ selected = wrap(selected + 1, options.items.length);
44
+ session.repaint();
45
+ return;
46
+ }
47
+ if (key.kind === "char" && key.value.toLowerCase() === "q" && options.cancelValue !== undefined) {
48
+ session.resolve(options.cancelValue);
49
+ return;
50
+ }
51
+ if (key.kind === "enter") {
52
+ const item = options.items[selected];
53
+ if (!item) {
54
+ session.reject(new Error("Invalid menu selection"));
55
+ return;
56
+ }
57
+ session.resolve(item.value);
58
+ }
59
+ });
60
+ });
61
+ }
62
+ export async function promptText(options) {
63
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
64
+ return input({
65
+ message: options.label,
66
+ default: options.initialValue,
67
+ validate: options.validate,
68
+ });
69
+ }
70
+ return runRawSession((session) => {
71
+ let value = options.initialValue ?? "";
72
+ let errorLine;
73
+ const mountedAt = Date.now();
74
+ session.render(() => {
75
+ const lines = buildTextPromptLines(options, value, errorLine);
76
+ return renderFrame(lines, process.stdout.columns ?? 100);
77
+ });
78
+ session.onKey((key) => {
79
+ if (Date.now() - mountedAt < 140 && key.kind === "enter") {
80
+ return;
81
+ }
82
+ if (key.kind === "ctrl-c" || key.kind === "escape") {
83
+ session.reject(new Error("Aborted by user"));
84
+ return;
85
+ }
86
+ if (key.kind === "backspace") {
87
+ if (value.length > 0) {
88
+ value = value.slice(0, -1);
89
+ errorLine = undefined;
90
+ session.repaint();
91
+ }
92
+ return;
93
+ }
94
+ if (key.kind === "char") {
95
+ if (isPrintableCharacter(key.value)) {
96
+ value += key.value;
97
+ errorLine = undefined;
98
+ session.repaint();
99
+ }
100
+ return;
101
+ }
102
+ if (key.kind === "enter") {
103
+ if (options.validate) {
104
+ const result = options.validate(value);
105
+ if (result !== true) {
106
+ errorLine = result;
107
+ session.repaint();
108
+ return;
109
+ }
110
+ }
111
+ session.resolve(value);
112
+ }
113
+ });
114
+ });
115
+ }
116
+ export async function promptConfirm(options) {
117
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
118
+ return confirm({
119
+ message: options.lines?.[0] ?? "Confirm?",
120
+ default: options.defaultValue ?? true,
121
+ });
122
+ }
123
+ const yesLabel = options.confirmLabel ?? "Yes";
124
+ const noLabel = options.cancelLabel ?? "No";
125
+ return promptMenu({
126
+ title: options.title,
127
+ subtitle: options.subtitle,
128
+ statusLines: options.lines,
129
+ summaryTitle: "[ Question ]",
130
+ items: options.defaultValue === false
131
+ ? [
132
+ { label: noLabel, value: false },
133
+ { label: yesLabel, value: true },
134
+ ]
135
+ : [
136
+ { label: yesLabel, value: true },
137
+ { label: noLabel, value: false },
138
+ ],
139
+ actionsTitle: "[ Options ]",
140
+ footer: options.footer ?? "Up/Down navigate | Enter select | Esc cancel",
141
+ cancelValue: false,
142
+ });
143
+ }
144
+ export function renderPanel(options) {
145
+ const lines = buildPanelLines(options);
146
+ const frame = renderFrame(lines, process.stdout.columns ?? 100);
147
+ process.stdout.write("\x1b[2J\x1b[H");
148
+ process.stdout.write(frame);
149
+ process.stdout.write("\n");
150
+ }
151
+ async function promptMenuFallback(options) {
152
+ try {
153
+ return await select({
154
+ message: options.subtitle ?? options.title,
155
+ choices: options.items.map((item) => ({
156
+ name: item.description ? `${item.label} - ${item.description}` : item.label,
157
+ value: item.value,
158
+ })),
159
+ });
160
+ }
161
+ catch (error) {
162
+ if (options.cancelValue !== undefined) {
163
+ return options.cancelValue;
164
+ }
165
+ throw error;
166
+ }
167
+ }
168
+ async function runRawSession(setup) {
169
+ const input = process.stdin;
170
+ const output = process.stdout;
171
+ const previousRawMode = input.isTTY ? input.isRaw : false;
172
+ let cleaned = false;
173
+ let parserState = "";
174
+ let keyHandler;
175
+ let renderer;
176
+ const cleanup = () => {
177
+ if (cleaned) {
178
+ return;
179
+ }
180
+ cleaned = true;
181
+ input.off("data", onData);
182
+ if (input.isTTY) {
183
+ input.setRawMode(previousRawMode);
184
+ }
185
+ output.write("\x1b[?25h");
186
+ };
187
+ const repaint = () => {
188
+ if (!renderer) {
189
+ return;
190
+ }
191
+ output.write("\x1b[2J\x1b[H");
192
+ output.write(renderer());
193
+ output.write("\n");
194
+ };
195
+ const onData = (chunk) => {
196
+ parserState += chunk.toString("utf8");
197
+ const parsed = parseKeys(parserState);
198
+ parserState = parsed.rest;
199
+ if (!keyHandler) {
200
+ return;
201
+ }
202
+ for (const key of parsed.keys) {
203
+ if (cleaned) {
204
+ break;
205
+ }
206
+ keyHandler(key);
207
+ }
208
+ };
209
+ drainInputBuffer(input);
210
+ input.resume();
211
+ if (input.isTTY) {
212
+ input.setRawMode(true);
213
+ }
214
+ output.write("\x1b[?25l");
215
+ input.on("data", onData);
216
+ return new Promise((resolve, reject) => {
217
+ const session = {
218
+ render(nextRenderer) {
219
+ renderer = nextRenderer;
220
+ repaint();
221
+ },
222
+ onKey(handler) {
223
+ keyHandler = handler;
224
+ },
225
+ repaint,
226
+ resolve(value) {
227
+ cleanup();
228
+ keyHandler = undefined;
229
+ resolve(value);
230
+ },
231
+ reject(error) {
232
+ cleanup();
233
+ keyHandler = undefined;
234
+ reject(error);
235
+ },
236
+ };
237
+ try {
238
+ setup(session);
239
+ }
240
+ catch (error) {
241
+ cleanup();
242
+ reject(error instanceof Error ? error : new Error(String(error)));
243
+ }
244
+ });
245
+ }
246
+ function buildMenuLines(options, selected) {
247
+ const lines = [];
248
+ const summaryTitle = options.summaryTitle ?? "[ Summary ]";
249
+ const actionsTitle = options.actionsTitle ?? "[ Actions ]";
250
+ lines.push(styleBrand(options.title));
251
+ if (options.subtitle) {
252
+ lines.push(styleMuted(` ${options.subtitle}`));
253
+ }
254
+ if (options.title === "CODEX MIRROR") {
255
+ lines.push(styleMuted(" Official Codex clone manager"));
256
+ }
257
+ lines.push("─");
258
+ lines.push(styleSection(summaryTitle));
259
+ if (options.statusLines && options.statusLines.length > 0) {
260
+ for (const line of options.statusLines) {
261
+ lines.push(` ${line}`);
262
+ }
263
+ }
264
+ else {
265
+ lines.push(" No summary available.");
266
+ }
267
+ lines.push("─");
268
+ lines.push(styleSection(actionsTitle));
269
+ for (let i = 0; i < options.items.length; i += 1) {
270
+ const item = options.items[i];
271
+ if (!item) {
272
+ continue;
273
+ }
274
+ const isSelected = i === selected;
275
+ const index = String(i + 1).padStart(2, " ");
276
+ const label = `${index}. ${item.label}`;
277
+ lines.push(isSelected ? `${stylePointer(">")} ${styleSelected(label)}` : ` ${label}`);
278
+ if (item.description) {
279
+ lines.push(` ${styleMuted(item.description)}`);
280
+ }
281
+ }
282
+ lines.push("─");
283
+ lines.push(styleMuted(options.footer ?? "Up/Down navigate | Enter select | Esc back"));
284
+ return lines;
285
+ }
286
+ function buildTextPromptLines(options, value, errorLine) {
287
+ const lines = [];
288
+ lines.push(styleBrand(options.title));
289
+ if (options.subtitle) {
290
+ lines.push(styleMuted(` ${options.subtitle}`));
291
+ }
292
+ lines.push("─");
293
+ if (options.sectionTitle) {
294
+ lines.push(styleSection(`[ ${options.sectionTitle} ]`));
295
+ }
296
+ if (options.lines && options.lines.length > 0) {
297
+ for (const line of options.lines) {
298
+ lines.push(` ${line}`);
299
+ }
300
+ }
301
+ lines.push("─");
302
+ lines.push(styleSection(`[ ${options.label} ]`));
303
+ lines.push(` ${value}${styleMuted("_")}`);
304
+ if (errorLine) {
305
+ lines.push(styleError(` ${errorLine}`));
306
+ }
307
+ lines.push("─");
308
+ lines.push(styleMuted(options.footer ?? "Type to edit | Enter continue | Esc cancel"));
309
+ return lines;
310
+ }
311
+ function buildPanelLines(options) {
312
+ const lines = [];
313
+ lines.push(styleBrand(options.title));
314
+ if (options.subtitle) {
315
+ lines.push(styleMuted(` ${options.subtitle}`));
316
+ }
317
+ lines.push("─");
318
+ if (options.sectionTitle) {
319
+ lines.push(styleSection(`[ ${options.sectionTitle} ]`));
320
+ }
321
+ if (options.lines && options.lines.length > 0) {
322
+ for (const line of options.lines) {
323
+ lines.push(` ${line}`);
324
+ }
325
+ }
326
+ lines.push("─");
327
+ lines.push(styleMuted(options.footer ?? "Follow the prompt below"));
328
+ return lines;
329
+ }
330
+ function parseKeys(input) {
331
+ const keys = [];
332
+ let index = 0;
333
+ while (index < input.length) {
334
+ const remaining = input.slice(index);
335
+ if (remaining.startsWith("\u001b[A")) {
336
+ keys.push({ kind: "up" });
337
+ index += 3;
338
+ continue;
339
+ }
340
+ if (remaining.startsWith("\u001b[B")) {
341
+ keys.push({ kind: "down" });
342
+ index += 3;
343
+ continue;
344
+ }
345
+ if (remaining.startsWith("\u001bOA")) {
346
+ keys.push({ kind: "up" });
347
+ index += 3;
348
+ continue;
349
+ }
350
+ if (remaining.startsWith("\u001bOB")) {
351
+ keys.push({ kind: "down" });
352
+ index += 3;
353
+ continue;
354
+ }
355
+ const char = input[index];
356
+ if (!char) {
357
+ break;
358
+ }
359
+ if (char === "\u0003") {
360
+ keys.push({ kind: "ctrl-c" });
361
+ index += 1;
362
+ continue;
363
+ }
364
+ if (char === "\r" || char === "\n") {
365
+ keys.push({ kind: "enter" });
366
+ index += 1;
367
+ continue;
368
+ }
369
+ if (char === "\u007f") {
370
+ keys.push({ kind: "backspace" });
371
+ index += 1;
372
+ continue;
373
+ }
374
+ if (char === "\u001b") {
375
+ // Preserve incomplete CSI sequence for the next chunk.
376
+ if (index + 1 >= input.length) {
377
+ break;
378
+ }
379
+ const next = input[index + 1];
380
+ if (next === "[" && index + 2 >= input.length) {
381
+ break;
382
+ }
383
+ keys.push({ kind: "escape" });
384
+ index += 1;
385
+ continue;
386
+ }
387
+ keys.push({ kind: "char", value: char });
388
+ index += 1;
389
+ }
390
+ return {
391
+ keys,
392
+ rest: input.slice(index),
393
+ };
394
+ }
395
+ function renderFrame(lines, columns) {
396
+ const maxLineLength = Math.max(...lines.map((line) => visibleLength(line)), 1);
397
+ const minWidth = 76;
398
+ const maxWidth = Math.max(minWidth, Math.min(96, columns - 2));
399
+ const innerWidth = clamp(maxLineLength + 2, minWidth - 2, maxWidth - 2);
400
+ const width = innerWidth + 2;
401
+ const out = [];
402
+ out.push(`+${"-".repeat(width - 2)}+`);
403
+ for (const line of lines) {
404
+ if (line === "─") {
405
+ out.push(`+${"-".repeat(width - 2)}+`);
406
+ continue;
407
+ }
408
+ const text = truncateText(line, innerWidth);
409
+ const pad = " ".repeat(Math.max(0, innerWidth - visibleLength(text)));
410
+ out.push(`|${text}${pad}|`);
411
+ }
412
+ out.push(`+${"-".repeat(width - 2)}+`);
413
+ return out.join("\n");
414
+ }
415
+ function truncateText(value, maxLength) {
416
+ if (visibleLength(value) <= maxLength) {
417
+ return value;
418
+ }
419
+ if (maxLength <= 1) {
420
+ return value.slice(0, maxLength);
421
+ }
422
+ return `${value.slice(0, Math.max(0, maxLength - 1))}…`;
423
+ }
424
+ function visibleLength(value) {
425
+ return value.replace(/\u001B\[[0-9;]*m/g, "").length;
426
+ }
427
+ function clamp(value, min, max) {
428
+ return Math.min(Math.max(value, min), max);
429
+ }
430
+ function wrap(value, size) {
431
+ if (size <= 0) {
432
+ return 0;
433
+ }
434
+ if (value < 0) {
435
+ return size - 1;
436
+ }
437
+ if (value >= size) {
438
+ return 0;
439
+ }
440
+ return value;
441
+ }
442
+ function drainInputBuffer(input) {
443
+ try {
444
+ // eslint-disable-next-line no-constant-condition
445
+ while (true) {
446
+ const chunk = input.read();
447
+ if (chunk === null) {
448
+ break;
449
+ }
450
+ }
451
+ }
452
+ catch {
453
+ // Ignore buffer drain failures.
454
+ }
455
+ }
456
+ function isPrintableCharacter(value) {
457
+ if (!value) {
458
+ return false;
459
+ }
460
+ const code = value.charCodeAt(0);
461
+ return code >= 32 && code !== 127;
462
+ }
463
+ function styleTitle(value) {
464
+ return `\x1b[1m${value}\x1b[0m`;
465
+ }
466
+ function styleBrand(value) {
467
+ return `\x1b[1;36m${value}\x1b[0m`;
468
+ }
469
+ function styleSection(value) {
470
+ return `\x1b[36m${value}\x1b[0m`;
471
+ }
472
+ function styleMuted(value) {
473
+ return `\x1b[90m${value}\x1b[0m`;
474
+ }
475
+ function styleSelected(value) {
476
+ return `\x1b[1;97m${value}\x1b[0m`;
477
+ }
478
+ function stylePointer(value) {
479
+ return `\x1b[33m${value}\x1b[0m`;
480
+ }
481
+ function styleError(value) {
482
+ return `\x1b[31m${value}\x1b[0m`;
483
+ }
484
+ export const __menuTestUtils = {
485
+ parseKeys,
486
+ };
487
+ //# sourceMappingURL=menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.js","sourceRoot":"","sources":["../../src/tui/menu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AA2D3D,MAAM,CAAC,KAAK,UAAU,UAAU,CAAI,OAAuB;IACzD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClD,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,aAAa,CAAI,CAAC,OAAO,EAAE,EAAE;QAClC,IAAI,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE;YAClB,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAChD,OAAO,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACpB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1B,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;oBACtC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;oBACrC,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBAC7C,OAAO;YACT,CAAC;YAED,kEAAkE;YAClE,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,GAAG,EAAE,CAAC;gBACjC,OAAO;YACT,CAAC;YAED,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1B,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;oBACtC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;oBACrC,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBAC7C,OAAO;YACT,CAAC;YAED,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;gBAClF,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACpD,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO;YACT,CAAC;YAED,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;gBACpF,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACpD,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO;YACT,CAAC;YAED,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;gBAChG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBACrC,OAAO;YACT,CAAC;YAED,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACrC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;oBACpD,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAA0B;IACzD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClD,OAAO,KAAK,CAAC;YACX,OAAO,EAAE,OAAO,CAAC,KAAK;YACtB,OAAO,EAAE,OAAO,CAAC,YAAY;YAC7B,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,aAAa,CAAS,CAAC,OAAO,EAAE,EAAE;QACvC,IAAI,KAAK,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;QACvC,IAAI,SAA6B,CAAC;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE;YAClB,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;YAC9D,OAAO,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACpB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACzD,OAAO;YACT,CAAC;YAED,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACnD,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBAC7C,OAAO;YACT,CAAC;YAED,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC7B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC3B,SAAS,GAAG,SAAS,CAAC;oBACtB,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,CAAC;gBACD,OAAO;YACT,CAAC;YAED,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACxB,IAAI,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;oBACpC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC;oBACnB,SAAS,GAAG,SAAS,CAAC;oBACtB,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,CAAC;gBACD,OAAO;YACT,CAAC;YAED,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACzB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACrB,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;oBACvC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;wBACpB,SAAS,GAAG,MAAM,CAAC;wBACnB,OAAO,CAAC,OAAO,EAAE,CAAC;wBAClB,OAAO;oBACT,CAAC;gBACH,CAAC;gBACD,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA6B;IAC/D,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClD,OAAO,OAAO,CAAC;YACb,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,UAAU;YACzC,OAAO,EAAE,OAAO,CAAC,YAAY,IAAI,IAAI;SACtC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,IAAI,KAAK,CAAC;IAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC;IAC5C,OAAO,UAAU,CAAU;QACzB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,WAAW,EAAE,OAAO,CAAC,KAAK;QAC1B,YAAY,EAAE,cAAc;QAC5B,KAAK,EACH,OAAO,CAAC,YAAY,KAAK,KAAK;YAC5B,CAAC,CAAC;gBACE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;gBAChC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE;aACjC;YACH,CAAC,CAAC;gBACE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE;gBAChC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;aACjC;QACP,YAAY,EAAE,aAAa;QAC3B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,8CAA8C;QACxE,WAAW,EAAE,KAAK;KACnB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAqB;IAC/C,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC;IAChE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAI,OAAuB;IAC1D,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC;YAClB,OAAO,EAAE,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK;YAC1C,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACpC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK;gBAC3E,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC,CAAC;SACJ,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO,OAAO,CAAC,WAAW,CAAC;QAC7B,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAUD,KAAK,UAAU,aAAa,CAAI,KAAiD;IAC/E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,MAAM,eAAe,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1D,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,UAAkD,CAAC;IACvD,IAAI,QAAoC,CAAC;IAEzC,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QACD,OAAO,GAAG,IAAI,CAAC;QACf,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1B,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,CAAC,KAAa,EAAQ,EAAE;QACrC,WAAW,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;QACtC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAC9B,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM;YACR,CAAC;YACD,UAAU,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IAEF,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACxB,KAAK,CAAC,MAAM,EAAE,CAAC;IACf,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC1B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEzB,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACxC,MAAM,OAAO,GAA4B;YACvC,MAAM,CAAC,YAAY;gBACjB,QAAQ,GAAG,YAAY,CAAC;gBACxB,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,KAAK,CAAC,OAAO;gBACX,UAAU,GAAG,OAAO,CAAC;YACvB,CAAC;YACD,OAAO;YACP,OAAO,CAAC,KAAK;gBACX,OAAO,EAAE,CAAC;gBACV,UAAU,GAAG,SAAS,CAAC;gBACvB,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;YACD,MAAM,CAAC,KAAK;gBACV,OAAO,EAAE,CAAC;gBACV,UAAU,GAAG,SAAS,CAAC;gBACvB,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;SACF,CAAC;QAEF,IAAI,CAAC;YACH,KAAK,CAAC,OAAO,CAAC,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAI,OAAuB,EAAE,QAAgB;IAClE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,aAAa,CAAC;IAC3D,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,aAAa,CAAC;IAE3D,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACtC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,KAAK,cAAc,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC;IACvC,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC;IACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QACD,MAAM,UAAU,GAAG,CAAC,KAAK,QAAQ,CAAC;QAClC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,GAAG,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;QACvF,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,SAAS,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,IAAI,4CAA4C,CAAC,CAAC,CAAC;IACvF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,oBAAoB,CAAC,OAA0B,EAAE,KAAa,EAAE,SAAkB;IACzF,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACtC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IACjD,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3C,IAAI,SAAS,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,IAAI,4CAA4C,CAAC,CAAC,CAAC;IACvF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,OAAqB;IAC5C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACtC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,IAAI,yBAAyB,CAAC,CAAC,CAAC;IACpE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,MAAM,IAAI,GAAgB,EAAE,CAAC;IAC7B,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,OAAO,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1B,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5B,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1B,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5B,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM;QACR,CAAC;QAED,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC9B,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YAC7B,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;YACjC,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,uDAAuD;YACvD,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC9B,MAAM;YACR,CAAC;YACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAC9B,IAAI,IAAI,KAAK,GAAG,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC9C,MAAM;YACR,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC9B,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IAED,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;KACzB,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAe,EAAE,OAAe;IACnD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/E,MAAM,QAAQ,GAAG,EAAE,CAAC;IACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/D,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;IACxE,MAAM,KAAK,GAAG,UAAU,GAAG,CAAC,CAAC;IAE7B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACvC,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtE,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;IAC9B,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,YAAY,CAAC,KAAa,EAAE,SAAiB;IACpD,IAAI,aAAa,CAAC,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AAC1D,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,KAAK,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;AACvD,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;IACpD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,IAAI,CAAC,KAAa,EAAE,IAAY;IACvC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;QACd,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,IAAI,GAAG,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAwB;IAChD,IAAI,CAAC;QACH,iDAAiD;QACjD,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAC3B,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,gCAAgC;IAClC,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACjC,OAAO,IAAI,IAAI,EAAE,IAAI,IAAI,KAAK,GAAG,CAAC;AACpC,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,UAAU,KAAK,SAAS,CAAC;AAClC,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,aAAa,KAAK,SAAS,CAAC;AACrC,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,WAAW,KAAK,SAAS,CAAC;AACnC,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,WAAW,KAAK,SAAS,CAAC;AACnC,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,aAAa,KAAK,SAAS,CAAC;AACrC,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,WAAW,KAAK,SAAS,CAAC;AACnC,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,WAAW,KAAK,SAAS,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,SAAS;CACV,CAAC"}
@@ -0,0 +1,43 @@
1
+ export type RuntimeKind = "npm-package" | "binary";
2
+ export interface RuntimeInfo {
3
+ kind: RuntimeKind;
4
+ entryPath: string;
5
+ sourcePath: string;
6
+ version: string;
7
+ sourceCodexPath: string;
8
+ }
9
+ export interface ClonePaths {
10
+ cloneBaseDir: string;
11
+ metadataPath: string;
12
+ runtimeDir: string;
13
+ runtimeEntryPath: string;
14
+ homeDir: string;
15
+ codexHomeDir: string;
16
+ logsDir: string;
17
+ }
18
+ export interface CloneRecord {
19
+ id: string;
20
+ name: string;
21
+ rootPath: string;
22
+ runtimePath: string;
23
+ runtimeEntryPath: string;
24
+ runtimeKind: RuntimeKind;
25
+ wrapperPath: string;
26
+ codexVersionPinned: string;
27
+ createdAt: string;
28
+ updatedAt: string;
29
+ }
30
+ export interface Registry {
31
+ version: 1;
32
+ clones: CloneRecord[];
33
+ }
34
+ export type AuthStatus = "logged_in" | "not_logged_in" | "unknown";
35
+ export interface DoctorResult {
36
+ name: string;
37
+ ok: boolean;
38
+ runtimePath: string;
39
+ wrapperPath: string;
40
+ authStatus: AuthStatus;
41
+ writable: boolean;
42
+ errors: string[];
43
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ export declare function ensureDir(path: string): Promise<void>;
2
+ export declare function exists(path: string): Promise<boolean>;
3
+ export declare function isWritable(path: string): Promise<boolean>;
4
+ export declare function removePath(path: string): Promise<void>;
5
+ export declare function copyDir(from: string, to: string): Promise<void>;
6
+ export declare function copyFile(from: string, to: string): Promise<void>;
7
+ export declare function readJsonFile<T>(path: string): Promise<T>;
8
+ export declare function writeJsonFile(path: string, value: unknown): Promise<void>;
9
+ export declare function isFile(path: string): Promise<boolean>;
@@ -0,0 +1,53 @@
1
+ import { access, cp, mkdir, readFile, rm, stat, writeFile } from "node:fs/promises";
2
+ import { constants } from "node:fs";
3
+ import { dirname } from "node:path";
4
+ export async function ensureDir(path) {
5
+ await mkdir(path, { recursive: true });
6
+ }
7
+ export async function exists(path) {
8
+ try {
9
+ await access(path, constants.F_OK);
10
+ return true;
11
+ }
12
+ catch {
13
+ return false;
14
+ }
15
+ }
16
+ export async function isWritable(path) {
17
+ try {
18
+ await access(path, constants.W_OK);
19
+ return true;
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ }
25
+ export async function removePath(path) {
26
+ await rm(path, { recursive: true, force: true });
27
+ }
28
+ export async function copyDir(from, to) {
29
+ await cp(from, to, { recursive: true, force: true, errorOnExist: false, preserveTimestamps: true });
30
+ }
31
+ export async function copyFile(from, to) {
32
+ await ensureDir(dirname(to));
33
+ await cp(from, to, { recursive: false, force: true });
34
+ }
35
+ export async function readJsonFile(path) {
36
+ const raw = await readFile(path, "utf8");
37
+ return JSON.parse(raw);
38
+ }
39
+ export async function writeJsonFile(path, value) {
40
+ await ensureDir(dirname(path));
41
+ const raw = `${JSON.stringify(value, null, 2)}\n`;
42
+ await writeFile(path, raw, "utf8");
43
+ }
44
+ export async function isFile(path) {
45
+ try {
46
+ const s = await stat(path);
47
+ return s.isFile();
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ }
53
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY;IAC1C,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAY;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAY,EAAE,EAAU;IACpD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC;AACtG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,EAAU;IACrD,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7B,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAI,IAAY;IAChD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,KAAc;IAC9D,MAAM,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IAClD,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAY;IACvC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type LogLevel = "debug" | "info" | "error";
2
+ export declare class Logger {
3
+ private readonly debugEnabled;
4
+ constructor(debugEnabled: boolean);
5
+ debug(message: string): void;
6
+ info(message: string): void;
7
+ error(message: string): void;
8
+ }
9
+ export declare function createLogger(debugEnabled?: boolean): Logger;
@@ -0,0 +1,22 @@
1
+ export class Logger {
2
+ debugEnabled;
3
+ constructor(debugEnabled) {
4
+ this.debugEnabled = debugEnabled;
5
+ }
6
+ debug(message) {
7
+ if (!this.debugEnabled) {
8
+ return;
9
+ }
10
+ console.error(`[debug] ${message}`);
11
+ }
12
+ info(message) {
13
+ console.log(message);
14
+ }
15
+ error(message) {
16
+ console.error(message);
17
+ }
18
+ }
19
+ export function createLogger(debugEnabled = false) {
20
+ return new Logger(debugEnabled);
21
+ }
22
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,MAAM;IACY;IAA7B,YAA6B,YAAqB;QAArB,iBAAY,GAAZ,YAAY,CAAS;IAAG,CAAC;IAEtD,KAAK,CAAC,OAAe;QACnB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;CACF;AAED,MAAM,UAAU,YAAY,CAAC,YAAY,GAAG,KAAK;IAC/C,OAAO,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC;AAClC,CAAC"}