UNPKG

@commit451/salamander

Version:

Never be AFK

126 lines 4.83 kB
import { confirm, select } from '@inquirer/prompts'; import chalk from 'chalk'; import { RunnerService } from '../services/runner.js'; import { CommandListener } from '../services/command-listener.js'; import { createRunnerFlow } from './create-runner.js'; import { deleteRunnerFlow } from './delete-runner.js'; import { AuthService } from '../services/auth.js'; export async function runnerSelectionFlow() { console.log(chalk.blue('🏃 Runner Selection')); try { const localRunners = await RunnerService.getAllRunners(); if (localRunners.length === 0) { console.log(chalk.yellow('⚠️ No runners found for this machine.')); console.log('You need to create a runner first.'); const shouldCreate = await select({ message: 'What would you like to do?', choices: [ { name: 'Create a new runner', value: 'create' }, { name: 'Exit', value: 'exit' }, { name: 'Logout', value: 'logout' } ] }); if (shouldCreate === 'create') { await createRunnerFlow(); // After creating a runner, restart the selection process return runnerSelectionFlow(); } else if (shouldCreate === 'logout') { const confirmed = await confirm({ message: 'Are you sure you want to logout?', default: false }); if (confirmed) { await handleLogout(); process.exit(0); } else { return runnerSelectionFlow(); } } else { console.log(chalk.blue('👋 Goodbye!')); process.exit(0); } } console.log(chalk.green(`✅ Found ${localRunners.length} runner(s) for this machine`)); const choices = [ ...localRunners.map(runner => ({ name: formatRunnerChoice(runner), value: `run:${runner.id}`, description: `Listen for commands in ${runner.directory}` })), { name: '➕ Create new runner', value: 'create' }, { name: '🗑️ Delete runner', value: 'delete' }, { name: '🚪 Exit', value: 'exit' }, { name: '❌ Logout', value: 'logout' } ]; const selection = await select({ message: 'Select a runner to start or choose an action:', choices }); if (selection === 'create') { await createRunnerFlow(); return runnerSelectionFlow(); } else if (selection === 'delete') { await deleteRunnerFlow(); return runnerSelectionFlow(); } else if (selection === 'logout') { const confirmed = await confirm({ message: 'Are you sure you want to logout?', default: false }); if (confirmed) { await handleLogout(); process.exit(0); } else { return runnerSelectionFlow(); } } else if (selection === 'exit') { console.log(chalk.blue('👋 Goodbye!')); process.exit(0); } else if (selection.startsWith('run:')) { const runnerId = selection.replace('run:', ''); const runner = localRunners.find(r => r.id === runnerId); if (runner) { const listener = new CommandListener(); await listener.startListening(runner); } else { console.error(chalk.red('❌ Runner not found')); return runnerSelectionFlow(); } } } catch (error) { process.exit(1); } } function formatRunnerChoice(runner) { const lastMessage = runner.lastMessage ? ` • ${runner.lastMessage.substring(0, 50)}${runner.lastMessage.length > 50 ? '...' : ''}` : ''; return `🤖 ${chalk.bold(runner.name)} ${chalk.gray(`[${runner.runnerType}]`)}${chalk.dim(lastMessage)}`; } async function handleLogout() { try { if (AuthService.isAuthenticated) { await AuthService.signOut(); console.log(chalk.blue('👋 Goodbye!')); } else { console.log(chalk.yellow('⚠️ You are not currently signed in')); console.log(chalk.blue('👋 Goodbye!')); } } catch (error) { console.error(chalk.red('❌ Error during logout:'), error.message); console.log(chalk.blue('👋 Goodbye!')); } } //# sourceMappingURL=runner-selection.js.map