diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-17 16:08:43 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-17 16:08:43 +0300 |
| commit | 54490254f70469cd154ee630bc4bec84da178f0c (patch) | |
| tree | 450bf0397398b28932f636d33e37f73c011dd19d /src/app | |
| parent | d998753efe506a04c80306795efc72bff60bb0ec (diff) | |
feat: sort agent panel by priority
refs #318
Diffstat (limited to 'src/app')
| -rw-r--r-- | src/app/actions.rs | 95 | ||||
| -rw-r--r-- | src/app/config_io.rs | 16 | ||||
| -rw-r--r-- | src/app/input/mod.rs | 7 | ||||
| -rw-r--r-- | src/app/input/mouse.rs | 10 | ||||
| -rw-r--r-- | src/app/input/sidebar.rs | 21 | ||||
| -rw-r--r-- | src/app/mod.rs | 61 | ||||
| -rw-r--r-- | src/app/runtime.rs | 16 | ||||
| -rw-r--r-- | src/app/session.rs | 1 | ||||
| -rw-r--r-- | src/app/state.rs | 14 |
9 files changed, 123 insertions, 118 deletions
diff --git a/src/app/actions.rs b/src/app/actions.rs index 9df07af5..1e0f0f5e 100644 --- a/src/app/actions.rs +++ b/src/app/actions.rs @@ -951,12 +951,6 @@ impl AppState { let workspace_id = self.workspaces[idx].id.clone(); crate::logging::workspace_focused(&workspace_id); self.mark_session_dirty(); - if matches!( - self.agent_panel_scope, - crate::app::state::AgentPanelScope::CurrentWorkspace - ) { - self.agent_panel_scroll = 0; - } self.ensure_workspace_visible(idx); if let Some(ws) = self.workspaces.get_mut(idx) { let active_tab = ws.active_tab; @@ -994,14 +988,6 @@ impl AppState { crate::logging::workspace_focused(&workspace_id); } self.mark_session_dirty(); - if workspace_changed - && matches!( - self.agent_panel_scope, - crate::app::state::AgentPanelScope::CurrentWorkspace - ) - { - self.agent_panel_scroll = 0; - } self.ensure_workspace_visible(ws_idx); if let Some(ws) = self.workspaces.get_mut(ws_idx) { ws.switch_tab(tab_idx); @@ -2587,6 +2573,12 @@ impl AppState { self.mark_session_dirty(); } let change = mutation.effective_state_change?; + if change.previous_state != change.state { + self.next_agent_state_change_seq += 1; + if let Some(terminal) = self.terminals.get_mut(&terminal_id) { + terminal.last_agent_state_change_seq = Some(self.next_agent_state_change_seq); + } + } let seen = self.apply_pane_state_change(ws_idx, pane_id, &change)?; let update = PaneStateUpdate { pane_id, @@ -3542,6 +3534,16 @@ mod tests { } fn mark_agent(state: &mut AppState, ws_idx: usize, tab_idx: usize, pane_id: PaneId) { + set_agent_state(state, ws_idx, tab_idx, pane_id, AgentState::Idle); + } + + fn set_agent_state( + state: &mut AppState, + ws_idx: usize, + tab_idx: usize, + pane_id: PaneId, + agent_state: AgentState, + ) { state.ensure_test_terminals(); let terminal_id = state.workspaces[ws_idx].tabs[tab_idx] .panes @@ -3550,12 +3552,28 @@ mod tests { .attached_terminal_id .clone(); if let Some(terminal) = state.terminals.get_mut(&terminal_id) { - terminal.set_detected_state(Some(Agent::Pi), AgentState::Idle); + terminal.set_detected_state(Some(Agent::Pi), agent_state); } } + fn transition_agent_state(state: &mut AppState, pane_id: PaneId, agent_state: AgentState) { + state + .update_terminal_state(pane_id, |terminal| { + Some(terminal.set_detected_state_with_screen_signals_at( + Some(Agent::Pi), + agent_state, + matches!(agent_state, AgentState::Blocked), + false, + false, + false, + std::time::Instant::now(), + )) + }) + .expect("agent state transition should update pane state"); + } + #[test] - fn next_agent_cycles_agent_panel_entries_in_all_scope() { + fn next_agent_cycles_agent_panel_entries() { let mut first = Workspace::test_new("one"); let first_root = first.tabs[0].root_pane; let first_second = first.test_split(Direction::Horizontal); @@ -3569,7 +3587,6 @@ mod tests { state.active = Some(0); state.selected = 0; state.mode = Mode::Terminal; - state.agent_panel_scope = crate::app::state::AgentPanelScope::AllWorkspaces; mark_agent(&mut state, 0, 0, first_root); mark_agent(&mut state, 0, 0, first_second); mark_agent(&mut state, 1, 0, second_root); @@ -3602,7 +3619,6 @@ mod tests { state.active = Some(0); state.selected = 0; state.mode = Mode::Terminal; - state.agent_panel_scope = crate::app::state::AgentPanelScope::AllWorkspaces; mark_agent(&mut state, 0, 0, first_root); mark_agent(&mut state, 0, 0, first_second); mark_agent(&mut state, 1, 0, second_root); @@ -3618,7 +3634,6 @@ mod tests { fn focus_agent_entry_succeeds_for_already_focused_agent() { let mut state = app_with_workspaces(&["one"]); let root = state.workspaces[0].tabs[0].root_pane; - state.agent_panel_scope = crate::app::state::AgentPanelScope::AllWorkspaces; mark_agent(&mut state, 0, 0, root); assert!(state.focus_agent_entry(0)); @@ -3628,11 +3643,11 @@ mod tests { } #[test] - fn next_agent_cycles_only_current_scope_entries() { + fn next_agent_cycles_priority_sorted_agent_panel_entries() { let mut first = Workspace::test_new("one"); let first_root = first.tabs[0].root_pane; let first_second = first.test_split(Direction::Horizontal); - first.tabs[0].layout.focus_pane(first_second); + first.tabs[0].layout.focus_pane(first_root); let second = Workspace::test_new("two"); let second_root = second.tabs[0].root_pane; @@ -3642,15 +3657,40 @@ mod tests { state.active = Some(0); state.selected = 0; state.mode = Mode::Terminal; - state.agent_panel_scope = crate::app::state::AgentPanelScope::CurrentWorkspace; - mark_agent(&mut state, 0, 0, first_root); - mark_agent(&mut state, 0, 0, first_second); - mark_agent(&mut state, 1, 0, second_root); + state.agent_panel_sort = crate::app::state::AgentPanelSort::Priority; + set_agent_state(&mut state, 0, 0, first_root, AgentState::Idle); + set_agent_state(&mut state, 0, 0, first_second, AgentState::Working); + set_agent_state(&mut state, 1, 0, second_root, AgentState::Blocked); state.next_agent(); - assert_eq!(state.active, Some(0)); - assert_eq!(state.workspaces[0].focused_pane_id(), Some(first_root)); + assert_eq!(state.active, Some(1)); + assert_eq!(state.workspaces[1].focused_pane_id(), Some(second_root)); + state.assert_invariants_for_test(); + } + + #[test] + fn priority_sort_keeps_recently_changed_idle_agent_above_older_idle_agent() { + let mut workspace = Workspace::test_new("one"); + let first = workspace.tabs[0].root_pane; + let second = workspace.test_split(Direction::Horizontal); + workspace.tabs[0].layout.focus_pane(first); + + let mut state = AppState::test_new(); + state.workspaces = vec![workspace]; + state.ensure_test_terminals(); + state.active = Some(0); + state.selected = 0; + state.mode = Mode::Terminal; + state.agent_panel_sort = crate::app::state::AgentPanelSort::Priority; + + transition_agent_state(&mut state, first, AgentState::Idle); + transition_agent_state(&mut state, second, AgentState::Working); + assert_eq!(crate::ui::agent_panel_entries(&state)[0].pane_id, second); + + transition_agent_state(&mut state, second, AgentState::Idle); + + assert_eq!(crate::ui::agent_panel_entries(&state)[0].pane_id, second); state.assert_invariants_for_test(); } @@ -3668,7 +3708,6 @@ mod tests { state.active = Some(0); state.selected = 0; state.mode = Mode::Terminal; - state.agent_panel_scope = crate::app::state::AgentPanelScope::CurrentWorkspace; for tab_idx in 0..state.workspaces[0].tabs.len() { let pane_id = state.workspaces[0].tabs[tab_idx].root_pane; mark_agent(&mut state, 0, tab_idx, pane_id); diff --git a/src/app/config_io.rs b/src/app/config_io.rs index 804a26f6..7a196008 100644 --- a/src/app/config_io.rs +++ b/src/app/config_io.rs @@ -107,20 +107,20 @@ impl App { } } - pub(super) fn save_agent_panel_scope(&mut self, scope: crate::app::state::AgentPanelScope) { - let value = match scope { - crate::app::state::AgentPanelScope::CurrentWorkspace => { - crate::config::AgentPanelScopeConfig::Current.as_str() + pub(super) fn save_agent_panel_sort(&mut self, sort: crate::app::state::AgentPanelSort) { + let value = match sort { + crate::app::state::AgentPanelSort::Spaces => { + crate::config::AgentPanelSortConfig::Spaces.as_str() } - crate::app::state::AgentPanelScope::AllWorkspaces => { - crate::config::AgentPanelScopeConfig::All.as_str() + crate::app::state::AgentPanelSort::Priority => { + crate::config::AgentPanelSortConfig::Priority.as_str() } }; - if self.update_config_file("agent panel scope", |content| { + if self.update_config_file("agent panel sort", |content| { crate::config::upsert_section_value( content, "ui", - "agent_panel_scope", + "agent_panel_sort", &format!("\"{value}\""), ) }) { diff --git a/src/app/input/mod.rs b/src/app/input/mod.rs index cb4b0d46..5760c436 100644 --- a/src/app/input/mod.rs +++ b/src/app/input/mod.rs @@ -256,7 +256,7 @@ impl App { let handled_pane_double_click = self.handle_pane_double_click(mouse); - let previous_agent_panel_scope = self.state.agent_panel_scope; + let previous_agent_panel_sort = self.state.agent_panel_sort; let previous_settings_section = self.state.settings.section; if !handled_pane_double_click { if let Some(action) = self.state.handle_mouse(&mut self.terminal_runtimes, mouse) { @@ -286,8 +286,8 @@ impl App { { self.refresh_integration_recommendations(); } - if self.state.agent_panel_scope != previous_agent_panel_scope { - self.save_agent_panel_scope(self.state.agent_panel_scope); + if self.state.agent_panel_sort != previous_agent_panel_sort { + self.save_agent_panel_sort(self.state.agent_panel_sort); } if let Some(content) = self.state.request_clipboard_write.take() { @@ -590,7 +590,6 @@ fn capture_snapshot(state: &AppState) -> crate::persist::SessionSnapshot { &terminal_runtimes, state.active, state.selected, - state.agent_panel_scope, state.sidebar_width, state.sidebar_section_split, state.collapsed_space_keys.clone(), diff --git a/src/app/input/mouse.rs b/src/app/input/mouse.rs index 2e2a94aa..41bb5267 100644 --- a/src/app/input/mouse.rs +++ b/src/app/input/mouse.rs @@ -5,7 +5,7 @@ use tracing::warn; use crate::{ app::state::{ - AgentPanelScope, AppState, ContextMenuKind, ContextMenuState, DragState, DragTarget, + AgentPanelSort, AppState, ContextMenuKind, ContextMenuState, DragState, DragTarget, MenuListState, Mode, RightClickPassthroughGesture, TabPressState, ViewLayout, WorkspacePressState, }, @@ -540,10 +540,10 @@ impl AppState { return None; } - if self.on_agent_panel_scope_toggle(mouse.column, mouse.row) { - self.agent_panel_scope = match self.agent_panel_scope { - AgentPanelScope::CurrentWorkspace => AgentPanelScope::AllWorkspaces, - AgentPanelScope::AllWorkspaces => AgentPanelScope::CurrentWorkspace, + if self.on_agent_panel_sort_toggle(mouse.column, mouse.row) { + self.agent_panel_sort = match self.agent_panel_sort { + AgentPanelSort::Spaces => AgentPanelSort::Priority, + AgentPanelSort::Priority => AgentPanelSort::Spaces, }; self.agent_panel_scroll = 0; self.mark_session_dirty(); diff --git a/src/app/input/sidebar.rs b/src/app/input/sidebar.rs index 3ab5f8f5..fd631cd4 100644 --- a/src/app/input/sidebar.rs +++ b/src/app/input/sidebar.rs @@ -432,7 +432,7 @@ impl AppState { best.map(|(insert_idx, _)| insert_idx) } - pub(super) fn on_agent_panel_scope_toggle(&self, col: u16, row: u16) -> bool { + pub(super) fn on_agent_panel_sort_toggle(&self, col: u16, row: u16) -> bool { if self.sidebar_collapsed { return false; } @@ -441,7 +441,7 @@ impl AppState { self.view.sidebar_rect, self.sidebar_section_split, ); - let rect = crate::ui::agent_panel_toggle_rect(detail_area, self.agent_panel_scope); + let rect = crate::ui::agent_panel_toggle_rect(detail_area, self.agent_panel_sort); rect.width > 0 && col >= rect.x && col < rect.x + rect.width @@ -496,7 +496,7 @@ mod tests { use super::super::{app_for_mouse_test, capture_snapshot, mouse, unique_temp_path}; use crate::{ - app::state::{AgentPanelScope, DragTarget, Mode}, + app::state::{AgentPanelSort, DragTarget, Mode}, detect::Agent, workspace::Workspace, }; @@ -711,7 +711,7 @@ mod tests { } #[test] - fn clicking_agent_panel_toggle_switches_scope() { + fn clicking_agent_panel_toggle_switches_sort() { let mut app = app_for_mouse_test(); app.state.workspaces = vec![Workspace::test_new("test")]; app.state.active = Some(0); @@ -723,23 +723,15 @@ mod tests { app.state.view.sidebar_rect, app.state.sidebar_section_split, ); - let toggle = crate::ui::agent_panel_toggle_rect(detail_area, app.state.agent_panel_scope); + let toggle = crate::ui::agent_panel_toggle_rect(detail_area, app.state.agent_panel_sort); app.handle_mouse(mouse( MouseEventKind::Down(MouseButton::Left), toggle.x, toggle.y, )); - assert_eq!( - app.state.agent_panel_scope, - AgentPanelScope::CurrentWorkspace - ); + assert_eq!(app.state.agent_panel_sort, AgentPanelSort::Priority); assert_eq!(app.state.agent_panel_scroll, 0); - let snapshot = capture_snapshot(&app.state); - assert_eq!( - snapshot.agent_panel_scope, - AgentPanelScope::CurrentWorkspace - ); } #[test] @@ -772,7 +764,6 @@ mod tests { app.state.active = Some(0); app.state.selected = 0; app.state.mode = Mode::Terminal; - app.state.agent_panel_scope = AgentPanelScope::AllWorkspaces; let (_, detail_area) = crate::ui::expanded_sidebar_sections( app.state.view.sidebar_rect, diff --git a/src/app/mod.rs b/src/app/mod.rs index 1b90f157..ff1581cf 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -204,12 +204,12 @@ fn load_plugin_registry(no_session: bool) -> crate::app::state::InstalledPluginR .collect() } -fn agent_panel_scope_from_config( - scope: crate::config::AgentPanelScopeConfig, -) -> state::AgentPanelScope { - match scope { - crate::config::AgentPanelScopeConfig::Current => state::AgentPanelScope::CurrentWorkspace, - crate::config::AgentPanelScopeConfig::All => state::AgentPanelScope::AllWorkspaces, +fn agent_panel_sort_from_config( + sort: crate::config::AgentPanelSortConfig, +) -> state::AgentPanelSort { + match sort { + crate::config::AgentPanelSortConfig::Spaces => state::AgentPanelSort::Spaces, + crate::config::AgentPanelSortConfig::Priority => state::AgentPanelSort::Priority, } } @@ -289,7 +289,6 @@ impl App { workspaces, active, selected, - _restored_agent_panel_scope, sidebar_width, sidebar_width_source, sidebar_section_split, @@ -299,7 +298,6 @@ impl App { Vec::new(), None, 0, - state::AgentPanelScope::CurrentWorkspace, config.ui.sidebar_width, state::SidebarWidthSource::ConfigDefault, 0.5_f32, @@ -332,7 +330,6 @@ impl App { Vec::new(), None, 0, - snap.agent_panel_scope, snap.sidebar_width.unwrap_or(config.ui.sidebar_width), if snap.sidebar_width.is_some() { state::SidebarWidthSource::Persisted @@ -350,7 +347,6 @@ impl App { ws, active, selected, - snap.agent_panel_scope, snap.sidebar_width.unwrap_or(config.ui.sidebar_width), if snap.sidebar_width.is_some() { state::SidebarWidthSource::Persisted @@ -366,7 +362,6 @@ impl App { Vec::new(), None, 0, - state::AgentPanelScope::CurrentWorkspace, config.ui.sidebar_width, state::SidebarWidthSource::ConfigDefault, 0.5_f32, @@ -374,7 +369,7 @@ impl App { ) }; - let agent_panel_scope = agent_panel_scope_from_config(config.ui.agent_panel_scope); + let agent_panel_sort = agent_panel_sort_from_config(config.ui.agent_panel_sort); // Validate sidebar bounds before they reach any `u16::clamp(min, max)` // call: `clamp` panics when `min > max`. On bad config, fall back to @@ -519,7 +514,8 @@ impl App { sidebar_width_auto: false, sidebar_collapsed: false, sidebar_section_split, - agent_panel_scope, + agent_panel_sort, + next_agent_state_change_seq: 0, mouse_capture: config.ui.mouse_capture, right_click_passthrough_modifiers: config.ui.right_click_passthrough_modifiers(), right_click_passthrough: None, @@ -693,7 +689,6 @@ impl App { app.state.selected = snapshot .selected .min(app.state.workspaces.len().saturating_sub(1)); - app.state.agent_panel_scope = snapshot.agent_panel_scope; if let Some(width) = snapshot.sidebar_width { app.state.sidebar_width = width; app.state.sidebar_width_source = state::SidebarWidthSource::Persisted; @@ -1246,8 +1241,8 @@ impl App { self.state.prompt_new_tab_name = config.ui.prompt_new_tab_name; self.state.show_agent_labels_on_pane_borders = config.ui.show_agent_labels_on_pane_borders; - self.state.agent_panel_scope = - agent_panel_scope_from_config(config.ui.agent_panel_scope); + self.state.agent_panel_sort = + agent_panel_sort_from_config(config.ui.agent_panel_sort); self.state.agent_panel_scroll = 0; self.state.accent = crate::config::parse_color(&config.ui.accent); if !self.state.local_sound_playback && self.state.sound != config.ui.sound { @@ -2065,17 +2060,14 @@ mod tests { } #[test] - fn startup_uses_configured_agent_panel_scope() { + fn startup_uses_configured_agent_panel_sort() { let mut config = Config::default(); - config.ui.agent_panel_scope = crate::config::AgentPanelScopeConfig::Current; + config.ui.agent_panel_sort = crate::config::AgentPanelSortConfig::Priority; let (_api_tx, api_rx) = tokio::sync::mpsc::unbounded_channel(); let app = App::new(&config, true, None, api_rx, crate::api::EventHub::default()); - assert_eq!( - app.state.agent_panel_scope, - state::AgentPanelScope::CurrentWorkspace - ); + assert_eq!(app.state.agent_panel_sort, state::AgentPanelSort::Priority); } #[test] @@ -2199,7 +2191,7 @@ mod tests { std::fs::create_dir_all(path.parent().unwrap()).unwrap(); std::fs::write( &path, - "[terminal]\ndefault_shell = \"nu\"\nshell_mode = \"non_login\"\nnew_cwd = \"home\"\n[keys]\nnew_workspace = \"prefix+m\"\nprefix = \"ctrl+a\"\n[ui]\nagent_panel_scope = \"current\"\nredraw_on_focus_gained = false\nright_click_passthrough_modifier = \"ctrl\"\n[ui.toast]\ndelivery = \"herdr\"\n[experimental]\nswitch_ascii_input_source_in_prefix = true\n", + "[terminal]\ndefault_shell = \"nu\"\nshell_mode = \"non_login\"\nnew_cwd = \"home\"\n[keys]\nnew_workspace = \"prefix+m\"\nprefix = \"ctrl+a\"\n[ui]\nagent_panel_scope = \"current\"\nagent_panel_sort = \"priority\"\nredraw_on_focus_gained = false\nright_click_passthrough_modifier = \"ctrl\"\n[ui.toast]\ndelivery = \"herdr\"\n[experimental]\nswitch_ascii_input_source_in_prefix = true\n", ) .unwrap(); std::env::set_var(crate::config::CONFIG_PATH_ENV_VAR, &path); @@ -2219,10 +2211,7 @@ mod tests { app.state.toast_config.delivery, crate::config::ToastDelivery::Herdr ); - assert_eq!( - app.state.agent_panel_scope, - state::AgentPanelScope::CurrentWorkspace - ); + assert_eq!(app.state.agent_panel_sort, state::AgentPanelSort::Priority); assert!(!app.state.redraw_on_focus_gained); assert_eq!( app.state.right_click_passthrough_modifiers, @@ -2561,27 +2550,21 @@ mod tests { } #[test] - fn save_agent_panel_scope_persists_then_applies_live_config() { + fn save_agent_panel_sort_persists_then_applies_live_config() { let _guard = config_env_lock().lock().unwrap(); - let path = temp_config_path("save-agent-panel-scope"); + let path = temp_config_path("save-agent-panel-sort"); std::fs::create_dir_all(path.parent().unwrap()).unwrap(); std::fs::write(&path, "onboarding = false\n").unwrap(); std::env::set_var(crate::config::CONFIG_PATH_ENV_VAR, &path); let mut app = test_app(); - assert_eq!( - app.state.agent_panel_scope, - state::AgentPanelScope::AllWorkspaces - ); + assert_eq!(app.state.agent_panel_sort, state::AgentPanelSort::Spaces); - app.save_agent_panel_scope(state::AgentPanelScope::CurrentWorkspace); + app.save_agent_panel_sort(state::AgentPanelSort::Priority); - assert_eq!( - app.state.agent_panel_scope, - state::AgentPanelScope::CurrentWorkspace - ); + assert_eq!(app.state.agent_panel_sort, state::AgentPanelSort::Priority); let content = std::fs::read_to_string(&path).unwrap(); - assert!(content.contains("agent_panel_scope = \"current\"")); + assert!(content.contains("agent_panel_sort = \"priority\"")); assert!(app.state.config_diagnostic.is_none()); std::env::remove_var(crate::config::CONFIG_PATH_ENV_VAR); diff --git a/src/app/runtime.rs b/src/app/runtime.rs index cb2e5712..815701b7 100644 --- a/src/app/runtime.rs +++ b/src/app/runtime.rs @@ -336,18 +336,10 @@ impl App { } fn agent_panel_has_animation(&self) -> bool { - match self.state.agent_panel_scope { - crate::app::state::AgentPanelScope::CurrentWorkspace => self - .state - .active - .and_then(|idx| self.state.workspaces.get(idx)) - .is_some_and(|ws| ws.has_working_pane(&self.state.terminals)), - crate::app::state::AgentPanelScope::AllWorkspaces => self - .state - .workspaces - .iter() - .any(|ws| ws.has_working_pane(&self.state.terminals)), - } + self.state + .workspaces + .iter() + .any(|ws| ws.has_working_pane(&self.state.terminals)) } pub(crate) fn tick_selection_autoscroll(&mut self, now: Instant) { diff --git a/src/app/session.rs b/src/app/session.rs index f9b38e79..5e174507 100644 --- a/src/app/session.rs +++ b/src/app/session.rs @@ -31,7 +31,6 @@ impl App { &self.terminal_runtimes, self.state.active, self.state.selected, - self.state.agent_panel_scope, self.state.sidebar_width, self.state.sidebar_section_split, self.state.collapsed_space_keys.clone(), diff --git a/src/app/state.rs b/src/app/state.rs index 089834d8..585bb3e4 100644 --- a/src/app/state.rs +++ b/src/app/state.rs @@ -832,11 +832,11 @@ pub(crate) enum CopyModeSelection { Linewise { anchor_row: u32 }, } -#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, serde::Serialize, serde::Deserialize)] -pub enum AgentPanelScope { - CurrentWorkspace, +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)] +pub enum AgentPanelSort { #[default] - AllWorkspaces, + Spaces, + Priority, } // --------------------------------------------------------------------------- @@ -1340,7 +1340,8 @@ pub struct AppState { pub sidebar_collapsed: bool, /// Ratio of sidebar height allocated to the workspaces section. pub sidebar_section_split: f32, - pub agent_panel_scope: AgentPanelScope, + pub agent_panel_sort: AgentPanelSort, + pub next_agent_state_change_seq: u64, /// Capture mouse input for Herdr's own mouse UI. When false, Herdr only /// captures mouse while the focused pane app requests mouse reporting. pub mouse_capture: bool, @@ -1689,7 +1690,8 @@ impl AppState { sidebar_width_auto: false, sidebar_collapsed: false, sidebar_section_split: 0.5, - agent_panel_scope: AgentPanelScope::AllWorkspaces, + agent_panel_sort: AgentPanelSort::Spaces, + next_agent_state_change_seq: 0, mouse_capture: true, right_click_passthrough_modifiers: None, right_click_passthrough: None, |
