feat(background-agent): handle "interrupt" in notifications, output, and formatting

Update notification systems to display INTERRUPTED status.

Add interrupt handling to background_output tool (terminal status).

Add interrupt-specific status note to formatTaskStatus.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
YeonGyu-Kim
2026-02-09 18:26:16 +09:00
parent 5b34a98e0a
commit 498fda11a0
6 changed files with 37 additions and 29 deletions

View File

@@ -1,6 +1,6 @@
import type { BackgroundTask } from "./types"
export type BackgroundTaskNotificationStatus = "COMPLETED" | "CANCELLED"
export type BackgroundTaskNotificationStatus = "COMPLETED" | "CANCELLED" | "INTERRUPTED"
export function buildBackgroundTaskNotificationText(input: {
task: BackgroundTask

View File

@@ -9,7 +9,7 @@ export function buildBackgroundTaskNotificationText(args: {
}): string {
const { task, duration, allComplete, remainingCount, completedTasks } = args
const statusText =
task.status === "completed" ? "COMPLETED" : task.status === "error" ? "ERROR" : "CANCELLED"
task.status === "completed" ? "COMPLETED" : task.status === "interrupt" ? "INTERRUPTED" : task.status === "error" ? "ERROR" : "CANCELLED"
const errorInfo = task.error ? `\n**Error:** ${task.error}` : ""
if (allComplete) {

View File

@@ -92,7 +92,7 @@ export function createBackgroundOutput(manager: BackgroundOutputManager, client:
return await formatTaskResult(task, client)
}
if (task.status === "error" || task.status === "cancelled") {
if (task.status === "error" || task.status === "cancelled" || task.status === "interrupt") {
return formatTaskStatus(task)
}
@@ -113,7 +113,7 @@ export function createBackgroundOutput(manager: BackgroundOutputManager, client:
return await formatTaskResult(currentTask, client)
}
if (currentTask.status === "error" || currentTask.status === "cancelled") {
if (currentTask.status === "error" || currentTask.status === "cancelled" || currentTask.status === "interrupt") {
return formatTaskStatus(currentTask)
}
}

View File

@@ -94,7 +94,7 @@ export function createBackgroundOutput(manager: BackgroundOutputManager, client:
}
// Error or cancelled: return status immediately
if (task.status === "error" || task.status === "cancelled") {
if (task.status === "error" || task.status === "cancelled" || task.status === "interrupt") {
return formatTaskStatus(task)
}
@@ -118,7 +118,7 @@ export function createBackgroundOutput(manager: BackgroundOutputManager, client:
return await formatTaskResult(currentTask, client)
}
if (currentTask.status === "error" || currentTask.status === "cancelled") {
if (currentTask.status === "error" || currentTask.status === "cancelled" || currentTask.status === "interrupt") {
return formatTaskStatus(currentTask)
}
}

View File

@@ -51,6 +51,10 @@ ${truncated}
statusNote = `
> **Failed**: The task encountered an error. Check the last message for details.`
} else if (task.status === "interrupt") {
statusNote = `
> **Interrupted**: The task was interrupted by a prompt error. The session may contain partial results.`
}
const durationLabel = task.status === "pending" ? "Queued for" : "Duration"

View File

@@ -45,6 +45,10 @@ ${truncated}
statusNote = `
> **Failed**: The task encountered an error. Check the last message for details.`
} else if (task.status === "interrupt") {
statusNote = `
> **Interrupted**: The task was interrupted by a prompt error. The session may contain partial results.`
}
const durationLabel = task.status === "pending" ? "Queued for" : "Duration"