fix(model-fallback): expose session fallback chains to background tasks

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:27:34 +09:00
parent 034744cbf2
commit cc3cca7cb7
4 changed files with 23 additions and 2 deletions
+2 -2
View File
@@ -58,6 +58,7 @@ export function createManagers(args: {
deps.markServerRunningInProcessFn() deps.markServerRunningInProcessFn()
} }
const tmuxSessionManager = new deps.TmuxSessionManagerClass(ctx, tmuxConfig) const tmuxSessionManager = new deps.TmuxSessionManagerClass(ctx, tmuxConfig)
const modelFallbackControllerAccessor = createModelFallbackControllerAccessor()
deps.registerManagerForCleanupFn({ deps.registerManagerForCleanupFn({
shutdown: async () => { shutdown: async () => {
@@ -110,6 +111,7 @@ export function createManagers(args: {
}) })
}, },
enableParentSessionNotifications: backgroundNotificationHookEnabled, enableParentSessionNotifications: backgroundNotificationHookEnabled,
modelFallbackControllerAccessor,
}, },
) )
@@ -122,8 +124,6 @@ export function createManagers(args: {
pluginConfig, pluginConfig,
modelCacheState, modelCacheState,
}) })
const modelFallbackControllerAccessor = createModelFallbackControllerAccessor()
return { return {
tmuxSessionManager, tmuxSessionManager,
backgroundManager, backgroundManager,
@@ -4,6 +4,7 @@ import type { ModelFallbackStateController } from "./fallback-state-controller"
export type ModelFallbackControllerAccessor = { export type ModelFallbackControllerAccessor = {
register: (controller: ModelFallbackStateController) => void register: (controller: ModelFallbackStateController) => void
setSessionFallbackChain: (sessionID: string, fallbackChain: FallbackEntry[] | undefined) => void setSessionFallbackChain: (sessionID: string, fallbackChain: FallbackEntry[] | undefined) => void
getSessionFallbackChain: (sessionID: string) => FallbackEntry[] | undefined
clearSessionFallbackChain: (sessionID: string) => void clearSessionFallbackChain: (sessionID: string) => void
} }
@@ -18,6 +19,10 @@ export function createModelFallbackControllerAccessor(): ModelFallbackController
controller?.setSessionFallbackChain(sessionID, fallbackChain) controller?.setSessionFallbackChain(sessionID, fallbackChain)
} }
function getSessionFallbackChain(sessionID: string): FallbackEntry[] | undefined {
return controller?.getSessionFallbackChain(sessionID)
}
function clearSessionFallbackChain(sessionID: string): void { function clearSessionFallbackChain(sessionID: string): void {
controller?.clearSessionFallbackChain(sessionID) controller?.clearSessionFallbackChain(sessionID)
} }
@@ -25,6 +30,7 @@ export function createModelFallbackControllerAccessor(): ModelFallbackController
return { return {
register, register,
setSessionFallbackChain, setSessionFallbackChain,
getSessionFallbackChain,
clearSessionFallbackChain, clearSessionFallbackChain,
} }
} }
@@ -15,6 +15,7 @@ type ModelFallbackStateLike = {
export type ModelFallbackStateController = { export type ModelFallbackStateController = {
lastToastKey: Map<string, string> lastToastKey: Map<string, string>
setSessionFallbackChain: (sessionID: string, fallbackChain: FallbackEntry[] | undefined) => void setSessionFallbackChain: (sessionID: string, fallbackChain: FallbackEntry[] | undefined) => void
getSessionFallbackChain: (sessionID: string) => FallbackEntry[] | undefined
clearSessionFallbackChain: (sessionID: string) => void clearSessionFallbackChain: (sessionID: string) => void
setPendingModelFallback: ( setPendingModelFallback: (
sessionID: string, sessionID: string,
@@ -45,6 +46,10 @@ export function createModelFallbackStateController(input: {
sessionFallbackChains.delete(sessionID) sessionFallbackChains.delete(sessionID)
} }
function getSessionFallbackChain(sessionID: string): FallbackEntry[] | undefined {
return sessionFallbackChains.get(sessionID)
}
function setPendingModelFallback( function setPendingModelFallback(
sessionID: string, sessionID: string,
agentName: string, agentName: string,
@@ -123,6 +128,7 @@ export function createModelFallbackStateController(input: {
return { return {
lastToastKey, lastToastKey,
setSessionFallbackChain, setSessionFallbackChain,
getSessionFallbackChain,
clearSessionFallbackChain, clearSessionFallbackChain,
setPendingModelFallback, setPendingModelFallback,
getNextFallback, getNextFallback,
+9
View File
@@ -33,6 +33,7 @@ type ModelFallbackControllerWithState = Pick<
ModelFallbackStateController, ModelFallbackStateController,
| "lastToastKey" | "lastToastKey"
| "setSessionFallbackChain" | "setSessionFallbackChain"
| "getSessionFallbackChain"
| "clearSessionFallbackChain" | "clearSessionFallbackChain"
| "setPendingModelFallback" | "setPendingModelFallback"
| "getNextFallback" | "getNextFallback"
@@ -70,6 +71,13 @@ export function clearSessionFallbackChain(
controller.clearSessionFallbackChain(sessionID) controller.clearSessionFallbackChain(sessionID)
} }
export function getSessionFallbackChain(
controller: Pick<ModelFallbackStateController, "getSessionFallbackChain">,
sessionID: string,
): FallbackEntry[] | undefined {
return controller.getSessionFallbackChain(sessionID)
}
/** /**
* Sets a pending model fallback for a session. * Sets a pending model fallback for a session.
* Called when a model error is detected in session.error handler. * Called when a model error is detected in session.error handler.
@@ -152,6 +160,7 @@ export function createModelFallbackHook(args?: ModelFallbackHookArgs): ModelFall
return { return {
lastToastKey: controller.lastToastKey, lastToastKey: controller.lastToastKey,
setSessionFallbackChain: controller.setSessionFallbackChain, setSessionFallbackChain: controller.setSessionFallbackChain,
getSessionFallbackChain: controller.getSessionFallbackChain,
clearSessionFallbackChain: controller.clearSessionFallbackChain, clearSessionFallbackChain: controller.clearSessionFallbackChain,
setPendingModelFallback: controller.setPendingModelFallback, setPendingModelFallback: controller.setPendingModelFallback,
getNextFallback: controller.getNextFallback, getNextFallback: controller.getNextFallback,