@nestbox-ai/cli
Version:
The cli tools that helps developers to build agents
148 lines (126 loc) • 5.99 kB
text/typescript
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');
}
}
});
}