Merge pull request #2035 from code-yeongyu/fix/background-agent-review-feedback

fix: address Oracle + Cubic review feedback for background-agent refactoring
This commit is contained in:
YeonGyu-Kim
2026-02-22 12:18:07 +09:00
committed by GitHub
5 changed files with 21 additions and 12 deletions

View File

@@ -96,8 +96,8 @@ describe("findNearestMessageExcludingCompaction", () => {
agent: "sisyphus",
model: { providerID: "anthropic", modelID: "claude-opus-4-6" },
}
writeFileSync(join(tempDir, "001.json"), JSON.stringify(compactionMessage))
writeFileSync(join(tempDir, "002.json"), JSON.stringify(validMessage))
writeFileSync(join(tempDir, "002.json"), JSON.stringify(compactionMessage))
writeFileSync(join(tempDir, "001.json"), JSON.stringify(validMessage))
// when
const result = findNearestMessageExcludingCompaction(tempDir)
@@ -155,8 +155,8 @@ describe("findNearestMessageExcludingCompaction", () => {
agent: "oracle",
model: { providerID: "google", modelID: "gemini-2-flash" },
}
writeFileSync(join(tempDir, "001.json"), invalidJson)
writeFileSync(join(tempDir, "002.json"), JSON.stringify(validMessage))
writeFileSync(join(tempDir, "002.json"), invalidJson)
writeFileSync(join(tempDir, "001.json"), JSON.stringify(validMessage))
// when
const result = findNearestMessageExcludingCompaction(tempDir)

View File

@@ -117,6 +117,7 @@ export function tryFallbackRetry(args: {
model: task.model,
fallbackChain: task.fallbackChain,
category: task.category,
isUnstableAgent: task.isUnstableAgent,
}
queue.push({ task, input: retryInput })
queuesByKey.set(key, queue)

View File

@@ -9,7 +9,6 @@ import { TaskHistory } from "./task-history"
import {
log,
getAgentToolRestrictions,
getMessageDir,
normalizePromptTools,
normalizeSDKResponse,
promptWithModelSuggestionRetry,
@@ -44,6 +43,8 @@ import {
import { tryFallbackRetry } from "./fallback-retry-handler"
import { registerManagerForCleanup, unregisterManagerForCleanup } from "./process-cleanup"
import { isCompactionAgent, findNearestMessageExcludingCompaction } from "./compaction-aware-message-resolver"
import { MESSAGE_STORAGE } from "../hook-message-injector"
import { join } from "node:path"
import { pruneStaleTasksAndNotifications } from "./task-poller"
import { checkAndInterruptStaleTasks } from "./task-poller"
@@ -931,6 +932,7 @@ export class BackgroundManager {
errorInfo: { name?: string; message?: string },
source: string,
): boolean {
const previousSessionID = task.sessionID
const result = tryFallbackRetry({
task,
errorInfo,
@@ -941,8 +943,8 @@ export class BackgroundManager {
queuesByKey: this.queuesByKey,
processKey: (key: string) => this.processKey(key),
})
if (result && task.sessionID) {
subagentSessions.delete(task.sessionID)
if (result && previousSessionID) {
subagentSessions.delete(previousSessionID)
}
return result
}
@@ -1345,7 +1347,7 @@ Use \`background_output(task_id="${task.id}")\` to retrieve this result when rea
parentSessionID: task.parentSessionID,
})
}
const messageDir = getMessageDir(task.parentSessionID)
const messageDir = join(MESSAGE_STORAGE, task.parentSessionID)
const currentMessage = messageDir ? findNearestMessageExcludingCompaction(messageDir) : null
agent = currentMessage?.agent ?? task.parentAgent
model = currentMessage?.model?.providerID && currentMessage?.model?.modelID

View File

@@ -64,7 +64,9 @@ describe("process-cleanup", () => {
registerManagerForCleanup(manager)
const [, listener] = processOnCalls[0]
const exitEntry = processOnCalls.find(([signal]) => signal === "exit")
expect(exitEntry).toBeDefined()
const [, listener] = exitEntry!
listener()
expect(mockShutdown).toHaveBeenCalled()
@@ -83,7 +85,9 @@ describe("process-cleanup", () => {
registerManagerForCleanup(manager2)
registerManagerForCleanup(manager3)
const [, listener] = processOnCalls[0]
const exitEntry = processOnCalls.find(([signal]) => signal === "exit")
expect(exitEntry).toBeDefined()
const [, listener] = exitEntry!
listener()
expect(shutdown1).toHaveBeenCalledTimes(1)
@@ -144,7 +148,9 @@ describe("process-cleanup", () => {
registerManagerForCleanup(manager1)
registerManagerForCleanup(manager2)
const [, listener] = processOnCalls[0]
const exitEntry = processOnCalls.find(([signal]) => signal === "exit")
expect(exitEntry).toBeDefined()
const [, listener] = exitEntry!
unregisterManagerForCleanup(manager2)
listener()

View File

@@ -11,7 +11,7 @@ function registerProcessSignal(
handler()
if (exitAfter) {
process.exitCode = 0
setTimeout(() => process.exit(), 6000)
setTimeout(() => process.exit(), 6000).unref()
}
}
process.on(signal, listener)