use std::io::Write as _;
pub fn set_terminal_title(title: &str) {
if !crossterm::tty::IsTty::is_tty(&std::io::stdout()) {
return;
}
let safe: String = title.chars().filter(|c| !c.is_control()).collect();
let _ = write!(std::io::stdout(), "\x1b]2;{safe}\x07");
let _ = std::io::stdout().flush();
}
pub fn set_action_required(agent_name: &str) {
set_terminal_title(&format!("[action required] {agent_name}"));
}
pub fn clear_action_required(agent_name: &str) {
set_terminal_title(agent_name);
}
#[cfg(test)]
mod tests {
#[test]
fn strips_control_chars() {
let title = "foo\x1b[31mbar\x07baz";
let safe: String = title.chars().filter(|c| !c.is_control()).collect();
assert!(!safe.contains('\x1b'));
assert!(!safe.contains('\x07'));
assert!(safe.contains("foo"));
assert!(safe.contains("bar"));
assert!(safe.contains("baz"));
}
#[test]
fn normal_title_unchanged() {
let title = "zeph - agent ready";
let safe: String = title.chars().filter(|c| !c.is_control()).collect();
assert_eq!(safe, title);
}
}