From a1077c6fff827a4d792acfc7f67b173fdb19d33e Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Wed, 22 Jan 2025 17:53:54 -0500 Subject: [PATCH] assistant2: Add button to open the prompt library (#23500) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR adds a button to open the prompt library from the configuration view in Assistant2. Screenshot 2025-01-22 at 5 38 08 PM Release Notes: - N/A --- crates/assistant/src/assistant.rs | 1 - crates/assistant/src/assistant_panel.rs | 5 +- .../assistant2/src/assistant_configuration.rs | 16 ++++- crates/assistant2/src/assistant_panel.rs | 63 +++++++++++++++++-- crates/zed_actions/src/lib.rs | 2 +- 5 files changed, 76 insertions(+), 11 deletions(-) diff --git a/crates/assistant/src/assistant.rs b/crates/assistant/src/assistant.rs index 63850af335..7d291e0643 100644 --- a/crates/assistant/src/assistant.rs +++ b/crates/assistant/src/assistant.rs @@ -33,7 +33,6 @@ actions!( [ InsertActivePrompt, DeployHistory, - DeployPromptLibrary, NewContext, CycleNextInlineAssist, CyclePreviousInlineAssist diff --git a/crates/assistant/src/assistant_panel.rs b/crates/assistant/src/assistant_panel.rs index ede925a960..e5c3c76180 100644 --- a/crates/assistant/src/assistant_panel.rs +++ b/crates/assistant/src/assistant_panel.rs @@ -1,7 +1,6 @@ use crate::assistant_configuration::{ConfigurationView, ConfigurationViewEvent}; use crate::{ - terminal_inline_assistant::TerminalInlineAssistant, DeployHistory, DeployPromptLibrary, - InlineAssistant, NewContext, + terminal_inline_assistant::TerminalInlineAssistant, DeployHistory, InlineAssistant, NewContext, }; use anyhow::{anyhow, Result}; use assistant_context_editor::{ @@ -38,7 +37,7 @@ use workspace::{ dock::{DockPosition, Panel, PanelEvent}, pane, DraggedSelection, Pane, ShowConfiguration, ToggleZoom, Workspace, }; -use zed_actions::assistant::{InlineAssist, ToggleFocus}; +use zed_actions::assistant::{DeployPromptLibrary, InlineAssist, ToggleFocus}; pub fn init(cx: &mut AppContext) { workspace::FollowableViewRegistry::register::(cx); diff --git a/crates/assistant2/src/assistant_configuration.rs b/crates/assistant2/src/assistant_configuration.rs index a69a5fa415..e44fa1833f 100644 --- a/crates/assistant2/src/assistant_configuration.rs +++ b/crates/assistant2/src/assistant_configuration.rs @@ -1,9 +1,10 @@ use std::sync::Arc; use collections::HashMap; -use gpui::{AnyView, AppContext, EventEmitter, FocusHandle, FocusableView, Subscription}; +use gpui::{Action, AnyView, AppContext, EventEmitter, FocusHandle, FocusableView, Subscription}; use language_model::{LanguageModelProvider, LanguageModelProviderId, LanguageModelRegistry}; use ui::{prelude::*, ElevationIndex}; +use zed_actions::assistant::DeployPromptLibrary; pub struct AssistantConfiguration { focus_handle: FocusHandle, @@ -143,6 +144,19 @@ impl Render for AssistantConfiguration { .bg(cx.theme().colors().editor_background) .size_full() .overflow_y_scroll() + .child( + h_flex().p(DynamicSpacing::Base16.rems(cx)).child( + Button::new("open-prompt-library", "Open Prompt Library") + .style(ButtonStyle::Filled) + .full_width() + .icon(IconName::Book) + .icon_size(IconSize::Small) + .icon_position(IconPosition::Start) + .on_click(|_event, cx| { + cx.dispatch_action(DeployPromptLibrary.boxed_clone()) + }), + ), + ) .child( v_flex() .p(DynamicSpacing::Base16.rems(cx)) diff --git a/crates/assistant2/src/assistant_panel.rs b/crates/assistant2/src/assistant_panel.rs index 67a6da3ef1..fefbc49c4d 100644 --- a/crates/assistant2/src/assistant_panel.rs +++ b/crates/assistant2/src/assistant_panel.rs @@ -4,28 +4,30 @@ use std::sync::Arc; use anyhow::{anyhow, Result}; use assistant_context_editor::{ make_lsp_adapter_delegate, AssistantPanelDelegate, ContextEditor, ContextHistory, + SlashCommandCompletionProvider, }; use assistant_settings::{AssistantDockPosition, AssistantSettings}; use assistant_slash_command::SlashCommandWorkingSet; use assistant_tool::ToolWorkingSet; use client::zed_urls; +use editor::Editor; use fs::Fs; use gpui::{ prelude::*, px, svg, Action, AnyElement, AppContext, AsyncWindowContext, Corner, EventEmitter, - FocusHandle, FocusableView, FontWeight, Model, Pixels, Subscription, Task, View, ViewContext, - WeakView, WindowContext, + FocusHandle, FocusableView, FontWeight, Model, Pixels, Subscription, Task, UpdateGlobal, View, + ViewContext, WeakView, WindowContext, }; use language::LanguageRegistry; use language_model::LanguageModelRegistry; use project::Project; -use prompt_library::PromptBuilder; +use prompt_library::{open_prompt_library, PromptBuilder, PromptLibrary}; use settings::{update_settings_file, Settings}; use time::UtcOffset; use ui::{prelude::*, ContextMenu, KeyBinding, PopoverMenu, PopoverMenuHandle, Tab, Tooltip}; use util::ResultExt as _; use workspace::dock::{DockPosition, Panel, PanelEvent}; use workspace::Workspace; -use zed_actions::assistant::ToggleFocus; +use zed_actions::assistant::{DeployPromptLibrary, ToggleFocus}; use crate::active_thread::ActiveThread; use crate::assistant_configuration::{AssistantConfiguration, AssistantConfigurationEvent}; @@ -33,7 +35,10 @@ use crate::message_editor::MessageEditor; use crate::thread::{Thread, ThreadError, ThreadId}; use crate::thread_history::{PastThread, ThreadHistory}; use crate::thread_store::ThreadStore; -use crate::{NewPromptEditor, NewThread, OpenConfiguration, OpenHistory, OpenPromptEditorHistory}; +use crate::{ + InlineAssistant, NewPromptEditor, NewThread, OpenConfiguration, OpenHistory, + OpenPromptEditorHistory, +}; pub fn init(cx: &mut AppContext) { cx.observe_new_views( @@ -280,6 +285,22 @@ impl AssistantPanel { } } + fn deploy_prompt_library(&mut self, _: &DeployPromptLibrary, cx: &mut ViewContext) { + open_prompt_library( + self.language_registry.clone(), + Box::new(PromptLibraryInlineAssist::new(self.workspace.clone())), + Arc::new(|| { + Box::new(SlashCommandCompletionProvider::new( + Arc::new(SlashCommandWorkingSet::default()), + None, + None, + )) + }), + cx, + ) + .detach_and_log_err(cx); + } + fn open_history(&mut self, cx: &mut ViewContext) { self.active_view = ActiveView::History; self.history.focus_handle(cx).focus(cx); @@ -857,6 +878,7 @@ impl Render for AssistantPanel { .on_action(cx.listener(|this, _: &OpenHistory, cx| { this.open_history(cx); })) + .on_action(cx.listener(Self::deploy_prompt_library)) .child(self.render_toolbar(cx)) .map(|parent| match self.active_view { ActiveView::Thread => parent @@ -876,6 +898,37 @@ impl Render for AssistantPanel { } } +struct PromptLibraryInlineAssist { + workspace: WeakView, +} + +impl PromptLibraryInlineAssist { + pub fn new(workspace: WeakView) -> Self { + Self { workspace } + } +} + +impl prompt_library::InlineAssistDelegate for PromptLibraryInlineAssist { + fn assist( + &self, + prompt_editor: &View, + _initial_prompt: Option, + cx: &mut ViewContext, + ) { + InlineAssistant::update_global(cx, |assistant, cx| { + assistant.assist(&prompt_editor, self.workspace.clone(), None, cx) + }) + } + + fn focus_assistant_panel( + &self, + workspace: &mut Workspace, + cx: &mut ViewContext, + ) -> bool { + workspace.focus_panel::(cx).is_some() + } +} + pub struct ConcreteAssistantPanelDelegate; impl AssistantPanelDelegate for ConcreteAssistantPanelDelegate { diff --git a/crates/zed_actions/src/lib.rs b/crates/zed_actions/src/lib.rs index 3fc157102c..6478376384 100644 --- a/crates/zed_actions/src/lib.rs +++ b/crates/zed_actions/src/lib.rs @@ -82,7 +82,7 @@ pub mod assistant { use schemars::JsonSchema; use serde::Deserialize; - actions!(assistant, [ToggleFocus]); + actions!(assistant, [ToggleFocus, DeployPromptLibrary]); #[derive(Clone, Default, Deserialize, PartialEq, JsonSchema)] pub struct InlineAssist {