fix(ralph-loop): return typed ContinuationResult from continueIteration

Replace silent returns in continueIteration with a discriminated union\n(dispatched | session_creation_rejected | dispatch_rejected). Wraps\ninjectContinuationPrompt in try/catch so reset-strategy createIterationSession\nreturning null and promptAsync rejections both surface as typed failures\nthe caller can react to.
This commit is contained in:
YeonGyu-Kim
2026-05-11 12:45:59 +09:00
parent f0857a88fb
commit d4cdeaccbe
+32 -17
View File
@@ -15,11 +15,16 @@ type ContinuationOptions = {
} }
} }
export type ContinuationResult =
| { status: "dispatched" }
| { status: "session_creation_rejected" }
| { status: "dispatch_rejected"; error: unknown }
export async function continueIteration( export async function continueIteration(
ctx: PluginInput, ctx: PluginInput,
state: RalphLoopState, state: RalphLoopState,
options: ContinuationOptions, options: ContinuationOptions,
): Promise<void> { ): Promise<ContinuationResult> {
const strategy = state.strategy ?? "continue" const strategy = state.strategy ?? "continue"
const continuationPrompt = buildContinuationPrompt(state) const continuationPrompt = buildContinuationPrompt(state)
@@ -30,16 +35,20 @@ export async function continueIteration(
options.directory, options.directory,
) )
if (!newSessionID) { if (!newSessionID) {
return return { status: "session_creation_rejected" }
} }
await injectContinuationPrompt(ctx, { try {
sessionID: newSessionID, await injectContinuationPrompt(ctx, {
inheritFromSessionID: options.previousSessionID, sessionID: newSessionID,
prompt: continuationPrompt, inheritFromSessionID: options.previousSessionID,
directory: options.directory, prompt: continuationPrompt,
apiTimeoutMs: options.apiTimeoutMs, directory: options.directory,
}) apiTimeoutMs: options.apiTimeoutMs,
})
} catch (error: unknown) {
return { status: "dispatch_rejected", error }
}
await selectSessionInTui(ctx.client, newSessionID) await selectSessionInTui(ctx.client, newSessionID)
@@ -49,16 +58,22 @@ export async function continueIteration(
previousSessionID: options.previousSessionID, previousSessionID: options.previousSessionID,
newSessionID, newSessionID,
}) })
return return { status: "dispatched" }
} }
return return { status: "dispatched" }
} }
await injectContinuationPrompt(ctx, { try {
sessionID: options.previousSessionID, await injectContinuationPrompt(ctx, {
prompt: continuationPrompt, sessionID: options.previousSessionID,
directory: options.directory, prompt: continuationPrompt,
apiTimeoutMs: options.apiTimeoutMs, directory: options.directory,
}) apiTimeoutMs: options.apiTimeoutMs,
})
} catch (error: unknown) {
return { status: "dispatch_rejected", error }
}
return { status: "dispatched" }
} }