Enhance AgentManager to manage task context cleanup and preserve swapCount on restarts. Update UsageMonitor to delay profile usage checks to prevent cascading swaps.

This commit is contained in:
AndyMik90
2025-12-17 12:52:14 +01:00
parent de33b2c7c3
commit e5b9488a86
2 changed files with 35 additions and 3 deletions
+33 -1
View File
@@ -48,6 +48,34 @@ export class AgentManager extends EventEmitter {
console.log('[AgentManager] Auto-swap restart:', taskId, newProfileId);
this.restartTask(taskId);
});
// Listen for task completion to clean up context (prevent memory leak)
this.on('exit', (taskId: string, code: number | null) => {
// Clean up context when:
// 1. Task completed successfully (code === 0), or
// 2. Task failed and won't be restarted (handled by auto-swap logic)
// Note: Auto-swap restart happens BEFORE this exit event is processed,
// so we need a small delay to allow restart to preserve context
setTimeout(() => {
const context = this.taskExecutionContext.get(taskId);
if (!context) return; // Already cleaned up or restarted
// If task completed successfully, always clean up
if (code === 0) {
this.taskExecutionContext.delete(taskId);
console.log('[AgentManager] Cleaned up context for completed task:', taskId);
return;
}
// If task failed and hit max retries, clean up
if (context.swapCount >= 2) {
this.taskExecutionContext.delete(taskId);
console.log('[AgentManager] Cleaned up context for max-retry task:', taskId);
}
// Otherwise keep context for potential restart
}, 1000); // Delay to allow restart logic to run first
});
}
/**
@@ -268,6 +296,10 @@ export class AgentManager extends EventEmitter {
specDir?: string,
metadata?: SpecCreationMetadata
): void {
// Preserve swapCount if context already exists (for restarts)
const existingContext = this.taskExecutionContext.get(taskId);
const swapCount = existingContext?.swapCount ?? 0;
this.taskExecutionContext.set(taskId, {
projectPath,
specId,
@@ -276,7 +308,7 @@ export class AgentManager extends EventEmitter {
taskDescription,
specDir,
metadata,
swapCount: 0
swapCount // Preserve existing count instead of resetting
});
}
@@ -318,8 +318,8 @@ export class UsageMonitor extends EventEmitter {
limitType
});
// Fetch usage for newly active profile immediately
this.checkUsageAndSwap();
// Note: Don't immediately check new profile - let normal interval handle it
// This prevents cascading swaps if multiple profiles are near limits
}
}