@commit451/salamander
Version:
Never be AFK
126 lines • 4.83 kB
JavaScript
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