use super::{App, DefaultTerminal, InteractiveRuntime, PromptTurnRequest, TurnOutcome, TurnPrompt};
use crate::tui::send_confirm::{SendAuthorization, SendPayload, SendSubmission};
impl App {
pub(super) async fn run_prompt_turn_request(
&mut self,
request: PromptTurnRequest,
authorization: SendAuthorization,
terminal: &mut DefaultTerminal,
agent: &mut InteractiveRuntime,
) -> anyhow::Result<TurnOutcome> {
let mut outcome = self
.run_single_prompt_turn_request(request, authorization, terminal, agent)
.await?;
while matches!(outcome, TurnOutcome::Completed)
&& !self.should_quit
&& !self.input_ui.composer().blocks_auto_continue()
{
let Some(prompt) = self.pending.pop_follow_up() else {
break;
};
self.pending_input_changed();
self.select_pending_recall_target();
let submission = SendSubmission::turn(
TurnPrompt::standard(prompt.prompt, prompt.display_prompt),
prompt.media,
prompt.paste_segments,
);
let Some(submission) = self.gate_send(submission, agent) else {
return Ok(outcome);
};
let (payload, authorization, _allow_auto_compact) = submission.into_authorized();
let SendPayload::Turn { turn, media, .. } = payload else {
unreachable!("queued prompts are turn submissions");
};
outcome = self
.run_single_prompt_turn_request(
PromptTurnRequest::New {
prompt: turn,
media,
},
authorization,
terminal,
agent,
)
.await?;
}
if matches!(outcome, TurnOutcome::Completed)
&& !self.should_quit
&& !self.pending.queued_prompts().is_empty()
&& self.start_follow_ups.is_none()
{
self.start_follow_ups = Some(crate::tui::compact_work::ReadyFollowUp::Queued {
allow_auto_compact: true,
});
}
Ok(outcome)
}
}