use super::{App, MessageBlock};
pub(super) fn update_terminal_outputs(app: &mut App) -> bool {
let _t = app.perf.as_ref().map(|p| p.start("terminal::update"));
let terminals = app.terminals.borrow();
if terminals.is_empty() {
return false;
}
let mut changed = false;
let mut dirty_from: Option<usize> = None;
for &(ref tid, mi, bi) in &app.terminal_tool_calls {
let Some(terminal) = terminals.get(tid.as_str()) else {
continue;
};
let Some(MessageBlock::ToolCall(tc)) =
app.messages.get_mut(mi).and_then(|m| m.blocks.get_mut(bi))
else {
continue;
};
let tc = tc.as_mut();
let raw = {
let Ok(buf) = terminal.output_buffer.lock() else {
continue;
};
let current_len = buf.len();
if current_len == 0 || current_len == tc.terminal_output_len {
continue;
}
tc.terminal_output_len = current_len;
buf.clone()
};
let snapshot = String::from_utf8_lossy(&raw).to_string();
tc.terminal_output = Some(snapshot);
tc.cache.invalidate();
dirty_from = Some(dirty_from.map_or(mi, |oldest| oldest.min(mi)));
changed = true;
}
drop(terminals);
if let Some(mi) = dirty_from {
app.mark_message_layout_dirty(mi);
}
changed
}