"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ParallelOrchestrationLoop = void 0;
const ArbitrationAgent_1 = require("./ArbitrationAgent");
const ArbitrationScorecard_1 = require("./ArbitrationScorecard");
class ParallelOrchestrationLoop {
    brain;
    taskExecutor;
    arbitrationAgent;
    scorecard;
    constructor(brain, taskExecutor) {
        this.brain = brain;
        this.taskExecutor = taskExecutor;
        this.arbitrationAgent = new ArbitrationAgent_1.ArbitrationAgent(brain);
        this.scorecard = new ArbitrationScorecard_1.ArbitrationScorecard();
    }
    selectExecutor() {
        const allowed = (process.env.OPENLIFE_ALLOWED_LLM_EXECUTORS || '').toLowerCase().split(',').map(s => s.trim()).filter(Boolean);
        if (allowed.includes('gemini'))
            return 'gemini';
        if ((process.env.GEMINI_API_KEY || '').trim())
            return 'gemini';
        return 'codex';
    }
    async runResearchBranches(goal, taskId, maxBranches = 3) {
        const baseBranches = [
            `[Ramo 1] Faça uma análise objetiva do objetivo:\n${goal}`,
            `[Ramo 2] Faça uma análise crítica e complementar do objetivo:\n${goal}`,
            `[Ramo 3] Faça uma leitura estratégica e de alto nível do objetivo:\n${goal}`,
            `[Ramo 4] Faça uma leitura de consenso e decisão executiva do objetivo:\n${goal}`
        ];
        const branches = baseBranches.slice(0, Math.max(1, maxBranches));
        const executor = this.selectExecutor();
        const results = await Promise.all(branches.map((prompt, index) => this.taskExecutor.execute(executor, prompt, `${taskId}_parallel_${index + 1}`)));
        const outputs = results.map(r => r.stdout || r.stderr || '').filter(Boolean);
        const scorecard = this.scorecard.score(outputs);
        const arbitration = await this.arbitrationAgent.arbitrate(goal, outputs);
        return {
            branches: outputs,
            arbitration,
            scorecard,
            artifactPaths: results.map(r => r.artifactPath).filter(Boolean)
        };
    }
}
exports.ParallelOrchestrationLoop = ParallelOrchestrationLoop;
