From 3d5c96e6518326e6eb71d54c850d808f587e08ac Mon Sep 17 00:00:00 2001 From: ismeth Date: Thu, 19 Feb 2026 01:32:12 +0100 Subject: [PATCH] fix(background-output): prioritize block=true over fullSession auto-detection The fullSession path auto-activated for running tasks and returned immediately, completely bypassing the block=true waiting loop. This caused background_output(block=true) to never actually block, leading to rapid polling spam when agents tried to wait for task completion. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode) Co-authored-by: Sisyphus --- .../create-background-output.ts | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/tools/background-task/create-background-output.ts b/src/tools/background-task/create-background-output.ts index 78593a88..82ecb23e 100644 --- a/src/tools/background-task/create-background-output.ts +++ b/src/tools/background-task/create-background-output.ts @@ -106,6 +106,47 @@ export function createBackgroundOutput(manager: BackgroundOutputManager, client: } const isActive = resolvedTask.status === "pending" || resolvedTask.status === "running" +======= + const shouldBlock = args.block === true + const timeoutMs = Math.min(args.timeout ?? 60000, 600000) + + if (task.status === "completed") { + return await formatTaskResult(task, client) + } + + if (task.status === "error" || task.status === "cancelled" || task.status === "interrupt") { + return formatTaskStatus(task) + } + + if (shouldBlock) { + const startTime = Date.now() + while (Date.now() - startTime < timeoutMs) { + await delay(1000) + + const currentTask = manager.getTask(args.task_id) + if (!currentTask) { + return `Task was deleted: ${args.task_id}` + } + + if (currentTask.status === "completed") { + return await formatTaskResult(currentTask, client) + } + + if (currentTask.status === "error" || currentTask.status === "cancelled" || currentTask.status === "interrupt") { + return formatTaskStatus(currentTask) + } + } + + const finalTask = manager.getTask(args.task_id) + if (!finalTask) { + return `Task was deleted: ${args.task_id}` + } + return `Timeout exceeded (${timeoutMs}ms). Task still ${finalTask.status}.\n\n${formatTaskStatus(finalTask)}` + } + + const isActive = task.status === "pending" || task.status === "running" + const fullSession = args.full_session ?? isActive +>>>>>>> 20a1af47 (fix(background-output): prioritize block=true over fullSession auto-detection) const includeThinking = isActive || (args.include_thinking ?? false) const includeToolResults = isActive || (args.include_tool_results ?? false)