aboutsummaryrefslogtreecommitdiff
path: root/crates/dinggerd/src/watcher.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/dinggerd/src/watcher.rs')
-rw-r--r--crates/dinggerd/src/watcher.rs16
1 files changed, 12 insertions, 4 deletions
diff --git a/crates/dinggerd/src/watcher.rs b/crates/dinggerd/src/watcher.rs
index 045fb64..f1cb90e 100644
--- a/crates/dinggerd/src/watcher.rs
+++ b/crates/dinggerd/src/watcher.rs
@@ -232,14 +232,22 @@ impl Watcher {
}
if transition {
debug!(target = %pane.display_target, ?prev_state, ?new_state, seen, "state change");
- let display = display_status(&self.tracks[&pane.pane_id]);
- if let Err(err) = tmux::set_agent_state(&pane.pane_id, display.label()) {
- warn!(target = %pane.display_target, %err, "failed to write @agent_state");
- }
let _ = tmux::clear_ack(&pane.pane_id);
} else if seen != prev_seen {
let _ = tmux::ack(&pane.pane_id);
}
+ let display = display_status(
+ self.tracks
+ .get(&pane.pane_id)
+ .unwrap_or(&PaneTrack { state: new_state, seen, ready_since: None }),
+ );
+ // @agent_state mirrors the display status on both transitions and
+ // attendance changes (done → idle when the user focuses the pane).
+ if pane.written_state != display.label() {
+ if let Err(err) = tmux::set_agent_state(&pane.pane_id, display.label()) {
+ warn!(target = %pane.display_target, %err, "failed to write @agent_state");
+ }
+ }
if new_state == AgentState::Unknown {
// The agent is gone; its last hook report must not outlive it.
hooks::drop_report(&pane.pane_id);