aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-04-03 00:48:31 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-04-03 00:48:31 +0300
commit94809b2022f78216309036650e3d73841c2ee022 (patch)
tree34e6acb533a67639ef437b5c477659429b55ebb2 /src
parent33ccc1656c90f4beb20147ee524fa43fcba34fc8 (diff)
fix: improve tab-aware agent labels
Diffstat (limited to 'src')
-rw-r--r--src/app/actions.rs39
-rw-r--r--src/workspace.rs6
2 files changed, 38 insertions, 7 deletions
diff --git a/src/app/actions.rs b/src/app/actions.rs
index 84d5e592..7d9e27fd 100644
--- a/src/app/actions.rs
+++ b/src/app/actions.rs
@@ -60,6 +60,17 @@ fn agent_label(agent: Agent) -> &'static str {
}
}
+fn notification_context(ws: &crate::workspace::Workspace, ws_idx: usize, pane_id: PaneId) -> String {
+ let mut context = format!("{} · {}", ws.display_name(), ws_idx + 1);
+ if ws.tabs.len() > 1 {
+ if let Some(tab_idx) = ws.find_tab_index_for_pane(pane_id) {
+ let tab = &ws.tabs[tab_idx];
+ context.push_str(&format!(" · {}", tab.display_name()));
+ }
+ }
+ context
+}
+
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct PaneStateUpdate {
pub pane_id: PaneId,
@@ -345,7 +356,6 @@ impl AppState {
.workspaces
.iter()
.position(|ws| ws.pane_state(pane_id).is_some())?;
- let workspace_name = self.workspaces[ws_idx].display_name();
let change = {
let pane = self.workspaces[ws_idx]
.tabs
@@ -353,7 +363,7 @@ impl AppState {
.find_map(|tab| tab.panes.get_mut(&pane_id))?;
update(pane)?
};
- self.apply_pane_state_change(ws_idx, pane_id, &workspace_name, change);
+ self.apply_pane_state_change(ws_idx, pane_id, change);
Some(PaneStateUpdate {
pane_id,
ws_idx,
@@ -368,7 +378,6 @@ impl AppState {
&mut self,
ws_idx: usize,
pane_id: PaneId,
- workspace_name: &str,
change: EffectiveStateChange,
) {
let is_active_ws = self.active == Some(ws_idx);
@@ -411,10 +420,11 @@ impl AppState {
ToastKind::Finished => "finished",
ToastKind::UpdateInstalled => "updated",
};
+ let context = notification_context(&self.workspaces[ws_idx], ws_idx, pane_id);
self.toast = Some(ToastNotification {
kind,
title: format!("{} {}", agent_label(agent), event_text),
- context: format!("{} · {}", workspace_name, ws_idx + 1),
+ context,
});
}
}
@@ -694,6 +704,27 @@ mod tests {
}
#[test]
+ fn background_toast_includes_tab_name_when_workspace_has_multiple_tabs() {
+ let mut state = app_with_workspaces(&["active", "background"]);
+ state.active = Some(0);
+ state.toast_config.enabled = true;
+ state.workspaces[1].tabs[0].set_custom_name("main".into());
+ let second_tab = state.workspaces[1].test_add_tab(Some("logs"));
+ let bg_pane_id = state.workspaces[1].tabs[second_tab].root_pane;
+
+ state.handle_app_event(AppEvent::StateChanged {
+ pane_id: bg_pane_id,
+ agent: Some(Agent::Pi),
+ state: AgentState::Blocked,
+ });
+
+ let toast = state.toast.as_ref().unwrap();
+ assert_eq!(toast.kind, ToastKind::NeedsAttention);
+ assert_eq!(toast.title, "pi needs attention");
+ assert_eq!(toast.context, "background · 2 · logs");
+ }
+
+ #[test]
fn active_workspace_does_not_set_toast() {
let mut state = app_with_workspaces(&["active"]);
state.active = Some(0);
diff --git a/src/workspace.rs b/src/workspace.rs
index 2de109d9..81e1f2f2 100644
--- a/src/workspace.rs
+++ b/src/workspace.rs
@@ -452,7 +452,7 @@ impl Workspace {
.flat_map(Tab::pane_details)
.map(|mut detail| {
if multi_tab {
- detail.label = format!("{} / {}", detail.tab_label, detail.agent_label);
+ detail.label = format!("{}·{}", detail.tab_label, detail.agent_label);
}
detail
})
@@ -796,7 +796,7 @@ mod tests {
let details = ws.pane_details();
assert_eq!(details.len(), 2);
- assert!(details.iter().any(|detail| detail.label == "main / pi"));
- assert!(details.iter().any(|detail| detail.label == "logs / claude"));
+ assert!(details.iter().any(|detail| detail.label == "main·pi"));
+ assert!(details.iter().any(|detail| detail.label == "logs·claude"));
}
}