pdca
Version:
🎯 AI 驅動的 PDCA 多代理開發系統 - 智能循環控制 + 成本管理 + Token 優化 + 多 AI 引擎支援
192 lines • 6.08 kB
JavaScript
/**
* Raiy-PDCA 協調器
* 管理 5 個代理的並行執行
*/
import { EventEmitter } from 'events';
import { TmuxManager } from '../../core/tmux-manager.js';
import { PdcaPlanAgent } from './agents/pdca-plan.js';
import { PdcaDoAgent } from './agents/pdca-do.js';
import { PdcaCheckAgent } from './agents/pdca-check.js';
import { PdcaActAgent } from './agents/pdca-act.js';
import { KnowledgeAgent } from './agents/knowledge-agent.js';
export class ShokuninOrchestrator extends EventEmitter {
config;
tmuxManager;
agents = new Map();
currentTask;
constructor(config) {
super();
this.config = config;
this.tmuxManager = new TmuxManager(config.sessionName);
this.initializeAgents();
}
/**
* 啟動 Raiy-PDCA 系統
*/
async start(mission, options = {}) {
try {
console.log('🎯 正在啟動 Raiy-PDCA 系統...');
// 1. 創建任務
this.currentTask = this.createTask(mission);
// 2. 準備 tmux 環境
await this.setupTmuxEnvironment();
// 3. 啟動所有代理
await this.startAllAgents(mission);
// 4. 設置監控(如果需要)
if (options.monitor) {
await this.startMonitoring();
}
this.emit('system-started', {
sessionName: this.config.sessionName,
task: this.currentTask
});
}
catch (error) {
this.emit('system-error', { error });
throw error;
}
}
/**
* 停止系統
*/
async stop() {
console.log('🛑 正在停止 Raiy-PDCA 系統...');
try {
// 停止所有代理
await this.stopAllAgents();
// 清理 tmux session
await this.tmuxManager.killSession();
this.emit('system-stopped');
}
catch (error) {
this.emit('system-error', { error });
throw error;
}
}
/**
* 獲取系統狀態
*/
getStatus() {
return {
isRunning: this.currentTask?.status === 'running',
task: this.currentTask,
agents: Array.from(this.agents.values()).map(agent => ({
name: agent.name,
status: agent.getStatus()
}))
};
}
/**
* 初始化代理
*/
initializeAgents() {
// 創建 PDCA + Knowledge 代理
const agents = [
new PdcaPlanAgent(),
new PdcaDoAgent(),
new PdcaCheckAgent(),
new PdcaActAgent(),
new KnowledgeAgent()
];
agents.forEach(agent => {
this.agents.set(agent.name, agent);
// 監聽代理事件
agent.on('started', (data) => {
console.log(`${agent.icon} ${agent.role} 已啟動`);
this.emit('agent-started', data);
});
agent.on('error', (data) => {
console.error(`${agent.icon} ${agent.role} 發生錯誤:`, data.error);
this.emit('agent-error', data);
});
agent.on('status-changed', (data) => {
this.emit('agent-status-changed', data);
});
});
}
/**
* 設置 tmux 環境
*/
async setupTmuxEnvironment() {
console.log('🖥️ 設置 tmux 環境...');
// 創建主 session
await this.tmuxManager.createSession();
// 為每個代理創建窗口
const agentNames = Array.from(this.agents.keys());
for (let i = 1; i < agentNames.length; i++) {
const agentName = agentNames[i];
await this.tmuxManager.createWindow(agentName, i + 1);
}
// 創建監控窗口
await this.tmuxManager.createWindow('monitor', agentNames.length + 1);
// 為每個代理設置 tmux target
agentNames.forEach((agentName, index) => {
const agent = this.agents.get(agentName);
const windowIndex = index + 1;
agent.setTmuxTarget(`${this.config.sessionName}:${windowIndex}`);
});
}
/**
* 啟動所有代理
*/
async startAllAgents(mission) {
console.log('🎭 啟動代理實例...');
const agents = Array.from(this.agents.values());
// 按順序啟動代理(避免資源競爭)
for (const agent of agents) {
try {
console.log(` ${agent.icon} 啟動 ${agent.role}...`);
await agent.start(mission);
// 稍等一下再啟動下一個代理
await this.sleep(1500);
}
catch (error) {
console.error(`啟動 ${agent.name} 失敗:`, error);
throw error;
}
}
}
/**
* 停止所有代理
*/
async stopAllAgents() {
const stopPromises = Array.from(this.agents.values()).map(agent => agent.stop().catch(error => {
console.warn(`停止代理 ${agent.name} 時發生錯誤:`, error);
}));
await Promise.all(stopPromises);
}
/**
* 啟動監控
*/
async startMonitoring() {
// TODO: 實現 blessed 監控介面
console.log('📊 啟動監控介面...');
}
/**
* 創建任務
*/
createTask(mission) {
const taskId = `task_${Date.now()}`;
const agentProgress = {};
Array.from(this.agents.keys()).forEach(agentName => {
agentProgress[agentName] = {
status: 'pending',
progress: 0
};
});
return {
id: taskId,
description: mission,
createdAt: new Date(),
status: 'pending',
agents: agentProgress
};
}
/**
* 休眠工具函數
*/
sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
}
//# sourceMappingURL=orchestrator.js.map