fix(model-fallback): clone session fallback chains

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 21:43:10 +09:00
parent 2237c1accd
commit 185665707c
2 changed files with 26 additions and 42 deletions
@@ -39,7 +39,7 @@ export function createModelFallbackStateController(input: {
function setSessionFallbackChain(sessionID: string, fallbackChain: FallbackEntry[] | undefined): void {
if (!sessionID) return
sessionFallbackChains.set(sessionID, fallbackChain?.length ? fallbackChain : [])
sessionFallbackChains.set(sessionID, fallbackChain?.length ? [...fallbackChain] : [])
}
function clearSessionFallbackChain(sessionID: string): void {
@@ -47,7 +47,8 @@ export function createModelFallbackStateController(input: {
}
function getSessionFallbackChain(sessionID: string): FallbackEntry[] | undefined {
return sessionFallbackChains.get(sessionID)
const fallbackChain = sessionFallbackChains.get(sessionID)
return fallbackChain ? [...fallbackChain] : undefined
}
function setPendingModelFallback(
@@ -61,7 +62,7 @@ export function createModelFallbackStateController(input: {
const fallbackChain = sessionFallbackChains.get(sessionID) ?? requirements?.fallbackChain
if (!fallbackChain?.length) {
log("[model-fallback] No fallback chain for agent: " + agentName + " (key: " + agentKey + ")")
log(`[model-fallback] No fallback chain for agent: ${agentName} (key: ${agentKey})`)
return false
}
@@ -74,12 +75,12 @@ export function createModelFallbackStateController(input: {
attemptCount: 0,
pending: true,
})
log("[model-fallback] Set pending fallback for session: " + sessionID + ", agent: " + agentName)
log(`[model-fallback] Set pending fallback for session: ${sessionID}, agent: ${agentName}`)
return true
}
if (existing.pending) {
log("[model-fallback] Pending fallback already armed for session: " + sessionID)
log(`[model-fallback] Pending fallback already armed for session: ${sessionID}`)
return false
}
@@ -87,10 +88,10 @@ export function createModelFallbackStateController(input: {
existing.modelID = currentModelID
existing.pending = true
if (existing.attemptCount >= existing.fallbackChain.length) {
log("[model-fallback] Fallback chain exhausted for session: " + sessionID)
log(`[model-fallback] Fallback chain exhausted for session: ${sessionID}`)
return false
}
log("[model-fallback] Re-armed pending fallback for session: " + sessionID)
log(`[model-fallback] Re-armed pending fallback for session: ${sessionID}`)
return true
}
@@ -101,7 +102,7 @@ export function createModelFallbackStateController(input: {
const fallback = getNextReachableFallback(sessionID, state)
if (fallback) return fallback
log("[model-fallback] No more fallbacks for session: " + sessionID)
log(`[model-fallback] No more fallbacks for session: ${sessionID}`)
pendingModelFallbacks.delete(sessionID)
return null
}