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.
This commit is contained in:
YeonGyu-Kim
2026-02-22 01:44:53 +09:00
parent aff49ef488
commit 9f10997987
4 changed files with 18 additions and 4 deletions

View File

@@ -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(),

View File

@@ -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,

View File

@@ -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<string, string>()

View File

@@ -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