UNPKG

embedia

Version:

Zero-configuration AI chatbot integration CLI - direct file copy with embedded API keys

119 lines (105 loc) 3.84 kB
const fetch = require('node-fetch'); const chalk = require('chalk'); class ServerClient { constructor() { this.baseUrl = 'https://server-api-bay.vercel.app'; } /** * Retrieve generated code from server using token * Server stores universal web components generated by the website * @param {string} token - The integration token from AutoChat webapp * @param {Object} projectContext - Project context for logging only * @returns {Promise<Object>} Generated code data */ async retrieveCode(token, projectContext = null) { console.log(chalk.cyan('🔄 Retrieving generated web component from server...')); try { // Simple GET request to retrieve stored code const response = await fetch(`${this.baseUrl}/api/autochat?token=${token}`, { method: 'GET', headers: { 'User-Agent': 'embedia-cli/3.0.0' } }); if (!response.ok) { if (response.status === 404) { throw new Error('Token not found or has expired. Please generate a new token from the Embedia webapp.'); } if (response.status === 401) { throw new Error('Invalid token. Please check your token and try again.'); } if (response.status === 429) { throw new Error('Too many requests. Please wait a moment and try again.'); } if (response.status === 500) { throw new Error('Server error. Please try again in a few moments.'); } throw new Error(`Server responded with status ${response.status}. Please try again.`); } const data = await response.json(); // Validate response structure if (!data.generatedCode) { throw new Error('Invalid response from server. The token may be corrupted.'); } if (!data.generatedCode.fullProject || !Array.isArray(data.generatedCode.fullProject)) { throw new Error('Invalid code structure received from server. Please try again.'); } // Log success const fileCount = data.generatedCode.fullProject.length; console.log(chalk.green(`✅ Retrieved ${fileCount} files from server`)); // Return stored universal web component code as-is return data.generatedCode; } catch (error) { if (error.code === 'ENOTFOUND' || error.code === 'ECONNREFUSED') { throw new Error('Unable to connect to Embedia server. Please check your internet connection.'); } if (error.code === 'ETIMEDOUT') { throw new Error('Request timed out. Please check your internet connection and try again.'); } // Re-throw the error with context throw error; } } /** * Validate that the server is accessible * @returns {Promise<boolean>} True if server is accessible */ async healthCheck() { try { const response = await fetch(`${this.baseUrl}/api/health`, { method: 'GET', headers: { 'User-Agent': 'embedia-cli/1.1.1' } }); return response.ok; } catch (error) { return false; } } /** * Get server status information * @returns {Promise<Object>} Server status */ async getServerStatus() { try { await this.healthCheck(); return { online: true, url: this.baseUrl, message: 'Embedia server is online' }; } catch (error) { return { online: false, url: this.baseUrl, message: 'Embedia server is not responding' }; } } // REMOVED: validateAndAdaptTemplates method // PHASE 1 ARCHITECTURAL CHANGE: Generated code is authoritative // Server must generate appropriate code based on binding contracts // CLI no longer modifies or overrides server-generated code } module.exports = ServerClient;