aboutsummaryrefslogtreecommitdiff
path: root/src/client/shell/agent_sidebar.rs
diff options
context:
space:
mode:
authorakbash <akbash@herdr.dev>2026-09-14 01:11:07 +0300
committerGitHub <noreply@github.com>2026-09-14 02:11:07 +0400
commit3b478e69dcbe8e416ddd46f0e24156392d4e71da (patch)
treee4ae8adfc09dce6eb09bd036fb727cc7f19edff7 /src/client/shell/agent_sidebar.rs
parent4e1096b1018496a23fb9de7f9ae737d3792bb38b (diff)
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 <jonathan.liebig@gmail.com>
Diffstat (limited to 'src/client/shell/agent_sidebar.rs')
-rw-r--r--src/client/shell/agent_sidebar.rs141
1 files changed, 74 insertions, 67 deletions
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<AgentRow> {
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::<HashMap<_, _>>();
- let tokens = agent.tokens.iter().cloned().collect::<HashMap<_, _>>();
- 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<AgentRow> {
+ 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::<HashMap<_, _>>();
+ let tokens = agent.tokens.iter().cloned().collect::<HashMap<_, _>>();
+ 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,