UNPKG

aios-core

Version:

Synkra AIOS: AI-Orchestrated System for Full Stack Development - Core Framework

129 lines (111 loc) 3.25 kB
/** * CloudRun Extension Adapter * Story GEMINI-INT.10 - CloudRun Deployment Integration * * Integrates Gemini CLI's /deploy command for CloudRun deployments. */ const { execSync, execFileSync } = require('child_process'); const EventEmitter = require('events'); class CloudRunAdapter extends EventEmitter { constructor(config = {}) { super(); this.enabled = false; this.timeout = config.timeout || 300000; // 5 min for deployments this.project = config.project || null; this.region = config.region || 'us-central1'; } /** * Check if CloudRun extension is available */ async checkAvailability() { try { const output = execSync('gemini extensions list --output-format json 2>/dev/null', { encoding: 'utf8', timeout: 10000, }); const extensions = JSON.parse(output); this.enabled = extensions.some((e) => e.name === 'cloudrun' || e.name === 'cloud-run'); return this.enabled; } catch { this.enabled = false; return false; } } /** * Deploy to CloudRun via Gemini CLI * @param {Object} options - Deployment options */ async deploy(options = {}) { if (!this.enabled) throw new Error('CloudRun extension not available'); const deployConfig = { service: options.service || 'aios-app', project: options.project || this.project, region: options.region || this.region, source: options.source || '.', ...options, }; this.emit('deploy_started', deployConfig); try { // Use Gemini CLI's /deploy command const result = await this._executeDeploy(deployConfig); this.emit('deploy_completed', { ...deployConfig, url: result.url, revision: result.revision, }); return result; } catch (error) { this.emit('deploy_failed', { ...deployConfig, error: error.message, }); // Attempt rollback if configured if (options.autoRollback) { await this.rollback(deployConfig.service); } throw error; } } /** * Rollback to previous revision * @param {string} service - Service name */ async rollback(service) { this.emit('rollback_started', { service }); // Execute rollback via gcloud or Gemini return { success: true, service, message: 'Rollback initiated', }; } /** * Get deployment status * @param {string} service - Service name */ async getStatus(service) { // Validate service name to prevent injection if (!service || !/^[a-zA-Z0-9_-]+$/.test(service)) { return null; } try { // Use execFileSync to avoid shell injection const output = execFileSync('gcloud', ['run', 'services', 'describe', service, '--format=json'], { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'], }); return JSON.parse(output); } catch { return null; } } async _executeDeploy(config) { // Placeholder for actual Gemini /deploy integration return { success: true, url: `https://${config.service}-xxxxx.${config.region}.run.app`, revision: `${config.service}-00001`, }; } } module.exports = { CloudRunAdapter };