use crossterm::style::Color;
use crate::agent::agent_loop::message::EscalationReason;
use crate::agent::agent_loop::tool_input_repair::RepairStatsSnapshot;
use crate::ui::renderer::Renderer;
use crate::ui::text_output::{
strip_leading_system_reminder, write_critic_lines, write_system_lines, write_user_lines,
};
use crate::ui::theme;
pub(crate) fn handle_user_message(renderer: &mut Renderer, content: &str) -> std::io::Result<()> {
let visible = strip_leading_system_reminder(content);
if let Some(body) = crate::ui::events::finalization_nudge_body(visible) {
write_critic_lines(renderer, body)?;
return renderer.write_line("", Color::White);
}
write_user_lines(renderer, visible)?;
renderer.write_line("", Color::White)
}
pub(crate) fn handle_system_notice(renderer: &mut Renderer, content: &str) -> std::io::Result<()> {
write_system_lines(renderer, content)?;
renderer.write_line("", Color::White)
}
pub(crate) fn handle_retry_notice(
renderer: &mut Renderer,
attempt: u32,
delay_ms: u64,
) -> std::io::Result<()> {
renderer.write_line(
&format!(" ⟳ retry {attempt} ({delay_ms}ms)…"),
theme::dim(),
)
}
pub(crate) fn handle_escalation_activated(
renderer: &mut Renderer,
provider: &str,
reason: &EscalationReason,
) -> std::io::Result<()> {
let summary = reason.summary();
renderer.write_line(
&format!(" ↑ escalating to {provider} (next turn): {summary}"),
theme::dim(),
)
}
pub(crate) fn handle_repair_stats(
renderer: &mut Renderer,
snapshot: &RepairStatsSnapshot,
) -> std::io::Result<()> {
let mut parts: Vec<String> = Vec::new();
if snapshot.md_link_unwrapped > 0 {
parts.push(format!("{} md-link", snapshot.md_link_unwrapped));
}
if snapshot.null_stripped > 0 {
parts.push(format!("{} null-strip", snapshot.null_stripped));
}
if snapshot.json_string_to_array > 0 {
parts.push(format!("{} json-array", snapshot.json_string_to_array));
}
if snapshot.object_to_array > 0 {
parts.push(format!("{} obj-to-array", snapshot.object_to_array));
}
if snapshot.bare_string_to_array > 0 {
parts.push(format!("{} bare-to-array", snapshot.bare_string_to_array));
}
let total = snapshot.total_successful();
let mut line = format!(" ⊕ repaired {total} input(s): {}", parts.join(", "));
if snapshot.invalid > 0 {
line.push_str(&format!("; {} invalid", snapshot.invalid));
}
renderer.write_line(&line, theme::dim())
}