fix: reset hook state on abort so session recovers after user cancel
When a user cancels a generation (ESC x2), all three idle hooks could enter a permanently broken state: 1. **todo-continuation-enforcer**: consecutiveFailures accumulated from abort-caused promptAsync failures, eventually hitting MAX_CONSECUTIVE_FAILURES and permanently stopping continuation injection. 2. **unstable-agent-babysitter**: no abort awareness at all — would keep firing reminders after user cancelled the session. 3. **runtime-fallback**: retry dedupe keys and pending fallback state persisted across cancellation, blocking legitimate error recovery. Fix: - Add shared `isAbortError()` utility for consistent abort detection - Reset consecutiveFailures and clear stale state on AbortError in all hooks - Track `lastCancelledAt` in todo-continuation-enforcer for abort window - Add abort-awareness to unstable-agent-babysitter (skip if recently cancelled) - Clear runtime-fallback retry state on abort errors Tests: 61 pass, 0 fail across all 3 affected hook test suites. Closes #2984
This commit is contained in:
@@ -61,6 +61,11 @@ export async function injectContinuation(args: {
|
||||
return
|
||||
}
|
||||
|
||||
if (state?.wasCancelled) {
|
||||
log(`[${HOOK_NAME}] Skipped injection: session was cancelled`, { sessionID })
|
||||
return
|
||||
}
|
||||
|
||||
if (isContinuationStopped?.(sessionID)) {
|
||||
log(`[${HOOK_NAME}] Skipped injection: continuation stopped for session`, { sessionID })
|
||||
return
|
||||
@@ -145,6 +150,11 @@ Remaining tasks:
|
||||
${todoList}`
|
||||
|
||||
const injectionState = sessionStateStore.getExistingState(sessionID)
|
||||
if (injectionState?.wasCancelled) {
|
||||
log(`[${HOOK_NAME}] Skipped injection: session was cancelled before prompt`, { sessionID })
|
||||
return
|
||||
}
|
||||
|
||||
if (injectionState) {
|
||||
injectionState.inFlight = true
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user