From 063c75927573ce5abade9ac446e8981d1afa2fc3 Mon Sep 17 00:00:00 2001 From: justsisyphus Date: Sat, 24 Jan 2026 17:15:31 +0900 Subject: [PATCH] feat: show detailed task info and resume instructions on background_cancel(all=true) (#1062) Co-authored-by: justsisyphus --- src/tools/background-task/tools.ts | 46 ++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/src/tools/background-task/tools.ts b/src/tools/background-task/tools.ts index 6d4ecd79..93014ec7 100644 --- a/src/tools/background-task/tools.ts +++ b/src/tools/background-task/tools.ts @@ -406,27 +406,61 @@ export function createBackgroundCancel(manager: BackgroundManager, client: Openc return `No running or pending background tasks to cancel.` } - const results: string[] = [] + const cancelledInfo: Array<{ + id: string + description: string + status: string + sessionID?: string + }> = [] + for (const task of cancellableTasks) { if (task.status === "pending") { - // Pending task: use manager method (no session to abort) manager.cancelPendingTask(task.id) - results.push(`- ${task.id}: ${task.description} (pending)`) + cancelledInfo.push({ + id: task.id, + description: task.description, + status: "pending", + sessionID: undefined, + }) } else if (task.sessionID) { - // Running task: abort session client.session.abort({ path: { id: task.sessionID }, }).catch(() => {}) task.status = "cancelled" task.completedAt = new Date() - results.push(`- ${task.id}: ${task.description} (running)`) + cancelledInfo.push({ + id: task.id, + description: task.description, + status: "running", + sessionID: task.sessionID, + }) } } + const tableRows = cancelledInfo + .map(t => `| \`${t.id}\` | ${t.description} | ${t.status} | ${t.sessionID ? `\`${t.sessionID}\`` : "(not started)"} |`) + .join("\n") + + const resumableTasks = cancelledInfo.filter(t => t.sessionID) + const resumeSection = resumableTasks.length > 0 + ? `\n## Resume Instructions + +To resume a cancelled task, use: +\`\`\` +delegate_task(resume="", prompt="Continue: ") +\`\`\` + +Resumable sessions: +${resumableTasks.map(t => `- \`${t.sessionID}\` (${t.description})`).join("\n")}` + : "" + return `Cancelled ${cancellableTasks.length} background task(s): -${results.join("\n")}` +| Task ID | Description | Status | Session ID | +|---------|-------------|--------|------------| +${tableRows} +${resumeSection}` } const task = manager.getTask(args.taskId!)