Use agent name from extension (#44496)

Previously this rendered `mistral-vibe` and not `Mistral Vibe`:

<img width="242" height="199" alt="Screenshot 2025-12-09 at 2 52 48 PM"
src="https://github.com/user-attachments/assets/f85cbf20-91d1-4c05-8b3a-fa5b544acb1c"
/>

Release Notes:

- Render agent display names from extension in menu
This commit is contained in:
Richard Feldman
2025-12-10 10:19:00 +00:00
committed by GitHub
parent fd2094fa19
commit a8e2dc2f25
3 changed files with 54 additions and 11 deletions
+23
View File
@@ -137,6 +137,7 @@ pub struct AgentServerStore {
state: AgentServerStoreState,
external_agents: HashMap<ExternalAgentServerName, Box<dyn ExternalAgentServer>>,
agent_icons: HashMap<ExternalAgentServerName, SharedString>,
agent_display_names: HashMap<ExternalAgentServerName, SharedString>,
}
pub struct AgentServersUpdated;
@@ -155,6 +156,7 @@ mod ext_agent_tests {
state: AgentServerStoreState::Collab,
external_agents: HashMap::default(),
agent_icons: HashMap::default(),
agent_display_names: HashMap::default(),
}
}
@@ -258,6 +260,7 @@ impl AgentServerStore {
self.external_agents.retain(|name, agent| {
if agent.downcast_mut::<LocalExtensionArchiveAgent>().is_some() {
self.agent_icons.remove(name);
self.agent_display_names.remove(name);
false
} else {
// Keep the hardcoded external agents that don't come from extensions
@@ -275,6 +278,12 @@ impl AgentServerStore {
for (ext_id, manifest) in manifests {
for (agent_name, agent_entry) in &manifest.agent_servers {
// Store absolute icon path if provided, resolving symlinks for dev extensions
// Store display name from manifest
self.agent_display_names.insert(
ExternalAgentServerName(agent_name.clone().into()),
SharedString::from(agent_entry.name.clone()),
);
let icon_path = if let Some(icon) = &agent_entry.icon {
let icon_path = extensions_dir.join(ext_id).join(icon);
// Canonicalize to resolve symlinks (dev extensions are symlinked)
@@ -310,6 +319,12 @@ impl AgentServerStore {
let mut agents = vec![];
for (ext_id, manifest) in manifests {
for (agent_name, agent_entry) in &manifest.agent_servers {
// Store display name from manifest
self.agent_display_names.insert(
ExternalAgentServerName(agent_name.clone().into()),
SharedString::from(agent_entry.name.clone()),
);
// Store absolute icon path if provided, resolving symlinks for dev extensions
let icon = if let Some(icon) = &agent_entry.icon {
let icon_path = extensions_dir.join(ext_id).join(icon);
@@ -369,6 +384,10 @@ impl AgentServerStore {
self.agent_icons.get(name).cloned()
}
pub fn agent_display_name(&self, name: &ExternalAgentServerName) -> Option<SharedString> {
self.agent_display_names.get(name).cloned()
}
pub fn init_remote(session: &AnyProtoClient) {
session.add_entity_message_handler(Self::handle_external_agents_updated);
session.add_entity_message_handler(Self::handle_loading_status_updated);
@@ -559,6 +578,7 @@ impl AgentServerStore {
},
external_agents: Default::default(),
agent_icons: Default::default(),
agent_display_names: Default::default(),
};
if let Some(_events) = extension::ExtensionEvents::try_global(cx) {}
this.agent_servers_settings_changed(cx);
@@ -609,6 +629,7 @@ impl AgentServerStore {
},
external_agents: external_agents.into_iter().collect(),
agent_icons: HashMap::default(),
agent_display_names: HashMap::default(),
}
}
@@ -617,6 +638,7 @@ impl AgentServerStore {
state: AgentServerStoreState::Collab,
external_agents: Default::default(),
agent_icons: Default::default(),
agent_display_names: Default::default(),
}
}
@@ -2040,6 +2062,7 @@ mod extension_agent_tests {
state: AgentServerStoreState::Collab,
external_agents: HashMap::default(),
agent_icons: HashMap::default(),
agent_display_names: HashMap::default(),
};
// Seed with extension agents (contain ": ") and custom agents (don't contain ": ")