embedia
Version:
Zero-configuration AI chatbot integration CLI - direct file copy with embedded API keys
119 lines (105 loc) • 3.84 kB
JavaScript
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;