automagik-genie
Version:
Self-evolving AI agent orchestration framework with Model Context Protocol support
101 lines (98 loc) • 4.89 kB
JavaScript
"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;
}
}