diff --git a/src/features/background-agent/notification-builder.ts b/src/features/background-agent/notification-builder.ts index e16d2b4e..66e9c5a8 100644 --- a/src/features/background-agent/notification-builder.ts +++ b/src/features/background-agent/notification-builder.ts @@ -8,7 +8,8 @@ export function buildBackgroundTaskNotificationText(args: { completedTasks: BackgroundTask[] }): string { const { task, duration, allComplete, remainingCount, completedTasks } = args - const statusText = task.status === "completed" ? "COMPLETED" : "CANCELLED" + const statusText = + task.status === "completed" ? "COMPLETED" : task.status === "error" ? "ERROR" : "CANCELLED" const errorInfo = task.error ? `\n**Error:** ${task.error}` : "" if (allComplete) { diff --git a/src/features/background-agent/parent-session-notifier.ts b/src/features/background-agent/parent-session-notifier.ts index 9d4c1ac0..2c2ff05a 100644 --- a/src/features/background-agent/parent-session-notifier.ts +++ b/src/features/background-agent/parent-session-notifier.ts @@ -13,7 +13,7 @@ export async function notifyParentSession( ): Promise { const { client, state } = ctx - const duration = formatDuration(task.startedAt ?? new Date(), task.completedAt) + const duration = formatDuration(task.startedAt ?? task.completedAt ?? new Date(), task.completedAt) log("[background-agent] notifyParentSession called for task:", task.id) const toastManager = getTaskToastManager() diff --git a/src/features/background-agent/poll-running-tasks.ts b/src/features/background-agent/poll-running-tasks.ts index 688bba6f..6c5a4461 100644 --- a/src/features/background-agent/poll-running-tasks.ts +++ b/src/features/background-agent/poll-running-tasks.ts @@ -94,7 +94,10 @@ export async function pollRunningTasks(args: { continue } - const messages = asSessionMessages((messagesResult as { data?: unknown }).data) + const messagesPayload = Array.isArray(messagesResult) + ? messagesResult + : (messagesResult as { data?: unknown }).data + const messages = asSessionMessages(messagesPayload) const assistantMsgs = messages.filter((m) => m.info?.role === "assistant") let toolCalls = 0 diff --git a/src/features/background-agent/session-output-validator.ts b/src/features/background-agent/session-output-validator.ts index 136bcc41..8e14a21c 100644 --- a/src/features/background-agent/session-output-validator.ts +++ b/src/features/background-agent/session-output-validator.ts @@ -55,7 +55,8 @@ export async function validateSessionHasOutput( path: { id: sessionID }, }) - const messagesRaw = "data" in response ? response.data : [] + const messagesRaw = + isObject(response) && "data" in response ? (response as { data?: unknown }).data : response const messages = Array.isArray(messagesRaw) ? messagesRaw : [] const hasAssistantOrToolMessage = messages.some((message) => { diff --git a/src/features/background-agent/task-queries.ts b/src/features/background-agent/task-queries.ts index d53c6f90..641f0e41 100644 --- a/src/features/background-agent/task-queries.ts +++ b/src/features/background-agent/task-queries.ts @@ -45,7 +45,7 @@ export function getRunningTasks(tasks: Iterable): BackgroundTask } export function getCompletedTasks(tasks: Iterable): BackgroundTask[] { - return Array.from(tasks).filter((t) => t.status !== "running") + return Array.from(tasks).filter((t) => t.status === "completed") } export function hasRunningTasks(tasks: Iterable): boolean { diff --git a/src/features/background-agent/task-resumer.ts b/src/features/background-agent/task-resumer.ts index e09b1276..632081c3 100644 --- a/src/features/background-agent/task-resumer.ts +++ b/src/features/background-agent/task-resumer.ts @@ -48,7 +48,11 @@ export async function resumeBackgroundTask(args: { return existingTask } - const concurrencyKey = existingTask.concurrencyGroup ?? existingTask.agent + const concurrencyKey = + existingTask.concurrencyGroup ?? + (existingTask.model + ? `${existingTask.model.providerID}/${existingTask.model.modelID}` + : existingTask.agent) await concurrencyManager.acquire(concurrencyKey) existingTask.concurrencyKey = concurrencyKey existingTask.concurrencyGroup = concurrencyKey