UNPKG

automagik-genie

Version:

Self-evolving AI agent orchestration framework with Model Context Protocol support

101 lines (98 loc) 4.89 kB
"use strict"; /** * Update Flow Helpers - Genie orchestration for framework upgrades * * Architecture: * 1. CLI generates knowledge diff during init (2.5.14+) * 2. Init creates Forge task with diff as input to update agent * 3. Update agent processes diff and applies changes * 4. User monitors progress in Forge dashboard */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.launchUpdateTask = launchUpdateTask; const service_config_js_1 = require("./service-config.js"); const gradient_string_1 = __importDefault(require("gradient-string")); const path_1 = __importDefault(require("path")); const child_process_1 = require("child_process"); const os_1 = __importDefault(require("os")); const forge_manager_js_1 = require("./forge-manager.js"); const FORGE_URL = process.env.FORGE_BASE_URL || (0, service_config_js_1.getForgeConfig)().baseUrl; /** * Launch Genie update task using genie CLI * Reads diff file and delegates to update agent */ async function launchUpdateTask(config) { const { diffPath, oldVersion, newVersion, workspacePath } = config; console.log(''); console.log(gradient_string_1.default.pastel('╔' + '═'.repeat(58) + '╗')); console.log(gradient_string_1.default.pastel('║ 🔄 GENIE UPDATE ORCHESTRATION' + ' '.repeat(28) + '║')); console.log(gradient_string_1.default.pastel('╚' + '═'.repeat(58) + '╝')); console.log(''); try { // Check if Forge is already running, if not start it const isRunning = await (0, forge_manager_js_1.isForgeRunning)(FORGE_URL, 1); if (!isRunning) { console.log(gradient_string_1.default.pastel('🚀 Starting Forge backend...')); // Start Forge in background const logDir = path_1.default.join(os_1.default.tmpdir(), 'genie-forge'); const startResult = (0, forge_manager_js_1.startForgeInBackground)({ baseUrl: FORGE_URL, logDir }); if (!startResult.ok) { const errorMsg = 'error' in startResult ? startResult.error.message : 'Unknown error'; throw new Error(`Failed to start Forge: ${errorMsg}. The update diff is ready at ${diffPath}.`); } // Wait for Forge to be ready (with timeout) console.log(gradient_string_1.default.pastel('⏳ Waiting for Forge to be ready...')); const forgeReady = await (0, forge_manager_js_1.waitForForgeReady)(FORGE_URL, 30000, 500, false); if (!forgeReady) { throw new Error(`Forge did not start within 30 seconds. The update diff is ready at ${diffPath}. You can manually create the update task after Forge starts.`); } console.log(gradient_string_1.default.pastel('✅ Forge backend is ready')); } else { console.log(gradient_string_1.default.pastel('✅ Forge backend is already running')); } console.log(''); console.log(gradient_string_1.default.pastel('Launching update orchestrator...')); // Build update prompt with agent path and diff file path const relativeDiffPath = path_1.default.relative(workspacePath, diffPath); const prompt = `Apply framework upgrade from ${oldVersion} to ${newVersion}. Agent: @.genie/code/agents/update.md Diff: ${relativeDiffPath} Process this knowledge diff: 1. Read the diff file to understand what changed 2. Analyze added/removed/modified files 3. Assess user impact 4. Generate clear update report`; // Use genie CLI to launch update orchestration const genieBin = path_1.default.join(__dirname, '../genie-cli.js'); // Use genie task (headless) for background orchestration // Agent frontmatter specifies executor (CLAUDE_CODE, CODEX, or OPENCODE) const result = (0, child_process_1.execSync)(`node "${genieBin}" task update "${prompt.replace(/"/g, '\\"')}"`, { cwd: workspacePath, encoding: 'utf8', stdio: 'pipe' }); // Parse JSON output from genie task // Expected format: { task_id, task_url, agent, executor, status, message } const jsonOutput = JSON.parse(result.trim()); const taskUrl = jsonOutput.task_url; console.log(''); console.log(gradient_string_1.default.pastel('✨ Genie orchestrating update...')); console.log(''); return taskUrl; } catch (error) { const errorMsg = error instanceof Error ? error.message : String(error); console.error(''); console.error(gradient_string_1.default.pastel('❌ Failed to create update task:')); console.error(errorMsg); console.error(''); throw error; } }