UNPKG

dengun_ai-admin-client

Version:

Cliente simples para integração com o AI Admin Dashboard - Plug and Play

284 lines (277 loc) 11.1 kB
#!/usr/bin/env node "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const axios_1 = __importDefault(require("axios")); const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); function parseArguments() { const args = process.argv.slice(2); const options = {}; for (let i = 0; i < args.length; i += 2) { const key = args[i]; const value = args[i + 1]; switch (key) { case '--name': options.name = value; break; case '--email': options.email = value; break; case '--website': options.website = value; break; case '--description': options.description = value; break; case '--capabilities': options.capabilities = value.split(',').map(c => c.trim()); break; case '--max-tokens': options.maxTokensPerRequest = parseInt(value); break; case '--dashboard-url': options.dashboardUrl = value; break; case '--help': showHelp(); process.exit(0); } } return options; } function showHelp() { console.log(` 🚀 AI Admin Request - Solicitar Conexão com Dashboard Uso: npx ai-admin-request [opções] Opções obrigatórias: --name <nome> Nome do seu bot --email <email> Email de contato do administrador Opções opcionais: --website <url> Website/URL da sua aplicação --description <desc> Descrição do bot --capabilities <list> Capacidades separadas por vírgula (ex: chat,image,text) --max-tokens <number> Limite máximo de tokens por requisição --dashboard-url <url> URL do dashboard (padrão: http://localhost:3000) Exemplos: # Solicitação básica npx ai-admin-request --name "Meu Bot" --email "admin@exemplo.com" # Solicitação completa npx ai-admin-request \\ --name "ChatBot Avançado" \\ --email "admin@empresa.com" \\ --website "https://minhaaplicacao.com" \\ --description "Bot de atendimento inteligente" \\ --capabilities "chat,image,text,voice" \\ --max-tokens 2000 # Com dashboard customizado npx ai-admin-request \\ --name "Meu Bot" \\ --email "admin@exemplo.com" \\ --dashboard-url "https://dashboard.empresa.com" `); } function validateOptions(options) { const errors = []; if (!options.name) { errors.push('Nome do bot é obrigatório (--name)'); } if (!options.email) { errors.push('Email de contato é obrigatório (--email)'); } if (options.email && !isValidEmail(options.email)) { errors.push('Email inválido'); } if (options.website && !isValidUrl(options.website)) { errors.push('URL do website inválida'); } if (options.maxTokensPerRequest && options.maxTokensPerRequest < 1) { errors.push('Limite de tokens deve ser maior que 0'); } return errors; } function isValidEmail(email) { const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return emailRegex.test(email); } function isValidUrl(url) { try { new URL(url); return true; } catch (_a) { return false; } } function loadConfigFromEnv() { var _a; const configPath = path_1.default.join(process.cwd(), 'ai-admin-config', '.env'); const config = {}; if (fs_1.default.existsSync(configPath)) { const envContent = fs_1.default.readFileSync(configPath, 'utf-8'); const lines = envContent.split('\n'); for (const line of lines) { if (line.includes('DASHBOARD_URL=')) { config.dashboardUrl = (_a = line.split('=')[1]) === null || _a === void 0 ? void 0 : _a.trim(); } } } return config; } async function sendRequest(options) { var _a; const dashboardUrl = options.dashboardUrl || 'http://localhost:3000'; console.log(`📡 Enviando solicitação para: ${dashboardUrl}`); console.log(`🤖 Nome do bot: ${options.name}`); console.log(`📧 Email: ${options.email}`); if (options.website) console.log(`🌐 Website: ${options.website}`); if (options.description) console.log(`📝 Descrição: ${options.description}`); if (options.capabilities) console.log(`⚡ Capacidades: ${options.capabilities.join(', ')}`); try { const response = await axios_1.default.post(`${dashboardUrl}/api/bots/request`, { name: options.name, description: options.description || `Bot ${options.name}`, capabilities: options.capabilities || ['chat'], contactEmail: options.email, website: options.website || 'http://localhost:3001', maxTokensPerRequest: options.maxTokensPerRequest || 1000 }, { timeout: 10000, headers: { 'Content-Type': 'application/json' } }); return response.data; } catch (error) { if (axios_1.default.isAxiosError(error)) { if (error.response) { throw new Error(`Erro do dashboard (${error.response.status}): ${((_a = error.response.data) === null || _a === void 0 ? void 0 : _a.error) || error.message}`); } else if (error.request) { throw new Error(`Erro de conexão: Dashboard não acessível em ${dashboardUrl}`); } } throw new Error(`Erro inesperado: ${error instanceof Error ? error.message : String(error)}`); } } async function checkRequestStatus(requestId, dashboardUrl) { try { const response = await axios_1.default.get(`${dashboardUrl}/api/bots/request`, { params: { requestId }, timeout: 5000 }); return response.data; } catch (error) { console.warn('⚠️ Não foi possível verificar status da solicitação'); return null; } } function saveRequestInfo(requestInfo, options) { const configDir = path_1.default.join(process.cwd(), 'ai-admin-config'); if (!fs_1.default.existsSync(configDir)) { fs_1.default.mkdirSync(configDir, { recursive: true }); } const requestData = { requestId: requestInfo.requestId, status: requestInfo.status, attempts: requestInfo.attempts, botName: options.name, email: options.email, website: options.website, dashboardUrl: options.dashboardUrl || 'http://localhost:3000', timestamp: new Date().toISOString() }; const requestPath = path_1.default.join(configDir, 'bot-request.json'); fs_1.default.writeFileSync(requestPath, JSON.stringify(requestData, null, 2)); console.log(`💾 Informações da solicitação salvas em: ai-admin-config/bot-request.json`); } function updateEnvWithBotInfo(options) { const envPath = path_1.default.join(process.cwd(), 'ai-admin-config', '.env'); if (fs_1.default.existsSync(envPath)) { let envContent = fs_1.default.readFileSync(envPath, 'utf-8'); // Atualizar DASHBOARD_URL se fornecido if (options.dashboardUrl) { envContent = envContent.replace(/DASHBOARD_URL=.*/, `DASHBOARD_URL=${options.dashboardUrl}`); } // Adicionar comentário com nome do bot para facilitar identificação if (!envContent.includes('# Bot registrado:')) { envContent = `# Bot registrado: ${options.name} # Email: ${options.email} # Status: Aguardando aprovação ${envContent}`; } fs_1.default.writeFileSync(envPath, envContent); console.log('📝 Arquivo .env atualizado com informações do bot'); } } async function main() { console.log('\n🚀 AI Admin Request - Solicitação de Conexão\n'); try { // Parse dos argumentos const options = parseArguments(); // Carregar configurações do ambiente se existir const envConfig = loadConfigFromEnv(); const finalOptions = { ...envConfig, ...options }; // Validar opções const errors = validateOptions(finalOptions); if (errors.length > 0) { console.error('❌ Erros de validação:'); errors.forEach(error => console.error(` - ${error}`)); console.log('\nUse --help para ver as opções disponíveis'); process.exit(1); } // Enviar solicitação console.log('📤 Enviando solicitação de registro...\n'); const requestInfo = await sendRequest(finalOptions); console.log('\n✅ Solicitação enviada com sucesso!\n'); console.log('📋 Detalhes da solicitação:'); console.log(` ID da solicitação: ${requestInfo.requestId}`); console.log(` Status: ${requestInfo.status}`); console.log(` Tentativas: ${requestInfo.attempts}`); if (requestInfo.message) { console.log(` Mensagem: ${requestInfo.message}`); } // Salvar informações da solicitação saveRequestInfo(requestInfo, finalOptions); updateEnvWithBotInfo(finalOptions); // Verificar status se aprovado automaticamente if (requestInfo.status === 'approved') { console.log('\n🎉 Solicitação aprovada automaticamente!'); console.log('✅ Seu bot está pronto para uso'); } else if (requestInfo.status === 'pending') { console.log('\n⏳ Solicitação pendente de aprovação'); console.log('📧 O administrador do dashboard será notificado'); console.log('🔄 Você pode verificar o status com:'); console.log(` npx ai-admin-status --request-id ${requestInfo.requestId}`); } else if (requestInfo.status === 'rejected') { console.log('\n❌ Solicitação rejeitada'); if (requestInfo.attempts >= 5) { console.log('⚠️ Número máximo de tentativas excedido'); } } console.log('\n📚 Próximos passos:'); console.log('1. Aguarde a aprovação do administrador (se pendente)'); console.log('2. Configure BOT_ID e BOT_SECRET no arquivo .env'); console.log('3. Execute sua aplicação com: npm start'); } catch (error) { console.error('\n❌ Erro ao enviar solicitação:'); console.error(` ${error instanceof Error ? error.message : String(error)}`); console.log('\n🔧 Possíveis soluções:'); console.log(' - Verifique se o dashboard está rodando'); console.log(' - Confirme a URL do dashboard (--dashboard-url)'); console.log(' - Verifique sua conexão de internet'); process.exit(1); } } main();