diff --git a/src/features/background-agent/constants.ts b/src/features/background-agent/constants.ts index 9df6c2ff2..9c20c0f61 100644 --- a/src/features/background-agent/constants.ts +++ b/src/features/background-agent/constants.ts @@ -4,8 +4,8 @@ import type { BackgroundTask, LaunchInput } from "./types" export const TASK_TTL_MS = 30 * 60 * 1000 export const TERMINAL_TASK_TTL_MS = 30 * 60 * 1000 export const MIN_STABILITY_TIME_MS = 10 * 1000 -export const DEFAULT_STALE_TIMEOUT_MS = 1_200_000 -export const DEFAULT_MESSAGE_STALENESS_TIMEOUT_MS = 1_800_000 +export const DEFAULT_STALE_TIMEOUT_MS = 2_700_000 +export const DEFAULT_MESSAGE_STALENESS_TIMEOUT_MS = 3_600_000 export const DEFAULT_MAX_TOOL_CALLS = 4000 export const DEFAULT_CIRCUIT_BREAKER_CONSECUTIVE_THRESHOLD = 20 export const DEFAULT_CIRCUIT_BREAKER_ENABLED = true diff --git a/src/features/background-agent/default-message-staleness-timeout.test.ts b/src/features/background-agent/default-message-staleness-timeout.test.ts index b13bf191a..d8b4e6671 100644 --- a/src/features/background-agent/default-message-staleness-timeout.test.ts +++ b/src/features/background-agent/default-message-staleness-timeout.test.ts @@ -21,9 +21,9 @@ function createRunningTask(startedAt: Date): BackgroundTask { } describe("DEFAULT_MESSAGE_STALENESS_TIMEOUT_MS", () => { - test("uses a 30 minute default", () => { + test("uses a 60 minute default", () => { // #given - const expectedTimeout = 30 * 60 * 1000 + const expectedTimeout = 60 * 60 * 1000 // #when const timeout = DEFAULT_MESSAGE_STALENESS_TIMEOUT_MS diff --git a/src/features/background-agent/default-stale-timeout.test.ts b/src/features/background-agent/default-stale-timeout.test.ts index 704a530c9..3f63ca28a 100644 --- a/src/features/background-agent/default-stale-timeout.test.ts +++ b/src/features/background-agent/default-stale-timeout.test.ts @@ -4,9 +4,9 @@ const { describe, expect, test } = require("bun:test") import { DEFAULT_STALE_TIMEOUT_MS } from "./constants" describe("DEFAULT_STALE_TIMEOUT_MS", () => { - test("uses a 20 minute default", () => { + test("uses a 45 minute default", () => { // #given - const expectedTimeout = 20 * 60 * 1000 + const expectedTimeout = 45 * 60 * 1000 // #when const timeout = DEFAULT_STALE_TIMEOUT_MS diff --git a/src/features/background-agent/task-poller.ts b/src/features/background-agent/task-poller.ts index d23a241ae..84ba4c56e 100644 --- a/src/features/background-agent/task-poller.ts +++ b/src/features/background-agent/task-poller.ts @@ -130,7 +130,7 @@ export async function checkAndInterruptStaleTasks(args: { const staleMinutes = Math.round(runtime / 60000) task.status = "cancelled" - task.error = `Stale timeout (no activity for ${staleMinutes}min since start)` + task.error = `Stale timeout (no activity for ${staleMinutes}min since start). This is a FINAL cancellation - do NOT create a replacement task. If the timeout is too short, increase 'background_task.staleTimeoutMs' in .opencode/oh-my-opencode.json.` task.completedAt = new Date() if (task.concurrencyKey) { @@ -159,10 +159,10 @@ export async function checkAndInterruptStaleTasks(args: { if (timeSinceLastUpdate <= staleTimeoutMs) continue if (task.status !== "running") continue - const staleMinutes = Math.round(timeSinceLastUpdate / 60000) - task.status = "cancelled" - task.error = `Stale timeout (no activity for ${staleMinutes}min)` - task.completedAt = new Date() + const staleMinutes = Math.round(timeSinceLastUpdate / 60000) + task.status = "cancelled" + task.error = `Stale timeout (no activity for ${staleMinutes}min). This is a FINAL cancellation - do NOT create a replacement task. If the timeout is too short, increase 'background_task.staleTimeoutMs' in .opencode/oh-my-opencode.json.` + task.completedAt = new Date() if (task.concurrencyKey) { concurrencyManager.release(task.concurrencyKey)