UNPKG

@nestbox-ai/cli

Version:

The cli tools that helps developers to build agents

148 lines (126 loc) 5.99 kB
import { Command } from "commander"; import chalk from "chalk"; import ora from "ora"; import { resolveProject } from "../../utils/project"; import { createComputeApis } from "./apiUtils"; import inquirer from "inquirer"; import axios from "axios"; export function registerDeleteCommand(computeCommand: Command): void { computeCommand .command('delete') .description('Delete one or more compute instances') .option('--project <projectId>', 'Project ID or name (defaults to the current project)') .option('--force', 'Skip confirmation prompt') .action(async (options) => { try { const apis = createComputeApis(); if (!apis) { return; } const { machineInstanceApi, projectsApi, authToken } = apis; // Resolve project using the shared utility const project = await resolveProject(projectsApi, options); const spinner = ora(`Fetching compute instances for project: ${project.name}`).start(); try { // Fetch machine instances for the project const instancesResponse: any = await machineInstanceApi.machineInstancesControllerGetMachineInstanceByUserId( project.id, 0, // page 50 // limit - increased to show more instances ); spinner.succeed('Successfully retrieved compute instances'); const instances = instancesResponse.data?.machineInstances || []; if (instances.length === 0) { console.log(chalk.yellow('No compute instances found for this project.')); return; } // Create choices for the selection prompt const instanceChoices = instances.map((instance: any) => ({ name: `${instance.instanceName || 'Unnamed'} (${instance.id})`, value: instance.id, short: instance.instanceName || instance.id })); // Prompt user to select instances to delete const { selectedInstances } = await inquirer.prompt([ { type: 'checkbox', name: 'selectedInstances', message: 'Select compute instances to delete:', choices: instanceChoices, validate: (input) => { if (input.length === 0) { return 'Please select at least one instance to delete'; } return true; } } ]); if (selectedInstances.length === 0) { console.log(chalk.yellow('No instances selected for deletion.')); return; } // Show selected instances console.log(chalk.yellow('\nSelected instances for deletion:')); const selectedInstanceDetails = instances .filter((instance: any) => selectedInstances.includes(instance.id)) .map((instance: any) => ` - ${chalk.cyan(instance.instanceName || 'Unnamed')} (${instance.id})`); console.log(selectedInstanceDetails.join('\n')); // Confirm deletion if not using --force if (!options.force) { const { confirmDeletion } = await inquirer.prompt([ { type: 'confirm', name: 'confirmDeletion', message: chalk.red('Are you sure you want to delete these instances? This cannot be undone.'), default: false } ]); if (!confirmDeletion) { console.log(chalk.yellow('Deletion cancelled.')); return; } } // Process deletion - using single request with all selected IDs const deleteSpinner = ora(`Deleting ${selectedInstances.length} instance(s)...`).start(); try { await axios.delete( `${authToken.serverUrl}/projects/${project.id}/instances`, { data: { ids: selectedInstances }, headers: { Authorization: authToken.token, } } ); deleteSpinner.succeed(`Successfully deleted ${selectedInstances.length} instance(s)`); console.log(chalk.green('\nAll selected instances have been deleted')); console.log(chalk.gray('You can verify with: nestbox compute list')); } catch (error: any) { deleteSpinner.fail(`Failed to delete instances`); if (error.response && error.response.status === 401) { console.error(chalk.red('Authentication token has expired. Please login again using "nestbox login <domain>".')); } else if (error.response) { console.error(chalk.red('API Error:'), error.response.data?.message || 'Unknown error'); } else { console.error(chalk.red('Error:'), error.message || 'Unknown error'); } } } catch (error: any) { spinner.fail('Failed to retrieve compute instances'); if (error.response && error.response.status === 401) { console.error(chalk.red('Authentication token has expired. Please login again using "nestbox login <domain>".')); } else if (error.response) { console.error(chalk.red('API Error:'), error.response.data?.message || 'Unknown error'); } else { console.error(chalk.red('Error:'), error.message || 'Unknown error'); } } } catch (error: any) { if (error.response && error.response.status === 401) { console.error(chalk.red('Authentication token has expired. Please login again using "nestbox login <domain>".')); } else { console.error(chalk.red('Error:'), error.message || 'Unknown error'); } } }); }