fix(delegate-task): retry sync tasks after runtime session errors

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
Choi Kijin / 최 기진 / チョイ キジン
2026-04-28 15:28:20 +09:00
parent a4968a3d1d
commit 613e4a6c12
6 changed files with 268 additions and 37 deletions
@@ -3,6 +3,7 @@ import type { SessionMessage } from "./executor-types"
import { getDefaultSyncPollTimeoutMs, getTimingConfig } from "./timing"
import { log } from "../../shared/logger"
import { normalizeSDKResponse } from "../../shared"
import { extractErrorMessage } from "../../features/background-agent/error-classifier"
const NON_TERMINAL_FINISH_REASONS = new Set(["tool-calls", "unknown"])
const PENDING_TOOL_PART_TYPES = new Set(["tool", "tool_use", "tool-call"])
@@ -32,6 +33,16 @@ async function fetchSessionMessages(
return Array.isArray(rawData) ? (rawData as SessionMessage[]) : []
}
function getTerminalSessionError(messages: SessionMessage[]): string | null {
const lastAssistant = [...messages].reverse().find((msg) => msg.info?.role === "assistant")
if (!lastAssistant?.info || !("error" in lastAssistant.info)) {
return null
}
const errorMessage = extractErrorMessage((lastAssistant.info as { error?: unknown }).error)
return errorMessage && errorMessage.length > 0 ? errorMessage : "Session error"
}
export function isSessionComplete(messages: SessionMessage[]): boolean {
let lastUser: SessionMessage | undefined
let lastAssistant: SessionMessage | undefined
@@ -137,6 +148,12 @@ export async function pollSyncSession(
continue
}
const sessionError = getTerminalSessionError(messages)
if (sessionError) {
log("[task] Poll detected terminal session error", { sessionID: input.sessionID, sessionError })
return sessionError
}
if (isSessionComplete(messages)) {
log("[task] Poll complete - terminal finish detected", { sessionID: input.sessionID, pollCount })
break