From 36293d7dd93e1690287a4f0e69421bcd66d0d2d0 Mon Sep 17 00:00:00 2001 From: Richard Feldman Date: Tue, 9 Dec 2025 17:04:58 -0500 Subject: [PATCH] Debugging --- crates/agent_ui/src/acp/model_selector.rs | 2 +- .../src/acp/model_selector_popover.rs | 8 ++++--- crates/agent_ui/src/agent_configuration.rs | 10 ++++++++ .../agent_ui/src/language_model_selector.rs | 14 +++++++---- .../src/wasm_host/llm_provider.rs | 8 ++++++- crates/gpui/src/elements/svg.rs | 21 +++++++++++++---- crates/language_model/src/registry.rs | 4 ++-- crates/language_models/src/extension.rs | 6 +++++ crates/ui/src/components/icon.rs | 23 ++++++++----------- 9 files changed, 67 insertions(+), 29 deletions(-) diff --git a/crates/agent_ui/src/acp/model_selector.rs b/crates/agent_ui/src/acp/model_selector.rs index 6b8e1d87a0934abd1d2e1cc553ac2dafaca98de0..dd5201e03fb417d9228a5a6529a92540dab8bb81 100644 --- a/crates/agent_ui/src/acp/model_selector.rs +++ b/crates/agent_ui/src/acp/model_selector.rs @@ -294,7 +294,7 @@ impl PickerDelegate for AcpModelPickerDelegate { .gap_1p5() .map(|this| match &model_info.icon { Some(AgentModelIcon::Path(path)) => this.child( - Icon::from_path(path.clone()) + Icon::from_external_svg(path.clone()) .color(model_icon_color) .size(IconSize::Small), ), diff --git a/crates/agent_ui/src/acp/model_selector_popover.rs b/crates/agent_ui/src/acp/model_selector_popover.rs index 7fd808bb2059fdb16cec3cca271190202127a176..1b510b6f52d11d535e9e59dda9861e912345ddbc 100644 --- a/crates/agent_ui/src/acp/model_selector_popover.rs +++ b/crates/agent_ui/src/acp/model_selector_popover.rs @@ -79,9 +79,11 @@ impl Render for AcpModelSelectorPopover { ButtonLike::new("active-model") .selected_style(ButtonStyle::Tinted(TintColor::Accent)) .when_some(model_icon, |this, icon| match icon { - AgentModelIcon::Path(path) => { - this.child(Icon::from_path(path).color(color).size(IconSize::XSmall)) - } + AgentModelIcon::Path(path) => this.child( + Icon::from_external_svg(path) + .color(color) + .size(IconSize::XSmall), + ), AgentModelIcon::Named(icon_name) => { this.child(Icon::new(icon_name).color(color).size(IconSize::XSmall)) } diff --git a/crates/agent_ui/src/agent_configuration.rs b/crates/agent_ui/src/agent_configuration.rs index 3533c28caa93f82c96ecacdafdfdd3dc1b1643f1..54c0bfef37762e930672ecacafd225af9e2818da 100644 --- a/crates/agent_ui/src/agent_configuration.rs +++ b/crates/agent_ui/src/agent_configuration.rs @@ -261,10 +261,20 @@ impl AgentConfiguration { .w_full() .gap_1p5() .child(if let Some(icon_path) = provider.icon_path() { + log::info!( + "Rendering LLM provider icon with from_external_svg: provider={}, path={}", + provider.id(), + icon_path + ); Icon::from_external_svg(icon_path) .size(IconSize::Small) .color(Color::Muted) } else { + log::info!( + "Rendering LLM provider icon with Icon::new: provider={}, icon={:?}", + provider.id(), + provider.icon() + ); Icon::new(provider.icon()) .size(IconSize::Small) .color(Color::Muted) diff --git a/crates/agent_ui/src/language_model_selector.rs b/crates/agent_ui/src/language_model_selector.rs index 9fd717a597e14918c3a3adc909ff53d2bb8de740..0bad72fe0e6750c3adc117ee2b38418804cf4398 100644 --- a/crates/agent_ui/src/language_model_selector.rs +++ b/crates/agent_ui/src/language_model_selector.rs @@ -46,7 +46,9 @@ pub fn language_model_selector( } fn all_models(cx: &App) -> GroupedModels { - let providers = LanguageModelRegistry::global(cx).read(cx).providers(); + let providers = LanguageModelRegistry::global(cx) + .read(cx) + .visible_providers(); let recommended = providers .iter() @@ -536,10 +538,14 @@ impl PickerDelegate for LanguageModelPickerDelegate { .w_full() .gap_1p5() .child(match &model_info.icon { - ProviderIcon::Name(icon_name) => Icon::new(*icon_name) - .color(model_icon_color) - .size(IconSize::Small), + ProviderIcon::Name(icon_name) => { + log::info!("ICON_DEBUG model_selector using Icon::new for {:?}", icon_name); + Icon::new(*icon_name) + .color(model_icon_color) + .size(IconSize::Small) + } ProviderIcon::Path(icon_path) => { + log::info!("ICON_DEBUG model_selector using from_external_svg path={}", icon_path); Icon::from_external_svg(icon_path.clone()) .color(model_icon_color) .size(IconSize::Small) diff --git a/crates/extension_host/src/wasm_host/llm_provider.rs b/crates/extension_host/src/wasm_host/llm_provider.rs index acec25b8258c1615d97e55d3742a5fff42661b87..73f1c4a6b1b7e03e671ccd2b869f7357fbe151cd 100644 --- a/crates/extension_host/src/wasm_host/llm_provider.rs +++ b/crates/extension_host/src/wasm_host/llm_provider.rs @@ -123,7 +123,13 @@ impl LanguageModelProvider for ExtensionLanguageModelProvider { } fn icon_path(&self) -> Option { - self.icon_path.clone() + let path = self.icon_path.clone(); + log::info!( + "LLM provider {} icon_path() returning: {:?}", + self.provider_info.id, + path + ); + path } fn default_model(&self, cx: &App) -> Option> { diff --git a/crates/gpui/src/elements/svg.rs b/crates/gpui/src/elements/svg.rs index 57b2d712e54c501cb7eaf59f6433748ddf36d3fc..32c6b11ec964be136d1cba9011daac8685279a77 100644 --- a/crates/gpui/src/elements/svg.rs +++ b/crates/gpui/src/elements/svg.rs @@ -132,12 +132,25 @@ impl Element for Svg { } else if let Some((path, color)) = self.external_path.as_ref().zip(style.text.color) { - let Some(bytes) = window - .use_asset::(path, cx) - .and_then(|asset| asset.log_err()) - else { + log::info!( + "ICON_DEBUG svg.rs external_path={}, color={:?}", + path, + color + ); + let Some(bytes) = window.use_asset::(path, cx).and_then(|asset| { + if let Err(ref e) = asset { + log::error!("ICON_DEBUG svg.rs FAILED path={}: {:?}", path, e); + } + asset.log_err() + }) else { + log::warn!("ICON_DEBUG svg.rs NO_BYTES path={}", path); return; }; + log::info!( + "ICON_DEBUG svg.rs loaded {} bytes path={}", + bytes.len(), + path + ); let transformation = self .transformation diff --git a/crates/language_model/src/registry.rs b/crates/language_model/src/registry.rs index 2b5d54dbf38d9573cf2cecd9961942a9e86bd27d..ec688987e159095290ac16b8b029095651e31967 100644 --- a/crates/language_model/src/registry.rs +++ b/crates/language_model/src/registry.rs @@ -203,14 +203,14 @@ impl LanguageModelRegistry { pub fn visible_providers(&self) -> Vec> { let all = self.providers(); log::info!( - "LanguageModelRegistry::visible_providers called, all_providers={}, installed_llm_extension_ids={:?}", + "ICON_DEBUG visible_providers: all_providers={}, installed_llm_extension_ids={:?}", all.len(), self.installed_llm_extension_ids ); for p in &all { let hidden = self.should_hide_provider(&p.id()); log::info!( - " provider {} (id: {}): hidden={}", + "ICON_DEBUG provider {} (id: {}): hidden={}", p.name(), p.id(), hidden diff --git a/crates/language_models/src/extension.rs b/crates/language_models/src/extension.rs index b18d4e996e726def3311a6872e867a53f7ca26b6..80081bebefbd7a51e5c4f4a6079e432535e1a468 100644 --- a/crates/language_models/src/extension.rs +++ b/crates/language_models/src/extension.rs @@ -66,5 +66,11 @@ pub fn init_proxy(cx: &mut App) { log::info!( "language_models::extension::init_proxy: registering LanguageModelProviderRegistryProxy" ); + + // Set the function that determines which built-in providers should be hidden + registry.update(cx, |registry, _cx| { + registry.set_builtin_provider_hiding_fn(Box::new(extension_for_builtin_provider)); + }); + proxy.register_language_model_provider_proxy(LanguageModelProviderRegistryProxy::new(registry)); } diff --git a/crates/ui/src/components/icon.rs b/crates/ui/src/components/icon.rs index b587d3866f06f426db89c8cc60bebe8907cf51d9..9d2c7ae3b515744125879f4a2c0e0d3e9a4fb841 100644 --- a/crates/ui/src/components/icon.rs +++ b/crates/ui/src/components/icon.rs @@ -144,23 +144,18 @@ impl Icon { } } - /// Create an icon from an embedded SVG path (e.g., "icons/ai.svg"). - /// These are SVGs bundled in the Zed binary. - pub fn from_embedded(path: impl Into) -> Self { - Self { - source: IconSource::Embedded(path.into()), - color: Color::default(), - size: IconSize::default().rems(), - transformation: Transformation::default(), - } - } - - /// Create an icon from an external file path (e.g., from an extension). - /// This renders the file as a raster image. + /// Create an icon from a path. Uses a heuristic to determine if it's embedded or external: + /// - Paths starting with "icons/" are treated as embedded SVGs + /// - Other paths are treated as external raster images (from icon themes) pub fn from_path(path: impl Into) -> Self { let path = path.into(); + let source = if path.starts_with("icons/") { + IconSource::Embedded(path) + } else { + IconSource::External(Arc::from(PathBuf::from(path.as_ref()))) + }; Self { - source: IconSource::External(Arc::from(PathBuf::from(path.as_ref()))), + source, color: Color::default(), size: IconSize::default().rems(), transformation: Transformation::default(),