fix(background-agent): retain completed tasks via archive fallback after cleanup

MessageAbortedError/worker shutdown could race with scheduled removeTask, leaving background_output's manager.getTask returning 'Task not found' even though the task had completed cleanly.

Fix: add completedTaskArchive (max 500, FIFO eviction). On removeTask, archive non-running/pending tasks with sessionId. getTask falls back to archive on active-map miss. addTask clears stale archive entries on re-registration.

Fixes #3895
This commit is contained in:
YeonGyu-Kim
2026-05-10 14:56:28 +09:00
parent 50699e3af1
commit dbaea82b73
2 changed files with 51 additions and 1 deletions
@@ -5991,6 +5991,33 @@ describe("BackgroundManager regression fixes - resume and aborted notification",
manager.shutdown()
})
test("should keep completed task retrievable after scheduled removal", () => {
//#given
const manager = createBackgroundManager()
const task: BackgroundTask = {
id: "task-archive-regression",
sessionId: "session-archive-regression",
parentSessionId: "parent-session",
parentMessageId: "msg-1",
description: "archive regression",
prompt: "test",
agent: "explore",
status: "completed",
startedAt: new Date(),
completedAt: new Date(),
}
getTaskMap(manager).set(task.id, task)
//#when
;(cast<{ removeTask: (task: BackgroundTask) => void }>(manager)).removeTask(task)
//#then
expect(getTaskMap(manager).has(task.id)).toBe(false)
expect(manager.getTask(task.id)?.sessionId).toBe(task.sessionId)
manager.shutdown()
})
})
describe("BackgroundManager - tool permission spread order", () => {