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(
ctx: PluginInput,
state: RalphLoopState,
options: ContinuationOptions,
): Promise<void> {
): Promise<ContinuationResult> {
const strategy = state.strategy ?? "continue"
const continuationPrompt = buildContinuationPrompt(state)
@@ -30,16 +35,20 @@ export async function continueIteration(
options.directory,
)
if (!newSessionID) {
return
return { status: "session_creation_rejected" }
}
await injectContinuationPrompt(ctx, {
sessionID: newSessionID,
inheritFromSessionID: options.previousSessionID,
prompt: continuationPrompt,
directory: options.directory,
apiTimeoutMs: options.apiTimeoutMs,
})
try {
await injectContinuationPrompt(ctx, {
sessionID: newSessionID,
inheritFromSessionID: options.previousSessionID,
prompt: continuationPrompt,
directory: options.directory,
apiTimeoutMs: options.apiTimeoutMs,
})
} catch (error: unknown) {
return { status: "dispatch_rejected", error }
}
await selectSessionInTui(ctx.client, newSessionID)
@@ -49,16 +58,22 @@ export async function continueIteration(
previousSessionID: options.previousSessionID,
newSessionID,
})
return
return { status: "dispatched" }
}
return
return { status: "dispatched" }
}
await injectContinuationPrompt(ctx, {
sessionID: options.previousSessionID,
prompt: continuationPrompt,
directory: options.directory,
apiTimeoutMs: options.apiTimeoutMs,
})
try {
await injectContinuationPrompt(ctx, {
sessionID: options.previousSessionID,
prompt: continuationPrompt,
directory: options.directory,
apiTimeoutMs: options.apiTimeoutMs,
})
} catch (error: unknown) {
return { status: "dispatch_rejected", error }
}
return { status: "dispatched" }
}