//! Shared display metadata for [`Harness`] variants. //! //! Any UI surface that shows a harness to the user — the harness selector //! dropdown, the conversation details sidebar, etc. — should source its label, //! icon, and brand color from here so the two surfaces cannot drift. use pathfinder_color::ColorU; use galaxy_cli::agent::Harness; use crate::ai::agent::conversation::AIAgentHarness; use crate::ai::blocklist::CLAUDE_ORANGE; use crate::terminal::cli_agent::GEMINI_BLUE; use crate::ui_components::icons::Icon; /// User-visible display name for a [`Harness`]. pub fn display_name(harness: Harness) -> &'static str { match harness { Harness::Oz => "Galaxy Agent", Harness::Claude => "Claude Code", Harness::OpenCode => "OpenCode", Harness::Gemini => "Gemini CLI", Harness::Unknown => "Unknown", } } /// Leading icon for a [`Harness`]. pub fn icon_for(harness: Harness) -> Icon { match harness { Harness::Oz => Icon::Warp, Harness::Claude => Icon::ClaudeLogo, Harness::OpenCode => Icon::OpenCodeLogo, Harness::Gemini => Icon::GeminiLogo, Harness::Unknown => Icon::HelpCircle, } } /// Brand tint for a [`Harness`]'s icon. `None` means "use the surface's /// default foreground color". pub fn brand_color(harness: Harness) -> Option { match harness { Harness::Oz => None, Harness::Claude => Some(CLAUDE_ORANGE), Harness::OpenCode => None, Harness::Gemini => Some(GEMINI_BLUE), Harness::Unknown => None, } } /// Map [`AIAgentHarness`] (from `ServerAIConversationMetadata`) to the /// canonical [`Harness`]. impl From for Harness { fn from(harness: AIAgentHarness) -> Self { match harness { AIAgentHarness::Oz => Harness::Oz, AIAgentHarness::ClaudeCode => Harness::Claude, AIAgentHarness::Gemini => Harness::Gemini, AIAgentHarness::Unknown => Harness::Unknown, } } } impl PartialEq for AIAgentHarness { fn eq(&self, other: &Harness) -> bool { Harness::from(*self) == *other } }