From afbd2b760f6254e7de580f0923f65c128f74433b Mon Sep 17 00:00:00 2001
From: Danilo Leal <67129314+danilo-leal@users.noreply.github.com>
Date: Tue, 15 Jul 2025 20:10:44 -0300
Subject: [PATCH] agent: Add plan chip in the Zed section within the settings
view (#34503)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
| Free | Pro |
|--------|--------|
|
|
|
Release Notes:
- agent: Added a chip communicating which Zed plan you're subscribed to
in the agent panel settings view.
---
crates/agent_ui/src/agent_configuration.rs | 83 ++++++++++++++++++++--
1 file changed, 76 insertions(+), 7 deletions(-)
diff --git a/crates/agent_ui/src/agent_configuration.rs b/crates/agent_ui/src/agent_configuration.rs
index 579331c9acd07d1e41a1ceaee7fe2452bb0c1591..699a776330b0fda13417e5ac3e5400345192fc94 100644
--- a/crates/agent_ui/src/agent_configuration.rs
+++ b/crates/agent_ui/src/agent_configuration.rs
@@ -24,6 +24,7 @@ use project::{
context_server_store::{ContextServerConfiguration, ContextServerStatus, ContextServerStore},
project_settings::{ContextServerSettings, ProjectSettings},
};
+use proto::Plan;
use settings::{Settings, update_settings_file};
use ui::{
ContextMenu, Disclosure, Divider, DividerColor, ElevationIndex, Indicator, PopoverMenu,
@@ -171,6 +172,15 @@ impl AgentConfiguration {
.copied()
.unwrap_or(false);
+ let is_zed_provider = provider.id() == ZED_CLOUD_PROVIDER_ID;
+ let current_plan = if is_zed_provider {
+ self.workspace
+ .upgrade()
+ .and_then(|workspace| workspace.read(cx).user_store().read(cx).current_plan())
+ } else {
+ None
+ };
+
v_flex()
.when(is_expanded, |this| this.mb_2())
.child(
@@ -208,14 +218,31 @@ impl AgentConfiguration {
.size(IconSize::Small)
.color(Color::Muted),
)
- .child(Label::new(provider_name.clone()).size(LabelSize::Large))
- .when(
- provider.is_authenticated(cx) && !is_expanded,
- |parent| {
- parent.child(
- Icon::new(IconName::Check).color(Color::Success),
+ .child(
+ h_flex()
+ .gap_1()
+ .child(
+ Label::new(provider_name.clone())
+ .size(LabelSize::Large),
)
- },
+ .map(|this| {
+ if is_zed_provider {
+ this.child(
+ self.render_zed_plan_info(current_plan, cx),
+ )
+ } else {
+ this.when(
+ provider.is_authenticated(cx)
+ && !is_expanded,
+ |parent| {
+ parent.child(
+ Icon::new(IconName::Check)
+ .color(Color::Success),
+ )
+ },
+ )
+ }
+ }),
),
)
.child(
@@ -431,6 +458,48 @@ impl AgentConfiguration {
.child(self.render_sound_notification(cx))
}
+ fn render_zed_plan_info(&self, plan: Option, cx: &mut Context) -> impl IntoElement {
+ if let Some(plan) = plan {
+ let free_chip_bg = cx
+ .theme()
+ .colors()
+ .editor_background
+ .opacity(0.5)
+ .blend(cx.theme().colors().text_accent.opacity(0.05));
+
+ let pro_chip_bg = cx
+ .theme()
+ .colors()
+ .editor_background
+ .opacity(0.5)
+ .blend(cx.theme().colors().text_accent.opacity(0.2));
+
+ let (plan_name, plan_color, bg_color) = match plan {
+ Plan::Free => ("Free", Color::Default, free_chip_bg),
+ Plan::ZedProTrial => ("Pro Trial", Color::Accent, pro_chip_bg),
+ Plan::ZedPro => ("Pro", Color::Accent, pro_chip_bg),
+ };
+
+ h_flex()
+ .ml_1()
+ .px_1()
+ .rounded_sm()
+ .border_1()
+ .border_color(cx.theme().colors().border)
+ .bg(bg_color)
+ .overflow_hidden()
+ .child(
+ Label::new(plan_name.to_string())
+ .color(plan_color)
+ .size(LabelSize::XSmall)
+ .buffer_font(cx),
+ )
+ .into_any_element()
+ } else {
+ div().into_any_element()
+ }
+ }
+
fn render_context_servers_section(
&mut self,
window: &mut Window,