diff --git a/.github/APPROVED_CONTRIBUTORS b/.github/APPROVED_CONTRIBUTORS index 9d5c06318c..8a67ae5a72 100644 --- a/.github/APPROVED_CONTRIBUTORS +++ b/.github/APPROVED_CONTRIBUTORS @@ -67,3 +67,4 @@ MattJColes brabli aneym 1jehuang +abhishekvtangod diff --git a/docs/next/website/src/content/docs/configuration.mdx b/docs/next/website/src/content/docs/configuration.mdx index ce4db4e2be..02af1bc254 100644 --- a/docs/next/website/src/content/docs/configuration.mdx +++ b/docs/next/website/src/content/docs/configuration.mdx @@ -261,14 +261,14 @@ The sidebar is the main Herdr dashboard. Search `ui.` in the [Config reference]( Set `tab_bar_position = "bottom"` under `[ui]` to place the desktop tab row below the terminal panes. Prefix, Navigate, Copy, and Resize mode bars temporarily replace the bottom tab row while active. The default is `"top"`. -Agent status uses compact colored dots by default. To distinguish blocked, working, done, idle, and unknown states by shape as well as color, choose **distinct symbols** in Settings or configure: +Agent status uses distinct static symbols by default so blocked, working, done, idle, and unknown states differ by shape as well as color. To keep the compact color-only dots, choose **color dots** in Settings or configure: ```toml [ui] -status_indicators = "symbols" +status_indicators = "dots" ``` -The symbols are static, so this option does not enable spinner animation. +Symbols remain static, so the default still does not enable spinner animation. ### Sidebar row layouts diff --git a/docs/next/website/src/data/config-reference.json b/docs/next/website/src/data/config-reference.json index e7a0539b38..fe4e7746cd 100644 --- a/docs/next/website/src/data/config-reference.json +++ b/docs/next/website/src/data/config-reference.json @@ -705,7 +705,7 @@ { "key": "ui.status_indicators", "type": "enum", - "default": "\"dots\"", + "default": "\"symbols\"", "description": "Choose compact color dots or distinct static symbols for agent states.", "values": [ "dots", diff --git a/src/app/input/settings.rs b/src/app/input/settings.rs index fb1a7d757c..23fe2e0460 100644 --- a/src/app/input/settings.rs +++ b/src/app/input/settings.rs @@ -520,7 +520,7 @@ mod tests { fn settings_indicator_choice_returns_save_action() { let mut state = state_with_workspaces(&["test"]); open_settings_at(&mut state, SettingsSection::Indicators); - state.settings.list.selected = 1; + state.settings.list.selected = 0; let action = update_settings_state( &mut state, @@ -530,10 +530,10 @@ mod tests { assert_eq!( action, Some(SettingsAction::SaveStatusIndicators( - StatusIndicatorStyle::Symbols + StatusIndicatorStyle::Dots )) ); - assert_eq!(state.status_indicators, StatusIndicatorStyle::Dots); + assert_eq!(state.status_indicators, StatusIndicatorStyle::Symbols); assert_eq!(state.mode, Mode::Settings); } diff --git a/src/app/mod.rs b/src/app/mod.rs index 5e3c86de0f..0856f39652 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -3460,17 +3460,17 @@ mod tests { let mut app = test_app(); assert_eq!( app.state.status_indicators, - crate::config::StatusIndicatorStyle::Dots + crate::config::StatusIndicatorStyle::Symbols ); - app.save_status_indicators(crate::config::StatusIndicatorStyle::Symbols); + app.save_status_indicators(crate::config::StatusIndicatorStyle::Dots); assert_eq!( app.state.status_indicators, - crate::config::StatusIndicatorStyle::Symbols + crate::config::StatusIndicatorStyle::Dots ); let content = std::fs::read_to_string(&path).unwrap(); - assert!(content.contains("status_indicators = \"symbols\"")); + assert!(content.contains("status_indicators = \"dots\"")); assert!(app.state.config_diagnostic.is_none()); std::env::remove_var(crate::config::CONFIG_PATH_ENV_VAR); diff --git a/src/app/state.rs b/src/app/state.rs index 0e1a8439af..16c3c978d5 100644 --- a/src/app/state.rs +++ b/src/app/state.rs @@ -1874,7 +1874,7 @@ impl AppState { sidebar_collapsed_mode: crate::config::SidebarCollapsedModeConfig::Compact, sidebar_section_split: 0.5, agent_panel_sort: AgentPanelSort::Spaces, - status_indicators: crate::config::StatusIndicatorStyle::Dots, + status_indicators: crate::config::StatusIndicatorStyle::Symbols, agent_view_override: None, sidebar_agents: crate::config::AgentsSidebarConfig::default(), sidebar_spaces: crate::config::SpacesSidebarConfig::default(), diff --git a/src/config/model.rs b/src/config/model.rs index 5cbafaec9b..0a31e164cf 100644 --- a/src/config/model.rs +++ b/src/config/model.rs @@ -116,8 +116,8 @@ enum LegacyAgentPanelScopeConfig { #[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize, Default)] #[serde(rename_all = "lowercase")] pub enum StatusIndicatorStyle { - #[default] Dots, + #[default] Symbols, } @@ -1059,7 +1059,7 @@ impl Default for UiConfig { tab_bar_position: TabBarPositionConfig::Top, agent_panel_sort: AgentPanelSortConfig::Spaces, _legacy_agent_panel_scope: None, - status_indicators: StatusIndicatorStyle::Dots, + status_indicators: StatusIndicatorStyle::Symbols, sidebar: SidebarConfig::default(), accent: "cyan".into(), toast: ToastConfig::default(), @@ -1284,20 +1284,20 @@ agent_panel_scope = "current" } #[test] - fn status_indicator_style_defaults_to_dots_and_parses_symbols() { + fn status_indicator_style_defaults_to_symbols_and_parses_dots() { assert_eq!( Config::default().ui.status_indicators, - StatusIndicatorStyle::Dots + StatusIndicatorStyle::Symbols ); let config: Config = toml::from_str( r#" [ui] -status_indicators = "symbols" +status_indicators = "dots" "#, ) .unwrap(); - assert_eq!(config.ui.status_indicators, StatusIndicatorStyle::Symbols); + assert_eq!(config.ui.status_indicators, StatusIndicatorStyle::Dots); } #[test] diff --git a/src/main.rs b/src/main.rs index 85ff264b7a..da74984605 100644 --- a/src/main.rs +++ b/src/main.rs @@ -326,9 +326,9 @@ const DEFAULT_CONFIG: &str = r##"# herdr configuration # "workspaces" is accepted as an alias for "spaces". # agent_panel_sort = "spaces" -# Agent status indicators: "dots" preserves the compact color marks; "symbols" uses -# distinct static glyphs for blocked, working, done, idle, and unknown states. -# status_indicators = "dots" +# Agent status indicators: "symbols" (default) uses distinct static glyphs for blocked, +# working, done, idle, and unknown states. "dots" preserves the compact color marks. +# status_indicators = "symbols" # Expanded agent rows. Built-ins are state_icon, state_text, workspace, tab, pane, agent, # terminal_title, and terminal_title_stripped. diff --git a/tests/cross_area.rs b/tests/cross_area.rs index 6f1ab82b22..0be99c6ad2 100644 --- a/tests/cross_area.rs +++ b/tests/cross_area.rs @@ -845,7 +845,7 @@ fn cross_area_agent_process_survives_detach_and_reattach() { client_handshake(&mut client_b, CURRENT_PROTOCOL, 80, 24); let saw_working_on_client = wait_for_frame_matching(&mut client_b, Duration::from_secs(5), |frame| { - frame_contains_colored_symbol(frame, "●", (249, 226, 175)) + frame_contains_colored_symbol(frame, "◐", (249, 226, 175)) }) .expect("frame decoding should succeed"); assert!( @@ -864,7 +864,7 @@ fn cross_area_agent_process_survives_detach_and_reattach() { let saw_blocked_on_client = wait_for_frame_matching(&mut client_b, Duration::from_secs(5), |frame| { - frame_contains_colored_symbol(frame, "●", (243, 139, 168)) + frame_contains_colored_symbol(frame, "×", (243, 139, 168)) }) .expect("frame decoding should succeed"); assert!(