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.
- package/LICENSE +21 -0
- package/README.md +154 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +244 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/clone-manager.d.ts +21 -0
- package/dist/core/clone-manager.js +229 -0
- package/dist/core/clone-manager.js.map +1 -0
- package/dist/core/clone-name.d.ts +8 -0
- package/dist/core/clone-name.js +93 -0
- package/dist/core/clone-name.js.map +1 -0
- package/dist/core/context.d.ts +6 -0
- package/dist/core/context.js +12 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/doctor.d.ts +10 -0
- package/dist/core/doctor.js +102 -0
- package/dist/core/doctor.js.map +1 -0
- package/dist/core/launcher.d.ts +7 -0
- package/dist/core/launcher.js +36 -0
- package/dist/core/launcher.js.map +1 -0
- package/dist/core/registry.d.ts +19 -0
- package/dist/core/registry.js +134 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/runtime-cloner.d.ts +10 -0
- package/dist/core/runtime-cloner.js +74 -0
- package/dist/core/runtime-cloner.js.map +1 -0
- package/dist/core/wrapper-manager.d.ts +15 -0
- package/dist/core/wrapper-manager.js +56 -0
- package/dist/core/wrapper-manager.js.map +1 -0
- package/dist/tui/index.d.ts +12 -0
- package/dist/tui/index.js +512 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/menu.d.ts +71 -0
- package/dist/tui/menu.js +487 -0
- package/dist/tui/menu.js.map +1 -0
- package/dist/types.d.ts +43 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/fs.d.ts +9 -0
- package/dist/utils/fs.js +53 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/logger.js +22 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/process.d.ts +20 -0
- package/dist/utils/process.js +90 -0
- package/dist/utils/process.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,512 @@
|
|
|
1
|
+
import { basename, resolve } from "node:path";
|
|
2
|
+
import { sanitizeCloneName, validateCloneName } from "../core/clone-name.js";
|
|
3
|
+
import { promptConfirm, promptMenu, promptText, renderPanel } from "./menu.js";
|
|
4
|
+
export async function runTui(deps) {
|
|
5
|
+
const healthCache = new Map();
|
|
6
|
+
while (true) {
|
|
7
|
+
try {
|
|
8
|
+
const clones = await deps.cloneManager.listClones();
|
|
9
|
+
const action = await promptMenu({
|
|
10
|
+
title: "CODEX MIRROR",
|
|
11
|
+
subtitle: "Multi-account Codex clone manager",
|
|
12
|
+
statusLines: buildDashboardStatusLines(clones, healthCache),
|
|
13
|
+
items: [
|
|
14
|
+
{ label: "Quick Clone", value: "quick", description: "Name only, ready in seconds" },
|
|
15
|
+
{ label: "New Clone Wizard", value: "create", description: "Guided clone creation" },
|
|
16
|
+
{ label: "Manage Clones", value: "manage", description: "Run, login, logout, update, remove" },
|
|
17
|
+
{ label: "Update All Clones", value: "update-all", description: "Re-pin all clones to current Codex" },
|
|
18
|
+
{ label: "Diagnostics", value: "doctor", description: "Health check one or all clones" },
|
|
19
|
+
{ label: "About", value: "about", description: "Project behavior and notes" },
|
|
20
|
+
{ label: "Exit", value: "exit" },
|
|
21
|
+
],
|
|
22
|
+
footer: "Up/Down navigate | Enter select | q exit",
|
|
23
|
+
cancelValue: "exit",
|
|
24
|
+
});
|
|
25
|
+
if (action === "quick") {
|
|
26
|
+
await quickClone(deps);
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (action === "create") {
|
|
30
|
+
await createCloneWizard(deps);
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
if (action === "manage") {
|
|
34
|
+
await manageClones(deps, healthCache);
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
if (action === "update-all") {
|
|
38
|
+
await updateAllClones(deps);
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (action === "doctor") {
|
|
42
|
+
await diagnostics(deps, healthCache);
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (action === "about") {
|
|
46
|
+
printAbout();
|
|
47
|
+
await waitContinue("About Codex Mirror", "Return to main menu", []);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
if (action === "exit") {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
if (isUserAbort(error)) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
await waitContinue("TUI Error", "An unexpected error occurred", [toErrorMessage(error)]);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async function quickClone(deps) {
|
|
63
|
+
const name = await promptText({
|
|
64
|
+
title: "Quick Clone",
|
|
65
|
+
subtitle: "Name only, ready in seconds",
|
|
66
|
+
sectionTitle: "Step 1 of 2",
|
|
67
|
+
lines: ["Provide a clone name.", "Each clone gets isolated runtime and auth state."],
|
|
68
|
+
label: "Clone name",
|
|
69
|
+
footer: "Type name | Enter continue | Esc cancel",
|
|
70
|
+
validate: validateCloneNameForPrompt,
|
|
71
|
+
});
|
|
72
|
+
const normalized = name.trim();
|
|
73
|
+
const suggestedRoot = resolve(deps.defaultCloneBaseDir, sanitizeCloneName(normalized));
|
|
74
|
+
const shouldCreate = await promptConfirm({
|
|
75
|
+
title: "Quick Clone",
|
|
76
|
+
subtitle: "Name only, ready in seconds",
|
|
77
|
+
sectionTitle: "Step 2 of 2",
|
|
78
|
+
lines: [`Name: ${normalized}`, `Storage: ${suggestedRoot}`, "Create this clone now?"],
|
|
79
|
+
footer: "Up/Down navigate | Enter select | Esc cancel",
|
|
80
|
+
defaultValue: true,
|
|
81
|
+
});
|
|
82
|
+
if (!shouldCreate) {
|
|
83
|
+
await waitContinue("Quick Clone", "Cancelled", []);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
renderPanel({
|
|
87
|
+
title: "Quick Clone",
|
|
88
|
+
subtitle: "Working",
|
|
89
|
+
lines: ["Creating isolated runtime + wrapper...", "This can take a few seconds."],
|
|
90
|
+
footer: "Please wait",
|
|
91
|
+
});
|
|
92
|
+
const clone = await deps.cloneManager.createClone({ name: normalized, rootPath: suggestedRoot });
|
|
93
|
+
const doLogin = await promptConfirm({
|
|
94
|
+
title: "Quick Clone",
|
|
95
|
+
subtitle: "Optional login",
|
|
96
|
+
lines: ["Run 'codex login' for this clone now?"],
|
|
97
|
+
defaultValue: false,
|
|
98
|
+
confirmLabel: "Login now",
|
|
99
|
+
cancelLabel: "Skip",
|
|
100
|
+
});
|
|
101
|
+
if (doLogin) {
|
|
102
|
+
await deps.launcher.run(clone, ["login"]);
|
|
103
|
+
}
|
|
104
|
+
await waitContinue("Clone Created", "Quick clone complete", [
|
|
105
|
+
`Name: ${clone.name}`,
|
|
106
|
+
`Path: ${clone.rootPath}`,
|
|
107
|
+
`Wrapper: ${clone.wrapperPath}`,
|
|
108
|
+
]);
|
|
109
|
+
}
|
|
110
|
+
async function createCloneWizard(deps) {
|
|
111
|
+
const name = await promptText({
|
|
112
|
+
title: "New Clone Wizard",
|
|
113
|
+
subtitle: "Guided clone creation",
|
|
114
|
+
sectionTitle: "Step 1 of 3",
|
|
115
|
+
lines: ["Choose a clone name.", "Name must be filesystem-safe and unique."],
|
|
116
|
+
label: "Clone name",
|
|
117
|
+
footer: "Type name | Enter continue | Esc cancel",
|
|
118
|
+
validate: validateCloneNameForPrompt,
|
|
119
|
+
});
|
|
120
|
+
const normalized = name.trim();
|
|
121
|
+
const suggestedRoot = resolve(deps.defaultCloneBaseDir, sanitizeCloneName(normalized));
|
|
122
|
+
const shouldCreate = await promptConfirm({
|
|
123
|
+
title: "New Clone Wizard",
|
|
124
|
+
subtitle: "Guided clone creation",
|
|
125
|
+
sectionTitle: "Step 2 of 3",
|
|
126
|
+
lines: [`Name: ${normalized}`, `Storage: ${suggestedRoot}`, "Create this clone now?"],
|
|
127
|
+
footer: "Up/Down navigate | Enter select | Esc cancel",
|
|
128
|
+
defaultValue: true,
|
|
129
|
+
});
|
|
130
|
+
if (!shouldCreate) {
|
|
131
|
+
await waitContinue("New Clone Wizard", "Cancelled", []);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
renderPanel({
|
|
135
|
+
title: "New Clone Wizard",
|
|
136
|
+
subtitle: "Guided clone creation",
|
|
137
|
+
sectionTitle: "Step 3 of 3",
|
|
138
|
+
lines: ["Creating isolated runtime + state folders...", "This can take a few seconds."],
|
|
139
|
+
footer: "Please wait",
|
|
140
|
+
});
|
|
141
|
+
const clone = await deps.cloneManager.createClone({ name: normalized, rootPath: suggestedRoot });
|
|
142
|
+
const doLogin = await promptConfirm({
|
|
143
|
+
title: "New Clone Wizard",
|
|
144
|
+
subtitle: "Optional login",
|
|
145
|
+
lines: ["Run 'codex login' for this clone now?"],
|
|
146
|
+
defaultValue: false,
|
|
147
|
+
confirmLabel: "Login now",
|
|
148
|
+
cancelLabel: "Skip",
|
|
149
|
+
});
|
|
150
|
+
if (doLogin) {
|
|
151
|
+
await deps.launcher.run(clone, ["login"]);
|
|
152
|
+
}
|
|
153
|
+
await waitContinue("Clone Created", "Wizard complete", [
|
|
154
|
+
`Name: ${clone.name}`,
|
|
155
|
+
`Path: ${clone.rootPath}`,
|
|
156
|
+
`Wrapper: ${clone.wrapperPath}`,
|
|
157
|
+
]);
|
|
158
|
+
}
|
|
159
|
+
async function manageClones(deps, healthCache) {
|
|
160
|
+
while (true) {
|
|
161
|
+
const clones = await deps.cloneManager.listClones();
|
|
162
|
+
if (clones.length === 0) {
|
|
163
|
+
const action = await promptMenu({
|
|
164
|
+
title: "Manage Clones",
|
|
165
|
+
subtitle: "No clones found",
|
|
166
|
+
statusLines: ["No clones yet. Create one first."],
|
|
167
|
+
items: [
|
|
168
|
+
{ label: "Create Clone", value: "create", description: "Open New Clone Wizard" },
|
|
169
|
+
{ label: "Back", value: "back" },
|
|
170
|
+
],
|
|
171
|
+
initialIndex: 0,
|
|
172
|
+
cancelValue: "back",
|
|
173
|
+
});
|
|
174
|
+
if (action === "create") {
|
|
175
|
+
await createCloneWizard(deps);
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const selected = await promptMenu({
|
|
181
|
+
title: "Manage Clones",
|
|
182
|
+
subtitle: "Select a clone",
|
|
183
|
+
statusLines: ["Choose clone, then run/login/logout/update/remove actions."],
|
|
184
|
+
items: [
|
|
185
|
+
...clones.map((clone) => {
|
|
186
|
+
const cached = healthCache.get(clone.name);
|
|
187
|
+
const health = cached ? (cached.ok ? "OK" : "ISSUE") : "UNKNOWN";
|
|
188
|
+
const auth = cached?.authStatus ?? "unknown";
|
|
189
|
+
return {
|
|
190
|
+
label: `${clone.name} [${health}] [${auth}]`,
|
|
191
|
+
value: clone.name,
|
|
192
|
+
description: `${clone.codexVersionPinned} · ${shortenPathForDisplay(clone.rootPath, 34)}`,
|
|
193
|
+
};
|
|
194
|
+
}),
|
|
195
|
+
{ label: "Back", value: "__back" },
|
|
196
|
+
],
|
|
197
|
+
cancelValue: "__back",
|
|
198
|
+
});
|
|
199
|
+
if (selected === "__back") {
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
const clone = clones.find((item) => item.name === selected);
|
|
203
|
+
if (!clone) {
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
await manageCloneActions(deps, clone, healthCache);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
async function manageCloneActions(deps, clone, healthCache) {
|
|
210
|
+
while (true) {
|
|
211
|
+
const action = await promptMenu({
|
|
212
|
+
title: `Clone: ${clone.name}`,
|
|
213
|
+
subtitle: `${shortenPathForDisplay(clone.rootPath, 68)} · Codex ${clone.codexVersionPinned}`,
|
|
214
|
+
statusLines: [`Wrapper: ${shortenPathForDisplay(clone.wrapperPath, 68)}`],
|
|
215
|
+
items: [
|
|
216
|
+
{ label: "Run (interactive)", value: "run" },
|
|
217
|
+
{ label: "Run with args", value: "run-args" },
|
|
218
|
+
{ label: "Login", value: "login" },
|
|
219
|
+
{ label: "Logout", value: "logout" },
|
|
220
|
+
{ label: "Doctor", value: "doctor" },
|
|
221
|
+
{ label: "Update runtime", value: "update" },
|
|
222
|
+
{ label: "Remove clone", value: "remove" },
|
|
223
|
+
{ label: "Back", value: "back" },
|
|
224
|
+
],
|
|
225
|
+
cancelValue: "back",
|
|
226
|
+
});
|
|
227
|
+
if (action === "run") {
|
|
228
|
+
await deps.launcher.run(clone, []);
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
if (action === "run-args") {
|
|
232
|
+
const rawArgs = await promptText({
|
|
233
|
+
title: `Clone: ${clone.name}`,
|
|
234
|
+
subtitle: "Run with args",
|
|
235
|
+
lines: ['Example: `exec "hello"` or `--model o3`'],
|
|
236
|
+
label: "Arguments",
|
|
237
|
+
footer: "Type args | Enter run | Esc cancel",
|
|
238
|
+
});
|
|
239
|
+
const args = splitArgs(rawArgs);
|
|
240
|
+
await deps.launcher.run(clone, args);
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
if (action === "login") {
|
|
244
|
+
await deps.launcher.run(clone, ["login"]);
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
if (action === "logout") {
|
|
248
|
+
await deps.launcher.run(clone, ["logout"]);
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
if (action === "doctor") {
|
|
252
|
+
const result = await deps.doctor.checkOne(clone);
|
|
253
|
+
healthCache.set(clone.name, result);
|
|
254
|
+
await showDoctorResults([result]);
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
if (action === "update") {
|
|
258
|
+
const updated = await deps.cloneManager.updateClone(clone.name);
|
|
259
|
+
clone.codexVersionPinned = updated.codexVersionPinned;
|
|
260
|
+
clone.updatedAt = updated.updatedAt;
|
|
261
|
+
clone.runtimeEntryPath = updated.runtimeEntryPath;
|
|
262
|
+
clone.runtimeKind = updated.runtimeKind;
|
|
263
|
+
clone.wrapperPath = updated.wrapperPath;
|
|
264
|
+
await waitContinue("Clone Updated", clone.name, [`Pinned Codex version: ${clone.codexVersionPinned}`]);
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
if (action === "remove") {
|
|
268
|
+
const shouldRemove = await promptConfirm({
|
|
269
|
+
title: `Clone: ${clone.name}`,
|
|
270
|
+
subtitle: "Remove clone",
|
|
271
|
+
lines: [`Delete clone '${clone.name}'? This removes runtime + local state.`],
|
|
272
|
+
defaultValue: false,
|
|
273
|
+
confirmLabel: "Remove",
|
|
274
|
+
cancelLabel: "Cancel",
|
|
275
|
+
});
|
|
276
|
+
if (!shouldRemove) {
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
await deps.cloneManager.removeClone(clone.name);
|
|
280
|
+
healthCache.delete(clone.name);
|
|
281
|
+
await waitContinue("Clone Removed", clone.name, []);
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
if (action === "back") {
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
async function updateAllClones(deps) {
|
|
290
|
+
const clones = await deps.cloneManager.listClones();
|
|
291
|
+
if (clones.length === 0) {
|
|
292
|
+
await waitContinue("Update All Clones", "No clones found", ["Create at least one clone first."]);
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
const shouldUpdate = await promptConfirm({
|
|
296
|
+
title: "Update All Clones",
|
|
297
|
+
subtitle: "Bulk runtime update",
|
|
298
|
+
lines: [`Update all ${clones.length} clone(s) to current Codex version?`],
|
|
299
|
+
defaultValue: true,
|
|
300
|
+
});
|
|
301
|
+
if (!shouldUpdate) {
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
const updated = await deps.cloneManager.updateAll();
|
|
305
|
+
await waitContinue("Update All Clones", "Completed", [`Updated ${updated.length} clone(s).`]);
|
|
306
|
+
}
|
|
307
|
+
async function diagnostics(deps, healthCache) {
|
|
308
|
+
const clones = await deps.cloneManager.listClones();
|
|
309
|
+
if (clones.length === 0) {
|
|
310
|
+
await waitContinue("Diagnostics", "No clones found", ["Create at least one clone to run diagnostics."]);
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
const scope = await promptMenu({
|
|
314
|
+
title: "Diagnostics",
|
|
315
|
+
subtitle: "Health check scope",
|
|
316
|
+
statusLines: ["Run detailed health checks with auth status detection."],
|
|
317
|
+
items: [
|
|
318
|
+
{ label: "All clones", value: "all" },
|
|
319
|
+
{ label: "Single clone", value: "one" },
|
|
320
|
+
{ label: "Back", value: "back" },
|
|
321
|
+
],
|
|
322
|
+
cancelValue: "back",
|
|
323
|
+
});
|
|
324
|
+
if (scope === "back") {
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
if (scope === "all") {
|
|
328
|
+
renderPanel({
|
|
329
|
+
title: "Diagnostics",
|
|
330
|
+
subtitle: "Running checks",
|
|
331
|
+
lines: [`Checking ${clones.length} clone(s)...`],
|
|
332
|
+
footer: "Please wait",
|
|
333
|
+
});
|
|
334
|
+
const results = await deps.doctor.checkMany(clones);
|
|
335
|
+
for (const result of results) {
|
|
336
|
+
healthCache.set(result.name, result);
|
|
337
|
+
}
|
|
338
|
+
await showDoctorResults(results);
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
const selected = await promptMenu({
|
|
342
|
+
title: "Diagnostics",
|
|
343
|
+
subtitle: "Select clone",
|
|
344
|
+
statusLines: ["Run deep health check for one clone."],
|
|
345
|
+
items: [...clones.map((clone) => ({ label: clone.name, value: clone.name })), { label: "Back", value: "__back" }],
|
|
346
|
+
cancelValue: "__back",
|
|
347
|
+
});
|
|
348
|
+
if (selected === "__back") {
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
const clone = clones.find((item) => item.name === selected);
|
|
352
|
+
if (!clone) {
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
renderPanel({
|
|
356
|
+
title: "Diagnostics",
|
|
357
|
+
subtitle: clone.name,
|
|
358
|
+
lines: ["Running health check..."],
|
|
359
|
+
footer: "Please wait",
|
|
360
|
+
});
|
|
361
|
+
const result = await deps.doctor.checkOne(clone);
|
|
362
|
+
healthCache.set(result.name, result);
|
|
363
|
+
await showDoctorResults([result]);
|
|
364
|
+
}
|
|
365
|
+
function buildDashboardStatusLines(clones, healthCache) {
|
|
366
|
+
const lines = [];
|
|
367
|
+
const cachedResults = clones
|
|
368
|
+
.map((clone) => healthCache.get(clone.name))
|
|
369
|
+
.filter((result) => result !== undefined);
|
|
370
|
+
const summary = summarize(cachedResults);
|
|
371
|
+
lines.push(`Clones: ${clones.length}`);
|
|
372
|
+
if (cachedResults.length === 0) {
|
|
373
|
+
lines.push("Health: unknown (run Diagnostics to populate)");
|
|
374
|
+
lines.push("Auth: unknown");
|
|
375
|
+
}
|
|
376
|
+
else {
|
|
377
|
+
lines.push(`Health: ${summary.healthy} healthy / ${summary.issues} issues`);
|
|
378
|
+
lines.push(`Auth: logged_in ${summary.loggedIn} | not_logged_in ${summary.notLoggedIn} | unknown ${summary.unknownAuth}`);
|
|
379
|
+
if (cachedResults.length < clones.length) {
|
|
380
|
+
lines.push(`Cached health for ${cachedResults.length}/${clones.length} clone(s).`);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
if (clones.length === 0) {
|
|
384
|
+
lines.push("No clones yet. Create one from Quick Clone.");
|
|
385
|
+
return lines;
|
|
386
|
+
}
|
|
387
|
+
lines.push("Recent clones:");
|
|
388
|
+
for (const clone of clones.slice(0, 5)) {
|
|
389
|
+
const result = healthCache.get(clone.name);
|
|
390
|
+
const health = result ? (result.ok ? "OK" : "ISSUE") : "UNKNOWN";
|
|
391
|
+
const auth = result?.authStatus ?? "unknown";
|
|
392
|
+
lines.push(`- ${clone.name} [${health}] [${auth}] ${shortenPathForDisplay(clone.rootPath, 34)}`);
|
|
393
|
+
}
|
|
394
|
+
return lines;
|
|
395
|
+
}
|
|
396
|
+
function summarize(results) {
|
|
397
|
+
const summary = {
|
|
398
|
+
total: results.length,
|
|
399
|
+
healthy: 0,
|
|
400
|
+
issues: 0,
|
|
401
|
+
loggedIn: 0,
|
|
402
|
+
notLoggedIn: 0,
|
|
403
|
+
unknownAuth: 0,
|
|
404
|
+
};
|
|
405
|
+
for (const result of results) {
|
|
406
|
+
if (result.ok) {
|
|
407
|
+
summary.healthy += 1;
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
summary.issues += 1;
|
|
411
|
+
}
|
|
412
|
+
if (result.authStatus === "logged_in") {
|
|
413
|
+
summary.loggedIn += 1;
|
|
414
|
+
}
|
|
415
|
+
else if (result.authStatus === "not_logged_in") {
|
|
416
|
+
summary.notLoggedIn += 1;
|
|
417
|
+
}
|
|
418
|
+
else {
|
|
419
|
+
summary.unknownAuth += 1;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
return summary;
|
|
423
|
+
}
|
|
424
|
+
function printAbout() {
|
|
425
|
+
renderPanel({
|
|
426
|
+
title: "About Codex Mirror",
|
|
427
|
+
subtitle: "Project behavior and notes",
|
|
428
|
+
lines: [
|
|
429
|
+
"Creates centrally-managed isolated Codex clones.",
|
|
430
|
+
"Each clone has its own auth/session/config state.",
|
|
431
|
+
"Runtime is pinned per clone and updated on demand.",
|
|
432
|
+
"Diagnostics checks runtime, wrapper, writable paths, and auth status.",
|
|
433
|
+
"Use Quick Clone for fastest flow, Wizard for guided setup.",
|
|
434
|
+
],
|
|
435
|
+
footer: "Open source utility for multi-account local workflows",
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
async function waitContinue(title, subtitle, lines) {
|
|
439
|
+
await promptMenu({
|
|
440
|
+
title,
|
|
441
|
+
subtitle,
|
|
442
|
+
statusLines: lines.length > 0 ? lines : [" "],
|
|
443
|
+
summaryTitle: "[ Details ]",
|
|
444
|
+
items: [{ label: "Continue", value: "continue" }],
|
|
445
|
+
actionsTitle: "[ Continue ]",
|
|
446
|
+
footer: "Enter to continue | Esc back",
|
|
447
|
+
cancelValue: "continue",
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
async function showDoctorResults(results) {
|
|
451
|
+
const lines = [];
|
|
452
|
+
if (results.length === 0) {
|
|
453
|
+
lines.push("No diagnostics results.");
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
for (const result of results) {
|
|
457
|
+
lines.push(`${result.ok ? "OK" : "FAIL"} ${result.name}`);
|
|
458
|
+
lines.push(` auth: ${result.authStatus} | writable: ${result.writable ? "yes" : "no"}`);
|
|
459
|
+
lines.push(` runtime: ${shortenPathForDisplay(result.runtimePath, 74)}`);
|
|
460
|
+
lines.push(` wrapper: ${shortenPathForDisplay(result.wrapperPath, 74)}`);
|
|
461
|
+
if (result.errors.length > 0) {
|
|
462
|
+
for (const error of result.errors) {
|
|
463
|
+
lines.push(` - ${error}`);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
await promptMenu({
|
|
469
|
+
title: "Diagnostics Results",
|
|
470
|
+
subtitle: "Health checks",
|
|
471
|
+
statusLines: lines,
|
|
472
|
+
summaryTitle: "[ Results ]",
|
|
473
|
+
items: [{ label: "Back", value: "back" }],
|
|
474
|
+
actionsTitle: "[ Next ]",
|
|
475
|
+
footer: "Enter to return | Esc back",
|
|
476
|
+
cancelValue: "back",
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
function splitArgs(value) {
|
|
480
|
+
if (!value.trim()) {
|
|
481
|
+
return [];
|
|
482
|
+
}
|
|
483
|
+
const matches = value.match(/(?:[^\s"']+|"[^"]*"|'[^']*')+/g);
|
|
484
|
+
if (!matches) {
|
|
485
|
+
return [];
|
|
486
|
+
}
|
|
487
|
+
return matches.map((part) => part.replace(/^"|"$/g, "").replace(/^'|'$/g, ""));
|
|
488
|
+
}
|
|
489
|
+
function validateCloneNameForPrompt(value) {
|
|
490
|
+
const result = validateCloneName(value);
|
|
491
|
+
return result.ok ? true : result.error ?? "Invalid clone name";
|
|
492
|
+
}
|
|
493
|
+
export function shortenPathForDisplay(value, maxLength) {
|
|
494
|
+
if (value.length <= maxLength) {
|
|
495
|
+
return value;
|
|
496
|
+
}
|
|
497
|
+
const suffix = basename(value);
|
|
498
|
+
const headBudget = Math.max(0, maxLength - suffix.length - 4);
|
|
499
|
+
const head = value.slice(0, headBudget);
|
|
500
|
+
return `${head}.../${suffix}`.slice(0, maxLength);
|
|
501
|
+
}
|
|
502
|
+
function isUserAbort(error) {
|
|
503
|
+
const message = toErrorMessage(error).toLowerCase();
|
|
504
|
+
return (message.includes("aborted by user") ||
|
|
505
|
+
message.includes("user force closed") ||
|
|
506
|
+
message.includes("sigint") ||
|
|
507
|
+
message.includes("cancelled"));
|
|
508
|
+
}
|
|
509
|
+
function toErrorMessage(error) {
|
|
510
|
+
return error instanceof Error ? error.message : String(error);
|
|
511
|
+
}
|
|
512
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tui/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export interface MenuItem<T> {
|
|
2
|
+
label: string;
|
|
3
|
+
value: T;
|
|
4
|
+
description?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface MenuOptions<T> {
|
|
7
|
+
title: string;
|
|
8
|
+
subtitle?: string;
|
|
9
|
+
statusLines?: string[];
|
|
10
|
+
summaryTitle?: string;
|
|
11
|
+
items: MenuItem<T>[];
|
|
12
|
+
actionsTitle?: string;
|
|
13
|
+
footer?: string;
|
|
14
|
+
initialIndex?: number;
|
|
15
|
+
cancelValue?: T;
|
|
16
|
+
}
|
|
17
|
+
export interface PanelOptions {
|
|
18
|
+
title: string;
|
|
19
|
+
subtitle?: string;
|
|
20
|
+
sectionTitle?: string;
|
|
21
|
+
lines?: string[];
|
|
22
|
+
footer?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface TextPromptOptions {
|
|
25
|
+
title: string;
|
|
26
|
+
subtitle?: string;
|
|
27
|
+
sectionTitle?: string;
|
|
28
|
+
lines?: string[];
|
|
29
|
+
label: string;
|
|
30
|
+
footer?: string;
|
|
31
|
+
initialValue?: string;
|
|
32
|
+
validate?: (value: string) => true | string;
|
|
33
|
+
}
|
|
34
|
+
export interface ConfirmPromptOptions {
|
|
35
|
+
title: string;
|
|
36
|
+
subtitle?: string;
|
|
37
|
+
sectionTitle?: string;
|
|
38
|
+
lines?: string[];
|
|
39
|
+
footer?: string;
|
|
40
|
+
defaultValue?: boolean;
|
|
41
|
+
confirmLabel?: string;
|
|
42
|
+
cancelLabel?: string;
|
|
43
|
+
}
|
|
44
|
+
type ParsedKey = {
|
|
45
|
+
kind: "up";
|
|
46
|
+
} | {
|
|
47
|
+
kind: "down";
|
|
48
|
+
} | {
|
|
49
|
+
kind: "enter";
|
|
50
|
+
} | {
|
|
51
|
+
kind: "escape";
|
|
52
|
+
} | {
|
|
53
|
+
kind: "ctrl-c";
|
|
54
|
+
} | {
|
|
55
|
+
kind: "backspace";
|
|
56
|
+
} | {
|
|
57
|
+
kind: "char";
|
|
58
|
+
value: string;
|
|
59
|
+
};
|
|
60
|
+
export declare function promptMenu<T>(options: MenuOptions<T>): Promise<T>;
|
|
61
|
+
export declare function promptText(options: TextPromptOptions): Promise<string>;
|
|
62
|
+
export declare function promptConfirm(options: ConfirmPromptOptions): Promise<boolean>;
|
|
63
|
+
export declare function renderPanel(options: PanelOptions): void;
|
|
64
|
+
declare function parseKeys(input: string): {
|
|
65
|
+
keys: ParsedKey[];
|
|
66
|
+
rest: string;
|
|
67
|
+
};
|
|
68
|
+
export declare const __menuTestUtils: {
|
|
69
|
+
parseKeys: typeof parseKeys;
|
|
70
|
+
};
|
|
71
|
+
export {};
|