From 3b478e69dcbe8e416ddd46f0e24156392d4e71da Mon Sep 17 00:00:00 2001 From: akbash Date: Mon, 14 Sep 2026 01:11:07 +0300 Subject: fix: scope agent views to the selected machine (#3784) * fix: scope agent views to the selected machine refs #3732 * fix: preserve stable agent view ordering refs #3732 --------- Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> Co-authored-by: JJ Liebig --- src/client/shell/agent_sidebar.rs | 141 ++++++++++++++++++++------------------ 1 file changed, 74 insertions(+), 67 deletions(-) (limited to 'src/client/shell/agent_sidebar.rs') diff --git a/src/client/shell/agent_sidebar.rs b/src/client/shell/agent_sidebar.rs index e7ebabf3..e43ab8cc 100644 --- a/src/client/shell/agent_sidebar.rs +++ b/src/client/shell/agent_sidebar.rs @@ -241,76 +241,83 @@ pub(super) fn agent_rows( ) -> Vec { ordered_agent_pane_ids(snapshot, config.agent_panel_sort) .into_iter() - .filter_map(|pane_id| { - let agent = snapshot - .agents - .iter() - .find(|agent| agent.pane_id == pane_id)?; - let workspace = snapshot - .workspaces - .iter() - .find(|workspace| workspace.workspace_id == agent.workspace_id)?; - let tab = snapshot.tabs.iter().find(|tab| tab.tab_id == agent.tab_id); - let pane = snapshot - .panes - .iter() - .find(|pane| pane.pane_id == agent.pane_id); - let tab_count = snapshot - .tabs - .iter() - .filter(|candidate| candidate.workspace_id == agent.workspace_id) - .count(); - let tab_label = tab - .filter(|tab| tab_count > 1 || tab.custom_label) - .map(|tab| tab.label.as_str()); - let agent_label = agent - .display_agent - .as_deref() - .or(agent.name.as_deref()) - .or(agent.agent.as_deref()) - .or(agent.title.as_deref()); - let labels = agent - .state_labels - .iter() - .cloned() - .collect::>(); - let tokens = agent.tokens.iter().cloned().collect::>(); - let state_text = labels - .get(status_text(agent.agent_status)) - .map(String::as_str) - .unwrap_or_else(|| sidebar_status_text(agent.agent_status)); - let canonical_agent = agent - .agent - .as_deref() - .and_then(crate::detect::parse_agent_label); - let rows = crate::ui::sidebar_agent_rows( - &config.agents, - crate::ui::AgentTokenContext { - machine, - workspace: &workspace.label, - tab: tab_label, - pane: agent - .title - .as_deref() - .or_else(|| pane.and_then(|pane| pane.label.as_deref())), - agent_label, - terminal_title: agent.terminal_title.as_deref(), - terminal_title_stripped: agent.terminal_title_stripped.as_deref(), - canonical_agent, - tokens: &tokens, - }, - state_text, - ); - Some(AgentRow { - pane_id: agent.pane_id.clone(), - status: agent.agent_status, - focused: agent.focused, - rows, - }) - }) + .filter_map(|pane_id| agent_row(snapshot, &pane_id, config, machine)) .collect() } +pub(super) fn agent_row( + snapshot: &ClientShellSnapshot, + pane_id: &str, + config: &ClientShellConfig, + machine: Option<&str>, +) -> Option { + let agent = snapshot + .agents + .iter() + .find(|agent| agent.pane_id == pane_id)?; + let workspace = snapshot + .workspaces + .iter() + .find(|workspace| workspace.workspace_id == agent.workspace_id)?; + let tab = snapshot.tabs.iter().find(|tab| tab.tab_id == agent.tab_id); + let pane = snapshot + .panes + .iter() + .find(|pane| pane.pane_id == agent.pane_id); + let tab_count = snapshot + .tabs + .iter() + .filter(|candidate| candidate.workspace_id == agent.workspace_id) + .count(); + let tab_label = tab + .filter(|tab| tab_count > 1 || tab.custom_label) + .map(|tab| tab.label.as_str()); + let agent_label = agent + .display_agent + .as_deref() + .or(agent.name.as_deref()) + .or(agent.agent.as_deref()) + .or(agent.title.as_deref()); + let labels = agent + .state_labels + .iter() + .cloned() + .collect::>(); + let tokens = agent.tokens.iter().cloned().collect::>(); + let state_text = labels + .get(status_text(agent.agent_status)) + .map(String::as_str) + .unwrap_or_else(|| sidebar_status_text(agent.agent_status)); + let canonical_agent = agent + .agent + .as_deref() + .and_then(crate::detect::parse_agent_label); + let rows = crate::ui::sidebar_agent_rows( + &config.agents, + crate::ui::AgentTokenContext { + machine, + workspace: &workspace.label, + tab: tab_label, + pane: agent + .title + .as_deref() + .or_else(|| pane.and_then(|pane| pane.label.as_deref())), + agent_label, + terminal_title: agent.terminal_title.as_deref(), + terminal_title_stripped: agent.terminal_title_stripped.as_deref(), + canonical_agent, + tokens: &tokens, + }, + state_text, + ); + Some(AgentRow { + pane_id: agent.pane_id.clone(), + status: agent.agent_status, + focused: agent.focused, + rows, + }) +} + pub(super) fn render_agent_row( buffer: &mut Buffer, rect: Rect, -- cgit v1.2.3