fix(runtime-fallback): preserve accepted pending retries
This commit is contained in:
@@ -16,7 +16,7 @@ import {
|
||||
isInternalPromptDispatchAccepted,
|
||||
releasePromptAsyncReservation,
|
||||
} from "../shared/prompt-async-gate"
|
||||
import { isAmbiguousPromptDispatchFailure } from "../../shared/prompt-failure-classifier"
|
||||
import { isAmbiguousPostDispatchPromptFailure } from "../../shared/prompt-failure-classifier"
|
||||
|
||||
const SESSION_TTL_MS = 30 * 60 * 1000
|
||||
|
||||
@@ -93,6 +93,7 @@ export function createAutoRetryHelpers(deps: HookDeps) {
|
||||
if (state.pendingFallbackModel) {
|
||||
state.pendingFallbackModel = undefined
|
||||
}
|
||||
state.pendingFallbackPromptMayHaveBeenAccepted = false
|
||||
|
||||
const fallbackModels = getFallbackModelsForSession(sessionID, resolvedAgent, pluginConfig)
|
||||
if (fallbackModels.length === 0) return
|
||||
@@ -136,11 +137,15 @@ export function createAutoRetryHelpers(deps: HookDeps) {
|
||||
if (state?.pendingFallbackModel) {
|
||||
state.pendingFallbackModel = undefined
|
||||
}
|
||||
if (state) {
|
||||
state.pendingFallbackPromptMayHaveBeenAccepted = false
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
const hadAwaitingFallbackResult = sessionAwaitingFallbackResult.has(sessionID)
|
||||
const previousPendingFallbackModel = sessionStates.get(sessionID)?.pendingFallbackModel
|
||||
const previousPendingFallbackPromptMayHaveBeenAccepted = sessionStates.get(sessionID)?.pendingFallbackPromptMayHaveBeenAccepted
|
||||
sessionRetryInFlight.add(sessionID)
|
||||
let retryDispatched = false
|
||||
let retryMayHaveBeenAccepted = false
|
||||
@@ -184,7 +189,7 @@ export function createAutoRetryHelpers(deps: HookDeps) {
|
||||
},
|
||||
})
|
||||
if (promptResult.status === "failed") {
|
||||
if (isAmbiguousPromptDispatchFailure(promptResult.error)) {
|
||||
if (isAmbiguousPostDispatchPromptFailure(promptResult)) {
|
||||
retryMayHaveBeenAccepted = true
|
||||
log(`[${HOOK_NAME}] Auto-retry prompt failed after dispatch may have been accepted (${source}); preserving fallback state`, {
|
||||
sessionID,
|
||||
@@ -204,6 +209,10 @@ export function createAutoRetryHelpers(deps: HookDeps) {
|
||||
if (hadAwaitingFallbackResult) {
|
||||
scheduleSessionFallbackTimeout(sessionID, retryAgent)
|
||||
}
|
||||
const state = sessionStates.get(sessionID)
|
||||
if (state) {
|
||||
state.pendingFallbackPromptMayHaveBeenAccepted = false
|
||||
}
|
||||
retryDispatched = true
|
||||
} else {
|
||||
log(`[${HOOK_NAME}] No user message found for auto-retry (${source})`, { sessionID })
|
||||
@@ -212,6 +221,12 @@ export function createAutoRetryHelpers(deps: HookDeps) {
|
||||
log(`[${HOOK_NAME}] Auto-retry failed (${source})`, { sessionID, error: String(retryError) })
|
||||
} finally {
|
||||
sessionRetryInFlight.delete(sessionID)
|
||||
if (retryMayHaveBeenAccepted) {
|
||||
const state = sessionStates.get(sessionID)
|
||||
if (state) {
|
||||
state.pendingFallbackPromptMayHaveBeenAccepted = true
|
||||
}
|
||||
}
|
||||
if (!retryDispatched && !retryMayHaveBeenAccepted) {
|
||||
if (hadAwaitingFallbackResult) {
|
||||
sessionAwaitingFallbackResult.add(sessionID)
|
||||
@@ -223,8 +238,10 @@ export function createAutoRetryHelpers(deps: HookDeps) {
|
||||
if (state) {
|
||||
if (hadAwaitingFallbackResult) {
|
||||
state.pendingFallbackModel = previousPendingFallbackModel
|
||||
state.pendingFallbackPromptMayHaveBeenAccepted = previousPendingFallbackPromptMayHaveBeenAccepted
|
||||
} else if (state.pendingFallbackModel) {
|
||||
state.pendingFallbackModel = undefined
|
||||
state.pendingFallbackPromptMayHaveBeenAccepted = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user