arcadia-suite-sv/server/autonomous/agents/OrchestratorAgent.ts

193 lines
5.4 KiB
TypeScript

/**
* Arcadia Suite - Orchestrator Agent
*
* Orquestrador: Coordena o fluxo de trabalho entre todos os agentes,
* gerenciando o pipeline de desenvolvimento autônomo.
*
* @author Arcadia Development Team
* @version 1.0.0
*/
import { ArchitectAgent, ModuleSpec } from "./ArchitectAgent";
import { CodeGeneratorAgent, GeneratedFile, CodeGenResult } from "./CodeGeneratorAgent";
import { ValidationAgent, ValidationReport } from "./ValidationAgent";
import { toolManager } from "../tools";
export interface DevelopmentRequest {
description: string;
autoCommit?: boolean;
targetBranch?: string;
}
export interface DevelopmentResult {
success: boolean;
phase: "design" | "codegen" | "validation" | "commit" | "complete";
spec?: ModuleSpec;
files?: GeneratedFile[];
validation?: ValidationReport | null;
commitUrl?: string;
error?: string;
log: string[];
}
export class OrchestratorAgent {
private architect: ArchitectAgent;
private codeGenerator: CodeGeneratorAgent;
private validator: ValidationAgent;
private log: string[] = [];
constructor() {
this.architect = new ArchitectAgent();
this.codeGenerator = new CodeGeneratorAgent();
this.validator = new ValidationAgent();
}
private addLog(message: string): void {
const timestamp = new Date().toISOString();
this.log.push(`[${timestamp}] ${message}`);
console.log(`[Orchestrator] ${message}`);
}
async develop(request: DevelopmentRequest): Promise<DevelopmentResult> {
this.log = [];
this.addLog(`Iniciando desenvolvimento: "${request.description}"`);
try {
this.addLog("Fase 1: Design (Agente Arquiteto)");
const architectResult = await this.architect.run(request.description);
if (!architectResult.success) {
return {
success: false,
phase: "design",
error: architectResult.output,
log: this.log
};
}
const spec = this.architect.getSpec();
if (!spec) {
return {
success: false,
phase: "design",
error: "Arquiteto não gerou especificação",
log: this.log
};
}
this.addLog(`Especificação criada para módulo: ${spec.moduleName}`);
this.addLog("Fase 2: Geração de Código (Agente CodeGen)");
const codeGenResult = await this.codeGenerator.run(request.description, { spec });
if (!codeGenResult.success) {
return {
success: false,
phase: "codegen",
spec,
error: codeGenResult.output,
log: this.log
};
}
const files = this.codeGenerator.getGeneratedFiles();
this.addLog(`Gerados ${files.length} arquivos`);
this.addLog("Fase 3: Validação (Agente Validator)");
const validationResult = await this.validator.run("validate", { files });
const validation = this.validator.getReport();
if (validation?.overall === "fail") {
this.addLog(`Validação falhou: ${validation.summary}`);
return {
success: false,
phase: "validation",
spec,
files,
validation,
error: validation.summary,
log: this.log
};
}
this.addLog(`Validação: ${validation?.summary}`);
if (request.autoCommit) {
this.addLog("Fase 4: Commit Automático");
const commitFiles = files.map(f => ({
path: f.path,
content: f.content
}));
const commitResult = await toolManager.execute("github_commit", {
message: `feat(${spec.moduleName}): adiciona módulo ${spec.moduleName} - gerado automaticamente`,
files: commitFiles,
branch: request.targetBranch || "main"
});
if (!commitResult.success) {
this.addLog(`Commit falhou: ${commitResult.error}`);
return {
success: false,
phase: "commit",
spec,
files,
validation,
error: commitResult.error,
log: this.log
};
}
this.addLog(`Commit realizado com sucesso`);
return {
success: true,
phase: "complete",
spec,
files,
validation,
commitUrl: commitResult.data?.commitUrl,
log: this.log
};
}
this.addLog("Desenvolvimento concluído (sem commit automático)");
return {
success: true,
phase: "complete",
spec,
files,
validation,
log: this.log
};
} catch (error: any) {
this.addLog(`Erro: ${error.message}`);
return {
success: false,
phase: "design",
error: error.message,
log: this.log
};
}
}
async preview(description: string): Promise<{ spec: ModuleSpec | null; log: string[] }> {
this.log = [];
this.addLog(`Preview: "${description}"`);
const result = await this.architect.run(description);
const spec = this.architect.getSpec();
return { spec, log: this.log };
}
getAgentStatus(): { name: string; role: string }[] {
return [
{ name: this.architect.getName(), role: this.architect.getRole() },
{ name: this.codeGenerator.getName(), role: this.codeGenerator.getRole() },
{ name: this.validator.getName(), role: this.validator.getRole() }
];
}
}
export const orchestrator = new OrchestratorAgent();