UNPKG

@nestbox-ai/cli

Version:

The cli tools that helps developers to build agents

183 lines 10.7 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.registerCreateCommand = registerCreateCommand; const chalk_1 = __importDefault(require("chalk")); const ora_1 = __importDefault(require("ora")); const project_1 = require("../../utils/project"); const apiUtils_1 = require("./apiUtils"); const inquirer_1 = __importDefault(require("inquirer")); const axios_1 = __importDefault(require("axios")); const user_1 = require("../../utils/user"); function registerCreateCommand(computeCommand) { computeCommand .command('create') .description('Create a new compute instance') .requiredOption('--image <imageId>', 'Image ID to use for the compute instance') .option('--project <projectId>', 'Project ID or name (defaults to the current project)') .action((options) => __awaiter(this, void 0, void 0, function* () { var _a, _b, _c; try { const apis = (0, apiUtils_1.createComputeApis)(); if (!apis) { return; } const { miscellaneousApi, projectsApi, authToken } = apis; // Resolve project using the shared utility const project = yield (0, project_1.resolveProject)(projectsApi, options); const spinner = (0, ora_1.default)(`Fetching available images...`).start(); try { // Get available images data const response = yield miscellaneousApi.miscellaneousControllerGetData(); const availableImages = response.data || []; // Find the selected image const selectedImage = availableImages.find((image) => image.id === options.image); if (!selectedImage) { spinner.fail(`Image ID '${options.image}' does not exist.`); console.log(chalk_1.default.yellow('Available image IDs:')); availableImages.forEach((img) => { console.log(` ${chalk_1.default.cyan(img.id)} - ${img.name} (${img.type})`); }); return; } spinner.succeed(`Found image: ${selectedImage.name}`); // Ask for instance name first const instanceNameAnswer = yield inquirer_1.default.prompt([ { type: 'input', name: 'instanceName', message: 'Enter a name for this compute instance:', validate: (input) => { if (!input || input.trim() === '') { return 'Instance name cannot be empty'; } return true; } } ]); const instanceName = instanceNameAnswer.instanceName; // Directly create the provisioningParams object with the structure needed for API let provisioningParams = {}; if (selectedImage.provisioningParameters && selectedImage.provisioningParameters.properties) { const requiredParams = selectedImage.provisioningParameters.required || []; const paramProperties = selectedImage.provisioningParameters.properties; // Build questions for inquirer const questions = []; for (const [paramName, paramConfig] of Object.entries(paramProperties)) { const isRequired = requiredParams.includes(paramName); const paramUI = ((_a = selectedImage.provisioningParametersUI) === null || _a === void 0 ? void 0 : _a[paramName]) || {}; let question = { name: paramName, message: paramUI['ui:title'] || `Enter ${paramName}:`, when: isRequired // Only ask required params by default }; // Handle different parameter types if (paramConfig.type === 'string') { if (paramConfig.enum) { question.type = 'list'; question.choices = paramConfig.enum; } else if (paramUI['ui:widget'] === 'password') { question.type = 'password'; } else { question.type = 'input'; } } else if (paramConfig.type === 'array') { if (paramConfig.items && paramConfig.items.enum) { question.type = 'checkbox'; question.choices = paramConfig.items.enum; // Ensure at least one option is selected for required array parameters question.validate = (input) => { if (isRequired && (!input || input.length === 0)) { return 'Please select at least one option'; } return true; }; } } if (paramUI['ui:help']) { question.message += ` (${paramUI['ui:help']})`; } questions.push(question); } if (questions.length > 0) { console.log(chalk_1.default.blue(`\nPlease provide the required parameters for ${selectedImage.name}:`)); const answers = yield inquirer_1.default.prompt(questions); // Assign the answers directly to provisioningParams for (const [key, value] of Object.entries(answers)) { provisioningParams[key] = value; } } } // Now we have all the required params in provisioningParams console.log(chalk_1.default.green(`\nCreating compute instance '${instanceName}' with image '${selectedImage.name}'`)); console.log(chalk_1.default.dim('Using the following parameters:')); for (const [key, value] of Object.entries(provisioningParams)) { console.log(chalk_1.default.dim(` ${key}: ${Array.isArray(value) ? value.join(', ') : value}`)); } // Start a spinner for the creation process const creationSpinner = (0, ora_1.default)('Creating compute instance...').start(); const getUserData = yield (0, user_1.userData)(); try { const createParams = Object.assign({ userId: getUserData.id, machineId: selectedImage.id, machineTitle: selectedImage.name, instanceName: instanceName }, provisioningParams); const createResponse = yield axios_1.default.post(`${authToken.serverUrl}/projects/${project.id}/instances`, createParams, { headers: { Authorization: authToken.token, }, }); creationSpinner.succeed('Compute instance created successfully!'); console.log(chalk_1.default.green(`\nInstance '${instanceName}' is now being provisioned`)); console.log(chalk_1.default.gray('You can check the status with: nestbox compute list')); console.log(chalk_1.default.green("Instance created successfully!")); } catch (createError) { creationSpinner.fail('Failed to create compute instance'); if (createError.response && createError.response.status === 401) { console.error(chalk_1.default.red('Authentication token has expired. Please login again using "nestbox login <domain>".')); } else if (createError.response) { console.error(chalk_1.default.red('API Error:'), ((_b = createError.response.data) === null || _b === void 0 ? void 0 : _b.message) || 'Unknown error'); } else { console.error(chalk_1.default.red('Error:'), createError.message || 'Unknown error'); } } } catch (error) { spinner.fail('Failed to fetch available images'); if (error.response && error.response.status === 401) { console.error(chalk_1.default.red('Authentication token has expired. Please login again using "nestbox login <domain>".')); } else if (error.response) { console.error(chalk_1.default.red('API Error:'), ((_c = error.response.data) === null || _c === void 0 ? void 0 : _c.message) || 'Unknown error'); } else { console.error(chalk_1.default.red('Error:'), error.message || 'Unknown error'); } } } catch (error) { if (error.response && error.response.status === 401) { console.error(chalk_1.default.red('Authentication token has expired. Please login again using "nestbox login <domain>".')); } else { console.error(chalk_1.default.red('Error:'), error.message || 'Unknown error'); } } })); } //# sourceMappingURL=create.js.map