fix(ralph-loop): gate continuation prompts
This commit is contained in:
@@ -10,6 +10,7 @@ import {
|
|||||||
resolveInheritedPromptTools,
|
resolveInheritedPromptTools,
|
||||||
} from "../../shared"
|
} from "../../shared"
|
||||||
import { normalizeAgentForPromptKey } from "../../shared/agent-display-names"
|
import { normalizeAgentForPromptKey } from "../../shared/agent-display-names"
|
||||||
|
import { promptAsyncAfterSessionIdle } from "../shared/prompt-async-gate"
|
||||||
|
|
||||||
type MessageInfo = {
|
type MessageInfo = {
|
||||||
agent?: string
|
agent?: string
|
||||||
@@ -66,6 +67,7 @@ export async function injectContinuationPrompt(
|
|||||||
directory: string
|
directory: string
|
||||||
apiTimeoutMs: number
|
apiTimeoutMs: number
|
||||||
inheritFromSessionID?: string
|
inheritFromSessionID?: string
|
||||||
|
idleSettleMs?: number
|
||||||
},
|
},
|
||||||
): Promise<ContinuationPromptResult> {
|
): Promise<ContinuationPromptResult> {
|
||||||
let agent: string | undefined
|
let agent: string | undefined
|
||||||
@@ -119,17 +121,33 @@ export async function injectContinuationPrompt(
|
|||||||
|
|
||||||
let response: unknown
|
let response: unknown
|
||||||
try {
|
try {
|
||||||
response = await ctx.client.session.promptAsync({
|
const promptResult = await promptAsyncAfterSessionIdle({
|
||||||
path: { id: options.sessionID },
|
client: ctx.client,
|
||||||
body: {
|
sessionID: options.sessionID,
|
||||||
...(cleanAgent !== undefined ? { agent: cleanAgent } : {}),
|
source: "ralph-loop",
|
||||||
...(launchModel ? { model: launchModel } : {}),
|
settleMs: options.idleSettleMs,
|
||||||
...(launchVariant ? { variant: launchVariant } : {}),
|
input: {
|
||||||
...(inheritedTools ? { tools: inheritedTools } : {}),
|
path: { id: options.sessionID },
|
||||||
parts: [createInternalAgentContinuationTextPart(options.prompt)],
|
body: {
|
||||||
|
...(cleanAgent !== undefined ? { agent: cleanAgent } : {}),
|
||||||
|
...(launchModel ? { model: launchModel } : {}),
|
||||||
|
...(launchVariant ? { variant: launchVariant } : {}),
|
||||||
|
...(inheritedTools ? { tools: inheritedTools } : {}),
|
||||||
|
parts: [createInternalAgentContinuationTextPart(options.prompt)],
|
||||||
|
},
|
||||||
|
query: { directory: options.directory },
|
||||||
},
|
},
|
||||||
query: { directory: options.directory },
|
|
||||||
})
|
})
|
||||||
|
if (promptResult.status === "failed") {
|
||||||
|
throw promptResult.error
|
||||||
|
}
|
||||||
|
if (promptResult.status !== "dispatched") {
|
||||||
|
return {
|
||||||
|
status: "rejected",
|
||||||
|
error: createPromptAsyncError(`promptAsync skipped: ${promptResult.status}`, promptResult),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
response = promptResult.response
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
const promptError = error instanceof Error
|
const promptError = error instanceof Error
|
||||||
? error
|
? error
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import { createIterationSession, selectSessionInTui } from "./session-reset-stra
|
|||||||
type ContinuationOptions = {
|
type ContinuationOptions = {
|
||||||
directory: string
|
directory: string
|
||||||
apiTimeoutMs: number
|
apiTimeoutMs: number
|
||||||
|
idleSettleMs: number
|
||||||
previousSessionID: string
|
previousSessionID: string
|
||||||
loopState: {
|
loopState: {
|
||||||
setSessionID: (sessionID: string) => RalphLoopState | null
|
setSessionID: (sessionID: string) => RalphLoopState | null
|
||||||
@@ -45,6 +46,7 @@ export async function continueIteration(
|
|||||||
prompt: continuationPrompt,
|
prompt: continuationPrompt,
|
||||||
directory: options.directory,
|
directory: options.directory,
|
||||||
apiTimeoutMs: options.apiTimeoutMs,
|
apiTimeoutMs: options.apiTimeoutMs,
|
||||||
|
idleSettleMs: options.idleSettleMs,
|
||||||
})
|
})
|
||||||
if (promptResult.status === "rejected") {
|
if (promptResult.status === "rejected") {
|
||||||
return { status: "dispatch_rejected", error: promptResult.error }
|
return { status: "dispatch_rejected", error: promptResult.error }
|
||||||
@@ -73,6 +75,7 @@ export async function continueIteration(
|
|||||||
prompt: continuationPrompt,
|
prompt: continuationPrompt,
|
||||||
directory: options.directory,
|
directory: options.directory,
|
||||||
apiTimeoutMs: options.apiTimeoutMs,
|
apiTimeoutMs: options.apiTimeoutMs,
|
||||||
|
idleSettleMs: options.idleSettleMs,
|
||||||
})
|
})
|
||||||
if (promptResult.status === "rejected") {
|
if (promptResult.status === "rejected") {
|
||||||
return { status: "dispatch_rejected", error: promptResult.error }
|
return { status: "dispatch_rejected", error: promptResult.error }
|
||||||
|
|||||||
@@ -358,6 +358,7 @@ export function createRalphLoopEventHandler(
|
|||||||
previousSessionID: sessionID,
|
previousSessionID: sessionID,
|
||||||
directory: options.directory,
|
directory: options.directory,
|
||||||
apiTimeoutMs: options.apiTimeoutMs,
|
apiTimeoutMs: options.apiTimeoutMs,
|
||||||
|
idleSettleMs: options.idleSettleMs,
|
||||||
loopState: options.loopState,
|
loopState: options.loopState,
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -523,6 +524,7 @@ export function createRalphLoopEventHandler(
|
|||||||
previousSessionID: sessionID,
|
previousSessionID: sessionID,
|
||||||
directory: options.directory,
|
directory: options.directory,
|
||||||
apiTimeoutMs: options.apiTimeoutMs,
|
apiTimeoutMs: options.apiTimeoutMs,
|
||||||
|
idleSettleMs: options.idleSettleMs,
|
||||||
loopState: options.loopState,
|
loopState: options.loopState,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user