From 09e738c98951002abcf32cf82eeff3fe15b09b95 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sun, 1 Feb 2026 19:01:30 +0900 Subject: [PATCH] refactor(background-agent): optimize task timing and constants management Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode) Co-authored-by: Sisyphus --- src/features/background-agent/constants.ts | 4 ++-- src/features/background-agent/manager.ts | 19 +++++++++++-------- src/tools/delegate-task/timing.ts | 4 ++-- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/features/background-agent/constants.ts b/src/features/background-agent/constants.ts index a41d0bf2..99b4f298 100644 --- a/src/features/background-agent/constants.ts +++ b/src/features/background-agent/constants.ts @@ -6,8 +6,8 @@ export const MIN_STABILITY_TIME_MS = 10 * 1000 export const DEFAULT_STALE_TIMEOUT_MS = 180_000 export const MIN_RUNTIME_BEFORE_STALE_MS = 30_000 export const MIN_IDLE_TIME_MS = 5000 -export const POLLING_INTERVAL_MS = 2000 -export const TASK_CLEANUP_DELAY_MS = 5 * 60 * 1000 +export const POLLING_INTERVAL_MS = 3000 +export const TASK_CLEANUP_DELAY_MS = 10 * 60 * 1000 export const TMUX_CALLBACK_DELAY_MS = 200 export type ProcessCleanupEvent = NodeJS.Signals | "beforeExit" | "exit" diff --git a/src/features/background-agent/manager.ts b/src/features/background-agent/manager.ts index e537cd28..ab77ab46 100644 --- a/src/features/background-agent/manager.ts +++ b/src/features/background-agent/manager.ts @@ -9,6 +9,15 @@ import { log, getAgentToolRestrictions, promptWithModelSuggestionRetry } from ". import { ConcurrencyManager } from "./concurrency" import type { BackgroundTaskConfig, TmuxConfig } from "../../config/schema" import { isInsideTmux } from "../../shared/tmux" +import { + DEFAULT_STALE_TIMEOUT_MS, + MIN_IDLE_TIME_MS, + MIN_RUNTIME_BEFORE_STALE_MS, + MIN_STABILITY_TIME_MS, + POLLING_INTERVAL_MS, + TASK_CLEANUP_DELAY_MS, + TASK_TTL_MS, +} from "./constants" import { subagentSessions } from "../claude-code-session-state" import { getTaskToastManager } from "../task-toast-manager" @@ -16,11 +25,6 @@ import { findNearestMessageWithFields, MESSAGE_STORAGE } from "../hook-message-i import { existsSync, readdirSync } from "node:fs" import { join } from "node:path" -const TASK_TTL_MS = 30 * 60 * 1000 -const MIN_STABILITY_TIME_MS = 10 * 1000 // Must run at least 10s before stability detection kicks in -const DEFAULT_STALE_TIMEOUT_MS = 180_000 // 3 minutes -const MIN_RUNTIME_BEFORE_STALE_MS = 30_000 // 30 seconds - type ProcessCleanupEvent = NodeJS.Signals | "beforeExit" | "exit" type OpencodeClient = PluginInput["client"] @@ -653,7 +657,6 @@ export class BackgroundManager { // Edge guard: Require minimum elapsed time (5 seconds) before accepting idle const elapsedMs = Date.now() - startedAt.getTime() - const MIN_IDLE_TIME_MS = 5000 if (elapsedMs < MIN_IDLE_TIME_MS) { log("[background-agent] Ignoring early session.idle, elapsed:", { elapsedMs, taskId: task.id }) return @@ -862,7 +865,7 @@ export class BackgroundManager { this.pollingInterval = setInterval(() => { this.pollRunningTasks() - }, 2000) + }, POLLING_INTERVAL_MS) this.pollingInterval.unref() } @@ -1091,7 +1094,7 @@ Use \`background_output(task_id="${task.id}")\` to retrieve this result when rea this.tasks.delete(taskId) log("[background-agent] Removed completed task from memory:", taskId) } - }, 5 * 60 * 1000) + }, TASK_CLEANUP_DELAY_MS) this.completionTimers.set(taskId, timer) } diff --git a/src/tools/delegate-task/timing.ts b/src/tools/delegate-task/timing.ts index 21869c7b..5510d4e2 100644 --- a/src/tools/delegate-task/timing.ts +++ b/src/tools/delegate-task/timing.ts @@ -1,4 +1,4 @@ -let POLL_INTERVAL_MS = 500 +let POLL_INTERVAL_MS = 1000 let MIN_STABILITY_TIME_MS = 10000 let STABILITY_POLLS_REQUIRED = 3 let WAIT_FOR_SESSION_INTERVAL_MS = 100 @@ -19,7 +19,7 @@ export function getTimingConfig() { } export function __resetTimingConfig(): void { - POLL_INTERVAL_MS = 500 + POLL_INTERVAL_MS = 1000 MIN_STABILITY_TIME_MS = 10000 STABILITY_POLLS_REQUIRED = 3 WAIT_FOR_SESSION_INTERVAL_MS = 100