fix: Clean up agent worktrees, branches, and logs on dismiss and auto-cleanup

- Track worktree removal success in autoCleanupAfterCompletion() instead of
  always returning removed:true when removeAgentWorktrees() throws
- Add removeAgentBranches() call to auto-cleanup path (agent/* branches were
  never cleaned after completion)
- Add filesystem cleanup (worktrees, branches, logs) to dismiss() to prevent
  resource leaks until next server restart
This commit is contained in:
Lukas May
2026-03-05 11:09:11 +01:00
parent cbb8e66943
commit 222d73d0d6
2 changed files with 21 additions and 2 deletions

View File

@@ -297,7 +297,7 @@ export class CleanupManager {
/**
* Auto-cleanup agent workdir after successful completion.
* Removes worktrees and logs but preserves branches and DB record.
* Removes worktrees, branches, and logs. Preserves DB record.
*/
async autoCleanupAfterCompletion(
agentId: string,
@@ -320,10 +320,18 @@ export class CleanupManager {
await this.archiveForDebug(alias, agentId);
}
let worktreeRemoved = true;
try {
await this.removeAgentWorktrees(alias, initiativeId);
} catch (err) {
log.warn({ agentId, alias, err: err instanceof Error ? err.message : String(err) }, 'auto-cleanup: failed to remove worktrees');
worktreeRemoved = false;
}
try {
await this.removeAgentBranches(alias, initiativeId);
} catch (err) {
log.warn({ agentId, alias, err: err instanceof Error ? err.message : String(err) }, 'auto-cleanup: failed to remove branches');
}
try {
@@ -333,7 +341,7 @@ export class CleanupManager {
}
log.info({ agentId, alias }, 'auto-cleanup: workdir and logs removed');
return { clean: true, removed: true };
return { clean: true, removed: worktreeRemoved };
}
/**

View File

@@ -855,6 +855,17 @@ export class MultiProviderAgentManager implements AgentManager {
log.info({ agentId, name: agent.name }, 'dismissing agent');
this.cleanupAgentState(agentId);
this.commitRetryCount.delete(agentId);
// Best-effort filesystem cleanup
try { await this.cleanupManager.removeAgentWorktrees(agent.name, agent.initiativeId); }
catch (err) { log.warn({ agentId, err: err instanceof Error ? err.message : String(err) }, 'dismiss: failed to remove worktrees'); }
try { await this.cleanupManager.removeAgentBranches(agent.name, agent.initiativeId); }
catch (err) { log.warn({ agentId, err: err instanceof Error ? err.message : String(err) }, 'dismiss: failed to remove branches'); }
try { await this.cleanupManager.removeAgentLogs(agent.name); }
catch (err) { log.warn({ agentId, err: err instanceof Error ? err.message : String(err) }, 'dismiss: failed to remove logs'); }
await this.repository.update(agentId, {
userDismissedAt: new Date(),