use anyhow::Result;
use clap::ValueEnum;
use tracing::warn;
use crate::config::Config;
use crate::multiplexer::{AgentStatus, create_backend, detect_backend};
#[derive(ValueEnum, Debug, Clone)]
pub enum SetWindowStatusCommand {
Working,
Waiting,
Done,
Clear,
}
pub fn run(cmd: SetWindowStatusCommand) -> Result<()> {
if crate::sandbox::guest::is_sandbox_guest() {
return run_via_rpc(cmd);
}
let config = Config::load(None)?;
let mux = create_backend(detect_backend());
let Some(pane_id) = mux.current_pane_id() else {
return Ok(());
};
match cmd {
SetWindowStatusCommand::Clear => {
mux.clear_status(&pane_id)?;
}
SetWindowStatusCommand::Working
| SetWindowStatusCommand::Waiting
| SetWindowStatusCommand::Done => {
let (status, icon, auto_clear) = match cmd {
SetWindowStatusCommand::Working => {
(AgentStatus::Working, config.status_icons.working(), false)
}
SetWindowStatusCommand::Waiting => {
(AgentStatus::Waiting, config.status_icons.waiting(), true)
}
SetWindowStatusCommand::Done => {
(AgentStatus::Done, config.status_icons.done(), true)
}
SetWindowStatusCommand::Clear => unreachable!(),
};
if config.status_format.unwrap_or(true) {
let _ = mux.ensure_status_format(&pane_id);
}
mux.set_status(&pane_id, icon, auto_clear)?;
crate::state::persist_agent_update(&*mux, &pane_id, Some(status), None);
}
}
Ok(())
}
fn run_via_rpc(cmd: SetWindowStatusCommand) -> Result<()> {
use crate::sandbox::rpc::{RpcClient, RpcRequest, RpcResponse};
let status = match cmd {
SetWindowStatusCommand::Working => "working",
SetWindowStatusCommand::Waiting => "waiting",
SetWindowStatusCommand::Done => "done",
SetWindowStatusCommand::Clear => "clear",
};
let mut client = RpcClient::from_env()?;
let response = client.call(&RpcRequest::SetStatus {
status: status.to_string(),
})?;
match response {
RpcResponse::Ok => Ok(()),
RpcResponse::Error { message } => {
warn!(error = %message, "RPC SetStatus failed");
Ok(()) }
_ => Ok(()),
}
}