From 590dc04be7d782b465d630905193ce72d2a624bb Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sat, 21 Feb 2026 04:13:41 +0900 Subject: [PATCH] fix(ralph-loop): bind selectSession to tui context, use sourceSessionID for tool inheritance, handle flag-only arguments, fix test provider mocks --- src/hooks/ralph-loop/command-arguments.ts | 3 ++- src/hooks/ralph-loop/continuation-prompt-injector.ts | 2 +- src/hooks/ralph-loop/session-reset-strategy.ts | 2 +- src/plugin-handlers/config-handler.test.ts | 4 ++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/hooks/ralph-loop/command-arguments.ts b/src/hooks/ralph-loop/command-arguments.ts index cd84115f..adfa3df3 100644 --- a/src/hooks/ralph-loop/command-arguments.ts +++ b/src/hooks/ralph-loop/command-arguments.ts @@ -11,7 +11,8 @@ const DEFAULT_PROMPT = "Complete the task as instructed" export function parseRalphLoopArguments(rawArguments: string): ParsedRalphLoopArguments { const taskMatch = rawArguments.match(/^["'](.+?)["']/) - const prompt = taskMatch?.[1] || rawArguments.split(/\s+--/)[0]?.trim() || DEFAULT_PROMPT + const promptCandidate = taskMatch?.[1] ?? (rawArguments.startsWith("--") ? "" : rawArguments.split(/\s+--/)[0]?.trim() ?? "") + const prompt = promptCandidate || DEFAULT_PROMPT const maxIterationMatch = rawArguments.match(/--max-iterations=(\d+)/i) const completionPromiseMatch = rawArguments.match(/--completion-promise=["']?([^"'\s]+)["']?/i) diff --git a/src/hooks/ralph-loop/continuation-prompt-injector.ts b/src/hooks/ralph-loop/continuation-prompt-injector.ts index 46574be8..58f31953 100644 --- a/src/hooks/ralph-loop/continuation-prompt-injector.ts +++ b/src/hooks/ralph-loop/continuation-prompt-injector.ts @@ -67,7 +67,7 @@ export async function injectContinuationPrompt( tools = currentMessage?.tools } - const inheritedTools = resolveInheritedPromptTools(options.sessionID, tools) + const inheritedTools = resolveInheritedPromptTools(sourceSessionID, tools) await ctx.client.session.promptAsync({ path: { id: options.sessionID }, diff --git a/src/hooks/ralph-loop/session-reset-strategy.ts b/src/hooks/ralph-loop/session-reset-strategy.ts index b4d80859..a352560b 100644 --- a/src/hooks/ralph-loop/session-reset-strategy.ts +++ b/src/hooks/ralph-loop/session-reset-strategy.ts @@ -68,5 +68,5 @@ function getSelectSessionApi(client: unknown): SelectSessionApi | null { return null } - return selectSessionValue as SelectSessionApi + return (selectSessionValue as Function).bind(tuiValue) as SelectSessionApi } diff --git a/src/plugin-handlers/config-handler.test.ts b/src/plugin-handlers/config-handler.test.ts index 03b0dc20..a3a81f92 100644 --- a/src/plugin-handlers/config-handler.test.ts +++ b/src/plugin-handlers/config-handler.test.ts @@ -1281,7 +1281,7 @@ describe("disable_omo_env pass-through", () => { //#given ;(agents.createBuiltinAgents as any)?.mockRestore?.() ;(shared.fetchAvailableModels as any).mockResolvedValue( - new Set(["quotio/claude-opus-4-6-thinking", "quotio/gemini-3-flash"]) + new Set(["anthropic/claude-opus-4-6", "google/gemini-3-flash"]) ) const pluginConfig: OhMyOpenCodeConfig = { @@ -1314,7 +1314,7 @@ describe("disable_omo_env pass-through", () => { //#given ;(agents.createBuiltinAgents as any)?.mockRestore?.() ;(shared.fetchAvailableModels as any).mockResolvedValue( - new Set(["quotio/claude-opus-4-6-thinking", "quotio/gemini-3-flash"]) + new Set(["anthropic/claude-opus-4-6", "google/gemini-3-flash"]) ) const pluginConfig: OhMyOpenCodeConfig = {}