fix: v2.22.0 - stable multi-agent workflow (API compatibility & architecture refactor)

This commit is contained in:
Wonseok Jung
2026-04-30 00:58:00 +09:00
parent 7430c91177
commit c69ba168fa
5 changed files with 195 additions and 56 deletions
+72
View File
@@ -0,0 +1,72 @@
import * as vscode from 'vscode';
import { PlannerAgent, ResearcherAgent, WriterAgent } from './factory';
/**
* 에이전트 간의 데이터 인계 계약(Contract) 정의
*/
export interface AgentResult {
step: string;
content: string;
timestamp: number;
success: boolean;
}
export class AgentWorkflowManager {
/**
* 멀티 에이전트 워크플로우를 강력한 동기화(Synchronization) 하에 실행합니다.
*/
public static async runStrictWorkflow(
prompt: string,
modelName: string,
brainContext: string,
signal: AbortSignal,
onProgress: (step: string, message: string) => void
): Promise<string> {
// 1. 에이전트 인스턴스화
const planner = new PlannerAgent(modelName);
const researcher = new ResearcherAgent(modelName);
const writer = new WriterAgent(modelName);
try {
// --- Phase 1: Planner (Decomposition & Strategy) ---
if (signal.aborted) throw new Error('AbortError');
onProgress('Planner', '전략 분석 및 작업 분해 중...');
const plan = await planner.execute(prompt, brainContext, signal);
this.validateResult(plan, 'Planner');
// --- Phase 2: Researcher (Fact Harvesting) ---
if (signal.aborted) throw new Error('AbortError');
// 동기화를 위한 의도적 미세 지연 (서버 부하 분산)
await new Promise(r => setTimeout(r, 800));
onProgress('Researcher', '데이터 수집 및 핵심 정보 추출 중...');
const research = await researcher.execute(plan, brainContext, signal);
this.validateResult(research, 'Researcher');
// --- Phase 3: Writer (Final Synthesis) ---
if (signal.aborted) throw new Error('AbortError');
await new Promise(r => setTimeout(r, 800));
onProgress('Writer', '수집된 정보를 바탕으로 최종 리포트 작성 중...');
const finalReport = await writer.execute(research, prompt, signal);
this.validateResult(finalReport, 'Writer');
return finalReport;
} catch (error: any) {
if (error.name === 'AbortError' || error.message.includes('cancelled')) {
throw error;
}
throw new Error(`[Workflow Manager] ${error.message}`);
}
}
/**
* 데이터 정합성(Data Integrity) 검증
*/
private static validateResult(data: string, step: string) {
if (!data || data.trim().length < 20) {
const preview = data ? `(Content: "${data.substring(0, 100)}...")` : '(Empty Response)';
throw new Error(`${step} 단계에서 생성된 데이터가 불충분합니다. ${preview} 모델을 더 똑똑한 것으로 변경해 보세요.`);
}
}
}