UNPKG

@xtest-cli/cli

Version:

CLI for xtest.ing - AI-powered test generation platform

148 lines • 6.18 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.sessionsCommand = void 0; const commander_1 = require("commander"); const chalk_1 = __importDefault(require("chalk")); const ora_1 = __importDefault(require("ora")); const axios_1 = __importDefault(require("axios")); const config_1 = require("../utils/config"); const cli_table3_1 = __importDefault(require("cli-table3")); exports.sessionsCommand = new commander_1.Command('sessions') .description('Manage browser sessions'); // Add list subcommand exports.sessionsCommand .command('list') .description('List all active browser sessions') .action(async () => { const spinner = (0, ora_1.default)({ text: 'Fetching sessions...', color: 'cyan', }).start(); try { const config = await (0, config_1.getConfig)(); if (!config.apiKey) { spinner.fail('Not authenticated'); console.log(chalk_1.default.gray('\nPlease authenticate first:')); console.log(chalk_1.default.cyan(' xtest auth\n')); process.exit(1); } // Fetch sessions from server const response = await axios_1.default.get(`${config.serverUrl}/api/enhanced-browser/inspector/sessions`, { headers: { 'Authorization': `Bearer ${config.apiKey}`, }, timeout: 5000, }); spinner.succeed('Sessions fetched'); const sessions = response.data.sessions || []; if (sessions.length === 0) { console.log('\n' + chalk_1.default.yellow('šŸ“‹ No active sessions')); console.log(chalk_1.default.gray('\nStart a new session:')); console.log(chalk_1.default.cyan(' xtest browser --interactive\n')); return; } // Create table const table = new cli_table3_1.default({ head: [ chalk_1.default.cyan('Session ID'), chalk_1.default.cyan('Mode'), chalk_1.default.cyan('Browser'), chalk_1.default.cyan('Created'), chalk_1.default.cyan('Status'), ], style: { head: [], border: ['gray'], }, }); sessions.forEach((session) => { const created = new Date(session.created); const now = new Date(); const ageMinutes = Math.floor((now.getTime() - created.getTime()) / 60000); let ageStr = created.toLocaleTimeString(); if (ageMinutes < 60) { ageStr += chalk_1.default.gray(` (${ageMinutes}m ago)`); } else { ageStr += chalk_1.default.gray(` (${Math.floor(ageMinutes / 60)}h ago)`); } table.push([ chalk_1.default.yellow(session.id), session.mode || 'headed', session.browser || 'chromium', ageStr, chalk_1.default.green('ā— Active'), ]); }); console.log('\n' + chalk_1.default.cyan.bold('šŸ–„ļø Active Browser Sessions')); console.log(table.toString()); console.log('\n' + chalk_1.default.gray('To close a session:')); console.log(chalk_1.default.cyan(' xtest sessions close <session-id>\n')); } catch (error) { spinner.fail('Failed to fetch sessions'); if (error.code === 'ECONNREFUSED') { console.error(chalk_1.default.red('\nāŒ Could not connect to server')); console.error(chalk_1.default.gray(` Server: ${error.config?.baseURL || 'unknown'}`)); } else if (error.response?.status === 401) { console.error(chalk_1.default.red('\nāŒ Authentication failed')); console.error(chalk_1.default.gray(' Your API key may be invalid')); } else { console.error(chalk_1.default.red('\nāŒ Error: ') + error.message); } process.exit(1); } }); // Add subcommand to close a session exports.sessionsCommand .command('close <sessionId>') .description('Close a browser session') .action(async (sessionId) => { const spinner = (0, ora_1.default)({ text: 'Closing session...', color: 'yellow', }).start(); try { const config = await (0, config_1.getConfig)(); if (!config.apiKey) { spinner.fail('Not authenticated'); console.log(chalk_1.default.gray('\nPlease authenticate first:')); console.log(chalk_1.default.cyan(' xtest auth\n')); process.exit(1); } await axios_1.default.delete(`${config.serverUrl}/api/enhanced-browser/inspector/${sessionId}`, { headers: { 'Authorization': `Bearer ${config.apiKey}`, }, timeout: 5000, }); spinner.succeed(`Session ${sessionId} closed`); console.log(chalk_1.default.gray('\nSession has been terminated successfully.\n')); } catch (error) { spinner.fail('Failed to close session'); if (error.response?.status === 404) { console.error(chalk_1.default.red('\nāŒ Session not found')); console.error(chalk_1.default.gray(` Session ID: ${sessionId}`)); } else { console.error(chalk_1.default.red('\nāŒ Error: ') + error.message); } process.exit(1); } }); // Default action shows help exports.sessionsCommand.action(() => { console.log('\n' + chalk_1.default.cyan.bold('šŸ“‹ Session Management Commands\n')); console.log(chalk_1.default.white(' List active sessions:')); console.log(chalk_1.default.cyan(' xtest sessions list\n')); console.log(chalk_1.default.white(' Close a session:')); console.log(chalk_1.default.cyan(' xtest sessions close <session-id>\n')); console.log(chalk_1.default.gray('For more help: ') + chalk_1.default.cyan('xtest sessions --help\n')); }); //# sourceMappingURL=sessions.js.map