use anyhow::{anyhow, Result}; use assistant_slash_command::{ ArgumentCompletion, SlashCommand, SlashCommandOutput, SlashCommandOutputSection, SlashCommandResult, }; use gpui::{Task, WeakEntity}; use language::{BufferSnapshot, LspAdapterDelegate}; use prompt_store::PromptStore; use std::{ fmt::Write, sync::{atomic::AtomicBool, Arc}, }; use ui::prelude::*; use workspace::Workspace; pub struct DefaultSlashCommand; impl SlashCommand for DefaultSlashCommand { fn name(&self) -> String { "default".into() } fn description(&self) -> String { "Insert default prompt".into() } fn menu_text(&self) -> String { self.description() } fn requires_argument(&self) -> bool { false } fn complete_argument( self: Arc, _arguments: &[String], _cancellation_flag: Arc, _workspace: Option>, _window: &mut Window, _cx: &mut App, ) -> Task>> { Task::ready(Err(anyhow!("this command does not require argument"))) } fn run( self: Arc, _arguments: &[String], _context_slash_command_output_sections: &[SlashCommandOutputSection], _context_buffer: BufferSnapshot, _workspace: WeakEntity, _delegate: Option>, _window: &mut Window, cx: &mut App, ) -> Task { let store = PromptStore::global(cx); cx.background_spawn(async move { let store = store.await?; let prompts = store.default_prompt_metadata(); let mut text = String::new(); text.push('\n'); for prompt in prompts { if let Some(title) = prompt.title { writeln!(text, "/prompt {}", title).unwrap(); } } text.pop(); if text.is_empty() { text.push('\n'); } if !text.ends_with('\n') { text.push('\n'); } Ok(SlashCommandOutput { sections: vec![SlashCommandOutputSection { range: 0..text.len(), icon: IconName::Library, label: "Default".into(), metadata: None, }], text, run_commands_in_text: true, } .to_event_stream()) }) } }