aboutsummaryrefslogtreecommitdiff
path: root/src/pane
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-05-11 23:31:36 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-05-11 23:34:20 +0300
commitfe693f613a23452e68589a4337863f217cc57930 (patch)
tree8d60f6c5b0d8b31426c6623cc8b0c2415d481000 /src/pane
parent84c0d003ddb19a8e95e7ad5206771a663913605b (diff)
feat: add optional pane border labels
Diffstat (limited to 'src/pane')
-rw-r--r--src/pane/state.rs39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/pane/state.rs b/src/pane/state.rs
index 8b36826b..f9b7a149 100644
--- a/src/pane/state.rs
+++ b/src/pane/state.rs
@@ -28,6 +28,7 @@ pub struct PaneState {
pub detected_agent: Option<Agent>,
pub fallback_state: AgentState,
pub hook_authority: Option<HookAuthority>,
+ pub manual_label: Option<String>,
hook_report_sequences: HashMap<String, u64>,
pub state: AgentState,
/// Whether the user has seen this pane since its last state change to Idle.
@@ -41,6 +42,7 @@ impl PaneState {
detected_agent: None,
fallback_state: AgentState::Unknown,
hook_authority: None,
+ manual_label: None,
hook_report_sequences: HashMap::new(),
state: AgentState::Unknown,
seen: true,
@@ -184,6 +186,23 @@ impl PaneState {
self.detected_agent
}
+ pub fn set_manual_label(&mut self, label: String) {
+ let label = label.trim().to_string();
+ self.manual_label = (!label.is_empty()).then_some(label);
+ }
+
+ pub fn clear_manual_label(&mut self) {
+ self.manual_label = None;
+ }
+
+ pub fn border_label(&self, show_agent_labels: bool) -> Option<&str> {
+ self.manual_label.as_deref().or_else(|| {
+ show_agent_labels
+ .then(|| self.effective_agent_label())
+ .flatten()
+ })
+ }
+
fn recompute_effective_state(
&mut self,
previous_agent_label: Option<String>,
@@ -339,6 +358,26 @@ mod tests {
}
#[test]
+ fn border_label_prefers_manual_label_over_agent_label() {
+ let mut pane = PaneState::new();
+ pane.set_detected_state(Some(Agent::Claude), AgentState::Idle);
+
+ assert_eq!(pane.border_label(false), None);
+ assert_eq!(pane.border_label(true), Some("claude"));
+
+ pane.set_manual_label(" reviewer ".into());
+ assert_eq!(pane.border_label(false), Some("reviewer"));
+ assert_eq!(pane.border_label(true), Some("reviewer"));
+
+ pane.set_manual_label(" ".into());
+ assert_eq!(pane.border_label(true), Some("claude"));
+
+ pane.set_manual_label("reviewer".into());
+ pane.clear_manual_label();
+ assert_eq!(pane.border_label(true), Some("claude"));
+ }
+
+ #[test]
fn hook_authority_survives_unrelated_detected_agent_clear() {
let mut pane = PaneState::new();
pane.set_detected_state(Some(Agent::Pi), AgentState::Idle);