pm-orchestrator-enhancement
Version:
PM Orchestrator Enhancement - Multi-agent parallel execution system
162 lines • 4.64 kB
JavaScript
;
/**
* PM Orchestrator Enhancement - Progress Tracker
*
* リアルタイム進捗を追跡します
* ColorCode統合とテストAPI対応
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.ProgressTracker = void 0;
const color_code_1 = require("./color-code");
class ProgressTracker {
constructor() {
this.tasks = new Map();
this.listeners = [];
}
/**
* タスクを開始します(第3引数追加: currentSubagent)
*/
startTask(taskId, taskName, currentSubagent) {
const task = {
taskId,
taskName,
status: 'in_progress',
progress: 0,
startTime: new Date().toISOString(),
currentSubagent
};
this.tasks.set(taskId, task);
this.notifyListeners(task);
}
/**
* タスクの進捗を更新します
*/
updateProgress(taskId, progress, currentSubagent) {
const task = this.tasks.get(taskId);
if (!task)
return;
task.progress = Math.min(100, Math.max(0, progress));
if (currentSubagent) {
task.currentSubagent = currentSubagent;
}
this.tasks.set(taskId, task);
this.notifyListeners(task);
}
/**
* タスクを完了します
*/
completeTask(taskId) {
const task = this.tasks.get(taskId);
if (!task)
return;
task.status = 'completed';
task.progress = 100;
task.endTime = new Date().toISOString();
this.tasks.set(taskId, task);
this.notifyListeners(task);
}
/**
* タスクを失敗させます
*/
failTask(taskId) {
const task = this.tasks.get(taskId);
if (!task)
return;
task.status = 'failed';
task.endTime = new Date().toISOString();
this.tasks.set(taskId, task);
this.notifyListeners(task);
}
/**
* 進捗リスナーを追加します
*/
addListener(listener) {
this.listeners.push(listener);
}
/**
* 進捗リスナーを削除します
*/
removeListener(listener) {
const index = this.listeners.indexOf(listener);
if (index > -1) {
this.listeners.splice(index, 1);
}
}
/**
* 全タスクの進捗を取得します
*/
getAllProgress() {
return Array.from(this.tasks.values());
}
/**
* タスクの進捗を取得します
*/
getProgress(taskId) {
return this.tasks.get(taskId);
}
/**
* タスクの進捗を取得します(エイリアス)
*/
getTask(taskId) {
return this.getProgress(taskId);
}
/**
* タスクを失敗させます(エイリアス)
*/
errorTask(taskId) {
this.failTask(taskId);
}
/**
* 進捗を表示します(TerminalUI統合)
*/
displayProgress() {
const tasks = Array.from(this.tasks.values());
if (tasks.length === 0) {
return 'No tasks in progress.';
}
const lines = [];
lines.push('');
lines.push('━'.repeat(60));
lines.push('📊 PM Orchestrator 実行状況');
lines.push('━'.repeat(60));
lines.push('');
for (const task of tasks) {
const statusIcon = this.getStatusIcon(task.status);
const agentName = task.currentSubagent || 'unknown';
const coloredAgent = color_code_1.ColorCode.colorize(agentName, agentName);
lines.push(`${statusIcon} ${coloredAgent.padEnd(20)} - ${task.taskName} (${task.progress.toFixed(0)}%)`);
}
lines.push('');
lines.push('━'.repeat(60));
lines.push(`Summary: ${tasks.length} task(s)`);
lines.push('━'.repeat(60));
return lines.join('\n');
}
/**
* ステータスアイコンを取得
*/
getStatusIcon(status) {
const iconMap = {
'pending': '⏳',
'in_progress': '🔄',
'completed': '✅',
'failed': '❌'
};
return iconMap[status] || '⚪';
}
/**
* リスナーに通知します(プライベート)
*/
notifyListeners(progress) {
this.listeners.forEach(listener => {
try {
listener(progress);
}
catch (error) {
console.error('Error in progress listener:', error);
}
});
}
}
exports.ProgressTracker = ProgressTracker;
//# sourceMappingURL=progress-tracker.js.map