#!/usr/bin/env node import inquirer from "inquirer"; import chalk from "chalk"; import boxen from "boxen"; import { ASCII_ART } from "./constants/ascii.js"; import { handleCommandLineOperation, parseCommandLineArgs, } from "./cli/commandParser.js"; import { uploadFile, downloadFile, showLocalFiles, } from "./handlers/fileHandlers.js"; import { installCodex, uninstallCodex, } from "./handlers/installationHandlers.js"; import { runCodex, checkNodeStatus } from "./handlers/nodeHandlers.js"; import { showInfoMessage } from "./utils/messages.js"; import { ConfigService } from "./services/configService.js"; import { openCodexApp } from "./services/codexApp.js"; import { UiService } from "./services/uiService.js"; import { FsService } from "./services/fsService.js"; import { MainMenu } from "./ui/mainMenua.js"; import { InstallMenu } from "./ui/installMenua.js"; import { ConfigMenu } from "./ui/configMenua.js"; import { PathSelector } from "./utils/pathSelector.js"; import { NumberSelector } from "./utils/numberSelector.js"; import { MenuLoop } from "./utils/menuLoop.js"; async function showNavigationMenu() { console.log("\n"); const { choice } = await inquirer.prompt([ { type: "list", name: "choice", message: "What would you like to do?", choices: ["1. Back to main menu", "2. Exit"], pageSize: 2, loop: true, }, ]); switch (choice.split(".")[0]) { case "1": return main(); case "2": handleExit(); } } function handleExit() { console.log( boxen( chalk.cyanBright("👋 Thank you for using Codex Storage CLI! Goodbye!"), { padding: 1, margin: 1, borderStyle: "round", borderColor: "cyan", title: "👋 GOODBYE", titleAlignment: "center", }, ), ); process.exit(0); } export async function main() { const commandArgs = parseCommandLineArgs(); if (commandArgs) { switch (commandArgs.command) { case "upload": await uploadFile( commandArgs.value, handleCommandLineOperation, showNavigationMenu, ); return; case "download": await downloadFile( commandArgs.value, handleCommandLineOperation, showNavigationMenu, ); return; } } process.on("SIGINT", handleExit); process.on("SIGTERM", handleExit); process.on("SIGQUIT", handleExit); const configService = new ConfigService(); const uiService = new UiService(); const fsService = new FsService(); const pathSelector = new PathSelector(uiService, new MenuLoop(), fsService); const numberSelector = new NumberSelector(uiService); const installMenu = new InstallMenu(uiService, configService); const configMenu = new ConfigMenu( uiService, new MenuLoop(), configService, pathSelector, numberSelector, ); const mainMenu = new MainMenu( uiService, new MenuLoop(), installMenu, configMenu, ); // await mainMenu.show(); const pathResult = await pathSelector.show(configService.get().codexPath, true); console.log("Selected path: " + pathResult); return; try { while (true) { console.log("\n" + chalk.cyanBright(ASCII_ART)); const { choice } = await inquirer .prompt([ { type: "list", name: "choice", message: "Select an option:", choices: [ "1. Download and install Codex", "2. Run Codex node", "3. Check node status", "4. Edit Codex configuration", "5. Open Codex App", "6. Upload a file", "7. Download a file", "8. Show local data", "9. Uninstall Codex node", "10. Submit feedback", "11. Exit", ], pageSize: 11, loop: true, }, ]) .catch(() => { handleExit(); return; }); switch (choice.split(".")[0]) { case "1": const installed = await installCodex(config, showNavigationMenu); if (installed) { await showConfigMenu(config); } break; case "2": await runCodex(config, showNavigationMenu); return; case "3": await checkNodeStatus(config, showNavigationMenu); break; case "4": await showConfigMenu(config); break; case "5": openCodexApp(config); break; case "6": await uploadFile( config, null, handleCommandLineOperation, showNavigationMenu, ); break; case "7": await downloadFile( config, null, handleCommandLineOperation, showNavigationMenu, ); break; case "8": await showLocalFiles(config, showNavigationMenu); break; case "9": await uninstallCodex(config, showNavigationMenu); break; case "10": const { exec } = await import("child_process"); const url = "https://tally.so/r/w2DlXb"; const command = process.platform === "win32" ? `start ${url}` : process.platform === "darwin" ? `open ${url}` : `xdg-open ${url}`; exec(command); console.log( showInfoMessage("Opening feedback form in your browser..."), ); break; case "11": handleExit(); return; } console.log("\n"); } } catch (error) { if (error.message.includes("ExitPromptError")) { handleExit(); } else { console.error(chalk.red("An error occurred:", error.message)); handleExit(); } } }