aboutsummaryrefslogtreecommitdiff
path: root/src/workspace/aggregate.rs
diff options
context:
space:
mode:
authorCan Celik <ogulcancelik@gmail.com>2026-09-01 15:48:22 +0300
committerGitHub <noreply@github.com>2026-09-01 15:48:22 +0300
commit207be3c771d281baae6e5fa0fb74be9a056e97a2 (patch)
treed7b037ecdf629224a048c841d11659efdc23507d /src/workspace/aggregate.rs
parent8a6d697308162874a236c84aac0b0f8c7ac01f83 (diff)
refactor: render the shell in the client (#3487)
* feat: add opt-in client-rendered shell * feat: add client-owned shell mouse controls * feat: complete client-owned shell chrome * feat: add client-owned shell settings and notifications * feat: run client shell custom commands * feat: render popup terminals in client shell * feat: add client-owned scrollback and copy mode * fix: preserve client worktree trust defaults * feat: render startup diagnostics in client shell * feat: render onboarding in client shell * feat: render product announcements in client shell * feat: render release notes in client shell * feat: render mobile switcher in client shell * feat: render kitty graphics in client shell * fix: preserve client shell lifecycle coherence * refactor: route client shell commands through endpoint connections * refactor: make the client-rendered shell the default * refactor: remove monolithic launch mode * refactor: complete client-rendered shell cutover * perf: retain client pane surface updates * perf: scale retained pane surface updates * perf: remove remote pane input latency * test: make client shell checks platform-independent * fix: prevent client timer starvation * test: fix client shell platform gates * test: accept retained surfaces in cross-area checks * test: make client mode assertions platform-neutral * fix: badge only outdated integrations
Diffstat (limited to 'src/workspace/aggregate.rs')
-rw-r--r--src/workspace/aggregate.rs111
1 files changed, 5 insertions, 106 deletions
diff --git a/src/workspace/aggregate.rs b/src/workspace/aggregate.rs
index 29621d4d..3fd45fca 100644
--- a/src/workspace/aggregate.rs
+++ b/src/workspace/aggregate.rs
@@ -1,6 +1,6 @@
use std::collections::HashMap;
-use crate::detect::{Agent, AgentState};
+use crate::detect::AgentState;
use crate::layout::PaneId;
use crate::terminal::{TerminalId, TerminalState};
@@ -10,18 +10,10 @@ use super::{Tab, Workspace};
pub struct PaneDetail {
pub pane_id: PaneId,
pub tab_idx: usize,
- pub tab_label: String,
- pub label: String,
- pub pane_label: Option<String>,
- pub terminal_title: Option<String>,
- pub terminal_title_stripped: Option<String>,
- pub agent_label: String,
pub agent_kind_label: Option<String>,
- pub agent: Option<Agent>,
pub state: AgentState,
pub seen: bool,
pub last_agent_state_change_seq: Option<u64>,
- pub state_labels: HashMap<String, String>,
pub tokens: HashMap<String, String>,
}
@@ -30,7 +22,6 @@ impl Tab {
&self,
terminals: &HashMap<TerminalId, TerminalState>,
tab_idx: usize,
- tab_label: &str,
) -> Vec<PaneDetail> {
self.layout
.pane_ids()
@@ -39,32 +30,16 @@ impl Tab {
let pane = self.panes.get(id)?;
let terminal = terminals.get(&pane.attached_terminal_id)?;
let agent_kind_label = terminal.effective_agent_label().map(str::to_string);
- let fallback_agent_label = terminal
- .agent_name
- .as_deref()
- .or(agent_kind_label.as_deref())?
- .to_string();
- let agent_label = terminal
- .effective_display_agent()
- .unwrap_or_else(|| fallback_agent_label.clone());
- let presentation = terminal.effective_presentation();
+ if terminal.agent_name.is_none() && agent_kind_label.is_none() {
+ return None;
+ }
Some(PaneDetail {
pane_id: *id,
tab_idx,
- tab_label: tab_label.to_string(),
- label: agent_label.clone(),
- pane_label: terminal
- .effective_title()
- .or_else(|| terminal.manual_label.clone()),
- terminal_title: terminal.terminal_title.clone(),
- terminal_title_stripped: terminal.terminal_title_stripped(),
- agent_label,
agent_kind_label,
- agent: terminal.effective_known_agent(),
state: terminal.state,
seen: pane.seen,
last_agent_state_change_seq: terminal.last_agent_state_change_seq,
- state_labels: presentation.state_labels,
tokens: terminal.metadata_tokens.values(),
})
})
@@ -100,22 +75,10 @@ impl Workspace {
}
pub fn pane_details(&self, terminals: &HashMap<TerminalId, TerminalState>) -> Vec<PaneDetail> {
- let multi_tab = self.tabs.len() > 1;
self.tabs
.iter()
.enumerate()
- .flat_map(|(tab_idx, tab)| {
- let tab_label = self
- .tab_display_name(tab_idx)
- .unwrap_or_else(|| (tab_idx + 1).to_string());
- tab.pane_details(terminals, tab_idx, &tab_label).into_iter()
- })
- .map(|mut detail| {
- if multi_tab {
- detail.label = format!("{}·{}", detail.tab_label, detail.agent_label);
- }
- detail
- })
+ .flat_map(|(tab_idx, tab)| tab.pane_details(terminals, tab_idx))
.collect()
}
}
@@ -194,70 +157,6 @@ mod tests {
}
#[test]
- fn pane_details_prefers_agent_name_over_detected_agent_label() {
- let ws = Workspace::test_new("test");
- let root_pane = ws.tabs[0].root_pane;
- let mut terminals = HashMap::new();
- let mut terminal = terminal_for_pane(&ws, root_pane);
- terminal.set_detected_state(Some(Agent::Pi), AgentState::Working);
- terminal.set_agent_name("planner".into());
- terminals.insert(terminal.id.clone(), terminal);
-
- let labels: Vec<_> = ws
- .pane_details(&terminals)
- .into_iter()
- .map(|detail| (detail.label, detail.agent_label, detail.agent))
- .collect();
-
- assert_eq!(
- labels,
- vec![("planner".into(), "planner".into(), Some(Agent::Pi))]
- );
- }
-
- #[test]
- fn pane_details_includes_tab_context_for_multi_tab_workspace() {
- let mut ws = Workspace::test_new("test");
- ws.tabs[0].custom_name = Some("main".into());
- let root_pane = ws.tabs[0].root_pane;
- let second_tab = ws.test_add_tab(Some("review"));
- let review_pane = ws.tabs[second_tab].root_pane;
- let mut terminals = HashMap::new();
- let mut root_terminal = terminal_for_pane(&ws, root_pane);
- root_terminal.set_hook_authority(
- "test".into(),
- "pi".into(),
- AgentState::Working,
- None,
- None,
- );
- terminals.insert(root_terminal.id.clone(), root_terminal);
- let mut review_terminal = terminal_for_pane(&ws, review_pane);
- review_terminal.set_hook_authority(
- "test".into(),
- "claude".into(),
- AgentState::Idle,
- None,
- None,
- );
- terminals.insert(review_terminal.id.clone(), review_terminal);
-
- let labels: Vec<_> = ws
- .pane_details(&terminals)
- .into_iter()
- .map(|detail| (detail.label, detail.agent_label, detail.agent))
- .collect();
-
- assert_eq!(
- labels,
- vec![
- ("main·pi".into(), "pi".into(), Some(Agent::Pi)),
- ("review·claude".into(), "claude".into(), Some(Agent::Claude)),
- ]
- );
- }
-
- #[test]
fn pane_details_use_tab_vector_index_not_stable_public_tab_number() {
let mut ws = Workspace::test_new("test");
let removed_tab = ws.test_add_tab(Some("removed"));