fix(fallback): guard duplicate prompt injections

This commit is contained in:
YeonGyu-Kim
2026-05-14 01:03:19 +09:00
parent ea55c385bb
commit 5ffbe0e24e
7 changed files with 257 additions and 15 deletions
@@ -12,6 +12,21 @@ import { dispatchFallbackRetry } from "./fallback-retry-dispatcher"
import { createSessionStatusHandler } from "./session-status-handler"
import { resolveMessageEventSessionID, resolveSessionEventID } from "../../shared/event-session-id"
function resolveEventModel(props: Record<string, unknown> | undefined): string | undefined {
const model = props?.model
if (typeof model === "string") {
return model
}
const providerID = props?.providerID
const modelID = props?.modelID
if (typeof providerID === "string" && typeof modelID === "string") {
return `${providerID}/${modelID}`
}
return undefined
}
export function createEventHandler(deps: HookDeps, helpers: AutoRetryHelpers) {
const { config, pluginConfig, sessionStates, sessionLastAccess, sessionRetryInFlight, sessionAwaitingFallbackResult, sessionFallbackTimeouts, sessionStatusRetryKeys } = deps
const sessionStatusHandler = createSessionStatusHandler(deps, helpers, sessionStatusRetryKeys)
@@ -137,6 +152,19 @@ export function createEventHandler(deps: HookDeps, helpers: AutoRetryHelpers) {
return
}
if (sessionAwaitingFallbackResult.has(sessionID)) {
const pendingFallbackModel = sessionStates.get(sessionID)?.pendingFallbackModel
const eventModel = resolveEventModel(props)
if (!pendingFallbackModel || eventModel !== pendingFallbackModel) {
log(`[${HOOK_NAME}] session.error skipped - awaiting fallback result`, {
sessionID,
pendingFallbackModel,
eventModel,
})
return
}
}
sessionAwaitingFallbackResult.delete(sessionID)
helpers.clearSessionFallbackTimeout(sessionID)