From 9f1099798771bf6604f3cced57e856a60a46ef2d Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sun, 22 Feb 2026 01:44:53 +0900 Subject: [PATCH] feat(config): allow runtime_fallback to be configured as boolean Enable simple boolean configuration for runtime_fallback: - "runtime_fallback": true - Enable with defaults - "runtime_fallback": false - Disable - "runtime_fallback": { ... } - Advanced object config (existing) Updated schema, event handler, chat-message handler, and session hooks to handle both boolean and object formats. --- src/config/schema/oh-my-opencode-config.ts | 7 ++++++- src/plugin/chat-message.ts | 4 +++- src/plugin/event.ts | 4 +++- src/plugin/hooks/create-session-hooks.ts | 7 ++++++- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/config/schema/oh-my-opencode-config.ts b/src/config/schema/oh-my-opencode-config.ts index 5d656ad65..ffd750c5e 100644 --- a/src/config/schema/oh-my-opencode-config.ts +++ b/src/config/schema/oh-my-opencode-config.ts @@ -44,7 +44,12 @@ export const OhMyOpenCodeConfigSchema = z.object({ auto_update: z.boolean().optional(), skills: SkillsConfigSchema.optional(), ralph_loop: RalphLoopConfigSchema.optional(), - runtime_fallback: RuntimeFallbackConfigSchema.optional(), + /** + * Enable runtime fallback (default: true) + * Set to false to disable, or use object for advanced config: + * { "enabled": true, "retry_on_errors": [400, 429], "timeout_seconds": 30 } + */ + runtime_fallback: z.union([z.boolean(), RuntimeFallbackConfigSchema]).optional(), background_task: BackgroundTaskConfigSchema.optional(), notification: NotificationConfigSchema.optional(), babysitting: BabysittingConfigSchema.optional(), diff --git a/src/plugin/chat-message.ts b/src/plugin/chat-message.ts index c1af58125..8573abfe9 100644 --- a/src/plugin/chat-message.ts +++ b/src/plugin/chat-message.ts @@ -62,7 +62,9 @@ export function createChatMessageHandler(args: { const isRuntimeFallbackEnabled = hooks.runtimeFallback !== null && hooks.runtimeFallback !== undefined && - (pluginConfig.runtime_fallback?.enabled ?? true) + (typeof pluginConfig.runtime_fallback === "boolean" + ? pluginConfig.runtime_fallback + : (pluginConfig.runtime_fallback?.enabled ?? true)) return async ( input: ChatMessageInput, diff --git a/src/plugin/event.ts b/src/plugin/event.ts index 34a255e96..b0189124a 100644 --- a/src/plugin/event.ts +++ b/src/plugin/event.ts @@ -121,7 +121,9 @@ export function createEventHandler(args: { const isRuntimeFallbackEnabled = hooks.runtimeFallback !== null && hooks.runtimeFallback !== undefined && - (args.pluginConfig.runtime_fallback?.enabled ?? true) + (typeof args.pluginConfig.runtime_fallback === "boolean" + ? args.pluginConfig.runtime_fallback + : (args.pluginConfig.runtime_fallback?.enabled ?? true)) // Avoid triggering multiple abort+continue cycles for the same failing assistant message. const lastHandledModelErrorMessageID = new Map() diff --git a/src/plugin/hooks/create-session-hooks.ts b/src/plugin/hooks/create-session-hooks.ts index 656aef81b..e66ffd58c 100644 --- a/src/plugin/hooks/create-session-hooks.ts +++ b/src/plugin/hooks/create-session-hooks.ts @@ -245,10 +245,15 @@ export function createSessionHooks(args: { ? safeHook("anthropic-effort", () => createAnthropicEffortHook()) : null + const runtimeFallbackConfig = + typeof pluginConfig.runtime_fallback === "boolean" + ? { enabled: pluginConfig.runtime_fallback } + : pluginConfig.runtime_fallback + const runtimeFallback = isHookEnabled("runtime-fallback") ? safeHook("runtime-fallback", () => createRuntimeFallbackHook(ctx, { - config: pluginConfig.runtime_fallback, + config: runtimeFallbackConfig, pluginConfig, })) : null