From 08daee7f7501249c4047647728b2ff4698e2edc3 Mon Sep 17 00:00:00 2001 From: XING Date: Mon, 23 Mar 2026 18:25:12 +0800 Subject: [PATCH] fix(gateway): honor retainAttachmentsOnKeep in TTL sweep + start sweeper on restore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Guard safeRemoveAttachmentsDir with retainAttachmentsOnKeep check in the session-mode TTL sweep, matching the existing pattern in finalizeSubagentCleanup (Codex P1) 2. Start sweeper unconditionally in restoreSubagentRunsOnce(), matching the register paths — ensures TTL cleanup runs after restart even when all restored entries are session-mode (Codex P2) Co-Authored-By: Claude Opus 4.6 (1M context) --- src/agents/subagent-registry.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/agents/subagent-registry.ts b/src/agents/subagent-registry.ts index faf8b15ac7b..709c836bcba 100644 --- a/src/agents/subagent-registry.ts +++ b/src/agents/subagent-registry.ts @@ -436,9 +436,8 @@ function restoreSubagentRunsOnce() { } // Resume pending work. ensureListener(); - if ([...subagentRuns.values()].some((entry) => entry.archiveAtMs)) { - startSweeper(); - } + // Always start sweeper — session-mode runs (no archiveAtMs) also need TTL cleanup. + startSweeper(); for (const runId of subagentRuns.keys()) { resumeSubagentRun(runId); } @@ -495,7 +494,9 @@ async function sweepSubagentRuns() { }); subagentRuns.delete(runId); mutated = true; - await safeRemoveAttachmentsDir(entry); + if (!entry.retainAttachmentsOnKeep) { + await safeRemoveAttachmentsDir(entry); + } } continue; }