import * as api from "./api"; type CommandHandler = () => Promise; const COMMANDS: Record = { status: async () => console.log(JSON.stringify(await api.fetchStatus(), null, 2)), gpus: async () => console.log(JSON.stringify(await api.fetchGPUs(), null, 2)), recipes: async () => console.log(JSON.stringify(await api.fetchRecipes(), null, 2)), config: async () => console.log(JSON.stringify(await api.fetchConfig(), null, 2)), metrics: async () => console.log(JSON.stringify(await api.fetchLifetimeMetrics(), null, 2)), evict: async () => { const ok = await api.evictModel(); console.log(JSON.stringify({ success: ok })); process.exit(ok ? 0 : 1); }, launch: async () => { const id = process.argv[3]; if (!id) { console.error("Usage: vllm-studio launch "); process.exit(1); } const ok = await api.launchRecipe(id); console.log(JSON.stringify({ success: ok, recipe_id: id })); process.exit(ok ? 0 : 1); }, help: async () => { console.log(`vllm-studio - Model lifecycle management CLI Commands: status Show current model status gpus List GPUs with memory/utilization recipes List available model recipes config Show system configuration metrics Show lifetime metrics launch Launch recipe: vllm-studio launch evict Stop running model help Show this help Environment: VLLM_STUDIO_URL Controller URL (default: http://localhost:8080) Notes: - Headless commands emit JSON on stdout when successful. - Non-zero exit code indicates command failure. Run without arguments for interactive TUI mode.`); }, }; export async function runHeadless(): Promise { try { const cmd = process.argv[2] || "help"; const handler = COMMANDS[cmd]; if (!handler) { throw new Error(`Unknown command: ${cmd}\nRun 'vllm-studio help' for usage.`); } await handler(); } catch (error) { const message = error instanceof Error ? error.message : String(error); console.error(message); process.exit(1); } }