aios-core
Version:
Synkra AIOS: AI-Orchestrated System for Full Stack Development - Core Framework
129 lines (111 loc) • 3.25 kB
JavaScript
/**
* 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 };