From cc3cca7cb7f72204a6be1dff27f037544b3d04e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Choi=20Kijin=20/=20=EC=B5=9C=20=EA=B8=B0=EC=A7=84=20/=20?= =?UTF-8?q?=E3=83=81=E3=83=A7=E3=82=A4=20=E3=82=AD=E3=82=B8=E3=83=B3?= Date: Tue, 28 Apr 2026 15:27:34 +0900 Subject: [PATCH] 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 --- src/create-managers.ts | 4 ++-- src/hooks/model-fallback/controller-accessor.ts | 6 ++++++ src/hooks/model-fallback/fallback-state-controller.ts | 6 ++++++ src/hooks/model-fallback/hook.ts | 9 +++++++++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/create-managers.ts b/src/create-managers.ts index 9c0013fd4..602cc8502 100644 --- a/src/create-managers.ts +++ b/src/create-managers.ts @@ -58,6 +58,7 @@ export function createManagers(args: { deps.markServerRunningInProcessFn() } const tmuxSessionManager = new deps.TmuxSessionManagerClass(ctx, tmuxConfig) + const modelFallbackControllerAccessor = createModelFallbackControllerAccessor() deps.registerManagerForCleanupFn({ shutdown: async () => { @@ -110,6 +111,7 @@ export function createManagers(args: { }) }, enableParentSessionNotifications: backgroundNotificationHookEnabled, + modelFallbackControllerAccessor, }, ) @@ -122,8 +124,6 @@ export function createManagers(args: { pluginConfig, modelCacheState, }) - const modelFallbackControllerAccessor = createModelFallbackControllerAccessor() - return { tmuxSessionManager, backgroundManager, diff --git a/src/hooks/model-fallback/controller-accessor.ts b/src/hooks/model-fallback/controller-accessor.ts index 281ae9931..89c30571c 100644 --- a/src/hooks/model-fallback/controller-accessor.ts +++ b/src/hooks/model-fallback/controller-accessor.ts @@ -4,6 +4,7 @@ import type { ModelFallbackStateController } from "./fallback-state-controller" export type ModelFallbackControllerAccessor = { register: (controller: ModelFallbackStateController) => void setSessionFallbackChain: (sessionID: string, fallbackChain: FallbackEntry[] | undefined) => void + getSessionFallbackChain: (sessionID: string) => FallbackEntry[] | undefined clearSessionFallbackChain: (sessionID: string) => void } @@ -18,6 +19,10 @@ export function createModelFallbackControllerAccessor(): ModelFallbackController controller?.setSessionFallbackChain(sessionID, fallbackChain) } + function getSessionFallbackChain(sessionID: string): FallbackEntry[] | undefined { + return controller?.getSessionFallbackChain(sessionID) + } + function clearSessionFallbackChain(sessionID: string): void { controller?.clearSessionFallbackChain(sessionID) } @@ -25,6 +30,7 @@ export function createModelFallbackControllerAccessor(): ModelFallbackController return { register, setSessionFallbackChain, + getSessionFallbackChain, clearSessionFallbackChain, } } diff --git a/src/hooks/model-fallback/fallback-state-controller.ts b/src/hooks/model-fallback/fallback-state-controller.ts index 4230bfb0a..87bd28444 100644 --- a/src/hooks/model-fallback/fallback-state-controller.ts +++ b/src/hooks/model-fallback/fallback-state-controller.ts @@ -15,6 +15,7 @@ type ModelFallbackStateLike = { export type ModelFallbackStateController = { lastToastKey: Map setSessionFallbackChain: (sessionID: string, fallbackChain: FallbackEntry[] | undefined) => void + getSessionFallbackChain: (sessionID: string) => FallbackEntry[] | undefined clearSessionFallbackChain: (sessionID: string) => void setPendingModelFallback: ( sessionID: string, @@ -45,6 +46,10 @@ export function createModelFallbackStateController(input: { sessionFallbackChains.delete(sessionID) } + function getSessionFallbackChain(sessionID: string): FallbackEntry[] | undefined { + return sessionFallbackChains.get(sessionID) + } + function setPendingModelFallback( sessionID: string, agentName: string, @@ -123,6 +128,7 @@ export function createModelFallbackStateController(input: { return { lastToastKey, setSessionFallbackChain, + getSessionFallbackChain, clearSessionFallbackChain, setPendingModelFallback, getNextFallback, diff --git a/src/hooks/model-fallback/hook.ts b/src/hooks/model-fallback/hook.ts index fee130ed8..71c1e605d 100644 --- a/src/hooks/model-fallback/hook.ts +++ b/src/hooks/model-fallback/hook.ts @@ -33,6 +33,7 @@ type ModelFallbackControllerWithState = Pick< ModelFallbackStateController, | "lastToastKey" | "setSessionFallbackChain" + | "getSessionFallbackChain" | "clearSessionFallbackChain" | "setPendingModelFallback" | "getNextFallback" @@ -70,6 +71,13 @@ export function clearSessionFallbackChain( controller.clearSessionFallbackChain(sessionID) } +export function getSessionFallbackChain( + controller: Pick, + sessionID: string, +): FallbackEntry[] | undefined { + return controller.getSessionFallbackChain(sessionID) +} + /** * Sets a pending model fallback for a session. * Called when a model error is detected in session.error handler. @@ -152,6 +160,7 @@ export function createModelFallbackHook(args?: ModelFallbackHookArgs): ModelFall return { lastToastKey: controller.lastToastKey, setSessionFallbackChain: controller.setSessionFallbackChain, + getSessionFallbackChain: controller.getSessionFallbackChain, clearSessionFallbackChain: controller.clearSessionFallbackChain, setPendingModelFallback: controller.setPendingModelFallback, getNextFallback: controller.getNextFallback,