diff --git a/crates/agent_servers/src/custom.rs b/crates/agent_servers/src/custom.rs index ecf89a0671c687ad4f3b359a2cdae906a1c67cb5..2506608432ffa7a1eaf82bb3dfd15259a5dd53e5 100644 --- a/crates/agent_servers/src/custom.rs +++ b/crates/agent_servers/src/custom.rs @@ -484,6 +484,7 @@ mod tests { description: SharedString::from(""), version: SharedString::from("1.0.0"), repository: None, + website: None, icon_path: None, }, package: id, diff --git a/crates/agent_ui/src/agent_registry_ui.rs b/crates/agent_ui/src/agent_registry_ui.rs index cb99077697a59b4f0c1a50277172ef1eaf0b77aa..6e8f9ddee30b1a72c1c5daee32fda24042ff7df7 100644 --- a/crates/agent_ui/src/agent_registry_ui.rs +++ b/crates/agent_ui/src/agent_registry_ui.rs @@ -403,6 +403,22 @@ impl AgentRegistryPage { }) }); + let website_button = agent.website().map(|website| { + let website = website.clone(); + let website_for_click = website.clone(); + IconButton::new( + SharedString::from(format!("agent-website-{}", agent.id())), + IconName::Link, + ) + .icon_size(IconSize::Small) + .tooltip(move |_, cx| { + Tooltip::with_meta("Visit Agent Website", None, website.clone(), cx) + }) + .on_click(move |_, _, cx| { + cx.open_url(&website_for_click); + }) + }); + AgentRegistryCard::new() .child( h_flex() @@ -441,7 +457,8 @@ impl AgentRegistryPage { .color(Color::Muted) .truncate(), ) - .when_some(repository_button, |this, button| this.child(button)), + .when_some(repository_button, |this, button| this.child(button)) + .when_some(website_button, |this, button| this.child(button)), ), ) } diff --git a/crates/project/src/agent_registry_store.rs b/crates/project/src/agent_registry_store.rs index b0a7e965f093afead16e2e9f2b5f7df44298a314..9569798e1cf7b49d7f4ae8d2737f75b00eaffe63 100644 --- a/crates/project/src/agent_registry_store.rs +++ b/crates/project/src/agent_registry_store.rs @@ -23,6 +23,7 @@ pub struct RegistryAgentMetadata { pub description: SharedString, pub version: SharedString, pub repository: Option, + pub website: Option, pub icon_path: Option, } @@ -75,6 +76,10 @@ impl RegistryAgent { self.metadata().repository.as_ref() } + pub fn website(&self) -> Option<&SharedString> { + self.metadata().website.as_ref() + } + pub fn icon_path(&self) -> Option<&SharedString> { self.metadata().icon_path.as_ref() } @@ -369,6 +374,7 @@ async fn build_registry_agents( description: entry.description.into(), version: entry.version.into(), repository: entry.repository.map(Into::into), + website: entry.website.map(Into::into), icon_path, }; @@ -568,6 +574,8 @@ struct RegistryEntry { #[serde(default)] repository: Option, #[serde(default)] + website: Option, + #[serde(default)] icon: Option, distribution: RegistryDistribution, }