assistant: Remove /search
(#27661)
This PR removes the `/search` command. This was feature-flagged and was never released to the general public. Release Notes: - N/A
This commit is contained in:
parent
20eab9038f
commit
68d453da52
6 changed files with 0 additions and 226 deletions
3
Cargo.lock
generated
3
Cargo.lock
generated
|
@ -413,7 +413,6 @@ dependencies = [
|
||||||
"menu",
|
"menu",
|
||||||
"multi_buffer",
|
"multi_buffer",
|
||||||
"parking_lot",
|
"parking_lot",
|
||||||
"paths",
|
|
||||||
"pretty_assertions",
|
"pretty_assertions",
|
||||||
"project",
|
"project",
|
||||||
"prompt_library",
|
"prompt_library",
|
||||||
|
@ -423,7 +422,6 @@ dependencies = [
|
||||||
"rope",
|
"rope",
|
||||||
"schemars",
|
"schemars",
|
||||||
"search",
|
"search",
|
||||||
"semantic_index",
|
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json_lenient",
|
"serde_json_lenient",
|
||||||
"settings",
|
"settings",
|
||||||
|
@ -675,7 +673,6 @@ dependencies = [
|
||||||
"project",
|
"project",
|
||||||
"prompt_store",
|
"prompt_store",
|
||||||
"rope",
|
"rope",
|
||||||
"semantic_index",
|
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"settings",
|
"settings",
|
||||||
|
|
|
@ -48,7 +48,6 @@ lsp.workspace = true
|
||||||
menu.workspace = true
|
menu.workspace = true
|
||||||
multi_buffer.workspace = true
|
multi_buffer.workspace = true
|
||||||
parking_lot.workspace = true
|
parking_lot.workspace = true
|
||||||
paths.workspace = true
|
|
||||||
project.workspace = true
|
project.workspace = true
|
||||||
prompt_library.workspace = true
|
prompt_library.workspace = true
|
||||||
prompt_store.workspace = true
|
prompt_store.workspace = true
|
||||||
|
@ -56,7 +55,6 @@ proto.workspace = true
|
||||||
rope.workspace = true
|
rope.workspace = true
|
||||||
schemars.workspace = true
|
schemars.workspace = true
|
||||||
search.workspace = true
|
search.workspace = true
|
||||||
semantic_index.workspace = true
|
|
||||||
serde.workspace = true
|
serde.workspace = true
|
||||||
settings.workspace = true
|
settings.workspace = true
|
||||||
smol.workspace = true
|
smol.workspace = true
|
||||||
|
|
|
@ -10,7 +10,6 @@ use std::sync::Arc;
|
||||||
|
|
||||||
use assistant_settings::AssistantSettings;
|
use assistant_settings::AssistantSettings;
|
||||||
use assistant_slash_command::SlashCommandRegistry;
|
use assistant_slash_command::SlashCommandRegistry;
|
||||||
use assistant_slash_commands::SearchSlashCommandFeatureFlag;
|
|
||||||
use client::Client;
|
use client::Client;
|
||||||
use command_palette_hooks::CommandPaletteFilter;
|
use command_palette_hooks::CommandPaletteFilter;
|
||||||
use feature_flags::FeatureFlagAppExt;
|
use feature_flags::FeatureFlagAppExt;
|
||||||
|
@ -20,7 +19,6 @@ use language_model::{
|
||||||
LanguageModelId, LanguageModelProviderId, LanguageModelRegistry, LanguageModelResponseMessage,
|
LanguageModelId, LanguageModelProviderId, LanguageModelRegistry, LanguageModelResponseMessage,
|
||||||
};
|
};
|
||||||
use prompt_store::PromptBuilder;
|
use prompt_store::PromptBuilder;
|
||||||
use semantic_index::{CloudEmbeddingProvider, SemanticDb};
|
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use settings::{Settings, SettingsStore};
|
use settings::{Settings, SettingsStore};
|
||||||
|
|
||||||
|
@ -102,30 +100,6 @@ pub fn init(
|
||||||
AssistantSettings::register(cx);
|
AssistantSettings::register(cx);
|
||||||
SlashCommandSettings::register(cx);
|
SlashCommandSettings::register(cx);
|
||||||
|
|
||||||
cx.spawn({
|
|
||||||
let client = client.clone();
|
|
||||||
async move |cx| {
|
|
||||||
let is_search_slash_command_enabled = cx
|
|
||||||
.update(|cx| cx.wait_for_flag::<SearchSlashCommandFeatureFlag>())?
|
|
||||||
.await;
|
|
||||||
|
|
||||||
if !is_search_slash_command_enabled {
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
|
|
||||||
let embedding_provider = CloudEmbeddingProvider::new(client.clone());
|
|
||||||
let semantic_index = SemanticDb::new(
|
|
||||||
paths::embeddings_dir().join("semantic-index-db.0.mdb"),
|
|
||||||
Arc::new(embedding_provider),
|
|
||||||
cx,
|
|
||||||
)
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
cx.update(|cx| cx.set_global(semantic_index))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.detach();
|
|
||||||
|
|
||||||
assistant_context_editor::init(client.clone(), cx);
|
assistant_context_editor::init(client.clone(), cx);
|
||||||
prompt_library::init(cx);
|
prompt_library::init(cx);
|
||||||
init_language_model_settings(cx);
|
init_language_model_settings(cx);
|
||||||
|
@ -244,17 +218,6 @@ fn register_slash_commands(cx: &mut App) {
|
||||||
update_slash_commands_from_settings(cx);
|
update_slash_commands_from_settings(cx);
|
||||||
cx.observe_global::<SettingsStore>(update_slash_commands_from_settings)
|
cx.observe_global::<SettingsStore>(update_slash_commands_from_settings)
|
||||||
.detach();
|
.detach();
|
||||||
|
|
||||||
cx.observe_flag::<assistant_slash_commands::SearchSlashCommandFeatureFlag, _>({
|
|
||||||
let slash_command_registry = slash_command_registry.clone();
|
|
||||||
move |is_enabled, _cx| {
|
|
||||||
if is_enabled {
|
|
||||||
slash_command_registry
|
|
||||||
.register_command(assistant_slash_commands::SearchSlashCommand, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.detach();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_slash_commands_from_settings(cx: &mut App) {
|
fn update_slash_commands_from_settings(cx: &mut App) {
|
||||||
|
|
|
@ -32,7 +32,6 @@ language.workspace = true
|
||||||
project.workspace = true
|
project.workspace = true
|
||||||
prompt_store.workspace = true
|
prompt_store.workspace = true
|
||||||
rope.workspace = true
|
rope.workspace = true
|
||||||
semantic_index.workspace = true
|
|
||||||
serde.workspace = true
|
serde.workspace = true
|
||||||
serde_json.workspace = true
|
serde_json.workspace = true
|
||||||
smol.workspace = true
|
smol.workspace = true
|
||||||
|
|
|
@ -8,7 +8,6 @@ mod fetch_command;
|
||||||
mod file_command;
|
mod file_command;
|
||||||
mod now_command;
|
mod now_command;
|
||||||
mod prompt_command;
|
mod prompt_command;
|
||||||
mod search_command;
|
|
||||||
mod selection_command;
|
mod selection_command;
|
||||||
mod streaming_example_command;
|
mod streaming_example_command;
|
||||||
mod symbols_command;
|
mod symbols_command;
|
||||||
|
@ -29,7 +28,6 @@ pub use crate::fetch_command::*;
|
||||||
pub use crate::file_command::*;
|
pub use crate::file_command::*;
|
||||||
pub use crate::now_command::*;
|
pub use crate::now_command::*;
|
||||||
pub use crate::prompt_command::*;
|
pub use crate::prompt_command::*;
|
||||||
pub use crate::search_command::*;
|
|
||||||
pub use crate::selection_command::*;
|
pub use crate::selection_command::*;
|
||||||
pub use crate::streaming_example_command::*;
|
pub use crate::streaming_example_command::*;
|
||||||
pub use crate::symbols_command::*;
|
pub use crate::symbols_command::*;
|
||||||
|
|
|
@ -1,181 +0,0 @@
|
||||||
use anyhow::Result;
|
|
||||||
use assistant_slash_command::{
|
|
||||||
ArgumentCompletion, SlashCommand, SlashCommandOutput, SlashCommandOutputSection,
|
|
||||||
SlashCommandResult,
|
|
||||||
};
|
|
||||||
use feature_flags::FeatureFlag;
|
|
||||||
use gpui::{App, Task, WeakEntity};
|
|
||||||
use language::{CodeLabel, LspAdapterDelegate};
|
|
||||||
use semantic_index::{LoadedSearchResult, SemanticDb};
|
|
||||||
use std::{
|
|
||||||
fmt::Write,
|
|
||||||
sync::{atomic::AtomicBool, Arc},
|
|
||||||
};
|
|
||||||
use ui::{prelude::*, IconName};
|
|
||||||
use workspace::Workspace;
|
|
||||||
|
|
||||||
use crate::create_label_for_command;
|
|
||||||
use crate::file_command::{build_entry_output_section, codeblock_fence_for_path};
|
|
||||||
|
|
||||||
pub struct SearchSlashCommandFeatureFlag;
|
|
||||||
|
|
||||||
impl FeatureFlag for SearchSlashCommandFeatureFlag {
|
|
||||||
const NAME: &'static str = "search-slash-command";
|
|
||||||
|
|
||||||
fn enabled_for_staff() -> bool {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct SearchSlashCommand;
|
|
||||||
|
|
||||||
impl SlashCommand for SearchSlashCommand {
|
|
||||||
fn name(&self) -> String {
|
|
||||||
"search".into()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn label(&self, cx: &App) -> CodeLabel {
|
|
||||||
create_label_for_command("search", &["--n"], cx)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn description(&self) -> String {
|
|
||||||
"Search your project semantically".into()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn icon(&self) -> IconName {
|
|
||||||
IconName::SearchCode
|
|
||||||
}
|
|
||||||
|
|
||||||
fn menu_text(&self) -> String {
|
|
||||||
self.description()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn requires_argument(&self) -> bool {
|
|
||||||
true
|
|
||||||
}
|
|
||||||
|
|
||||||
fn complete_argument(
|
|
||||||
self: Arc<Self>,
|
|
||||||
_arguments: &[String],
|
|
||||||
_cancel: Arc<AtomicBool>,
|
|
||||||
_workspace: Option<WeakEntity<Workspace>>,
|
|
||||||
_window: &mut Window,
|
|
||||||
_cx: &mut App,
|
|
||||||
) -> Task<Result<Vec<ArgumentCompletion>>> {
|
|
||||||
Task::ready(Ok(Vec::new()))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn run(
|
|
||||||
self: Arc<Self>,
|
|
||||||
arguments: &[String],
|
|
||||||
_context_slash_command_output_sections: &[SlashCommandOutputSection<language::Anchor>],
|
|
||||||
_context_buffer: language::BufferSnapshot,
|
|
||||||
workspace: WeakEntity<Workspace>,
|
|
||||||
_delegate: Option<Arc<dyn LspAdapterDelegate>>,
|
|
||||||
window: &mut Window,
|
|
||||||
cx: &mut App,
|
|
||||||
) -> Task<SlashCommandResult> {
|
|
||||||
let Some(workspace) = workspace.upgrade() else {
|
|
||||||
return Task::ready(Err(anyhow::anyhow!("workspace was dropped")));
|
|
||||||
};
|
|
||||||
if arguments.is_empty() {
|
|
||||||
return Task::ready(Err(anyhow::anyhow!("missing search query")));
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut limit = None;
|
|
||||||
let mut query = String::new();
|
|
||||||
for part in arguments {
|
|
||||||
if let Some(parameter) = part.strip_prefix("--") {
|
|
||||||
if let Ok(count) = parameter.parse::<usize>() {
|
|
||||||
limit = Some(count);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
query.push_str(part);
|
|
||||||
query.push(' ');
|
|
||||||
}
|
|
||||||
query.pop();
|
|
||||||
|
|
||||||
if query.is_empty() {
|
|
||||||
return Task::ready(Err(anyhow::anyhow!("missing search query")));
|
|
||||||
}
|
|
||||||
|
|
||||||
let project = workspace.read(cx).project().clone();
|
|
||||||
let fs = project.read(cx).fs().clone();
|
|
||||||
let Some(project_index) =
|
|
||||||
cx.update_global(|index: &mut SemanticDb, cx| index.project_index(project, cx))
|
|
||||||
else {
|
|
||||||
return Task::ready(Err(anyhow::anyhow!("no project indexer")));
|
|
||||||
};
|
|
||||||
|
|
||||||
window.spawn(cx, async move |cx| {
|
|
||||||
let results = project_index
|
|
||||||
.read_with(cx, |project_index, cx| {
|
|
||||||
project_index.search(vec![query.clone()], limit.unwrap_or(5), cx)
|
|
||||||
})?
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
let loaded_results = SemanticDb::load_results(results, &fs, &cx).await?;
|
|
||||||
|
|
||||||
let output = cx
|
|
||||||
.background_spawn(async move {
|
|
||||||
let mut text = format!("Search results for {query}:\n");
|
|
||||||
let mut sections = Vec::new();
|
|
||||||
for loaded_result in &loaded_results {
|
|
||||||
add_search_result_section(loaded_result, &mut text, &mut sections);
|
|
||||||
}
|
|
||||||
|
|
||||||
let query = SharedString::from(query);
|
|
||||||
sections.push(SlashCommandOutputSection {
|
|
||||||
range: 0..text.len(),
|
|
||||||
icon: IconName::MagnifyingGlass,
|
|
||||||
label: query,
|
|
||||||
metadata: None,
|
|
||||||
});
|
|
||||||
|
|
||||||
SlashCommandOutput {
|
|
||||||
text,
|
|
||||||
sections,
|
|
||||||
run_commands_in_text: false,
|
|
||||||
}
|
|
||||||
.to_event_stream()
|
|
||||||
})
|
|
||||||
.await;
|
|
||||||
|
|
||||||
Ok(output)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn add_search_result_section(
|
|
||||||
loaded_result: &LoadedSearchResult,
|
|
||||||
text: &mut String,
|
|
||||||
sections: &mut Vec<SlashCommandOutputSection<usize>>,
|
|
||||||
) {
|
|
||||||
let LoadedSearchResult {
|
|
||||||
path,
|
|
||||||
full_path,
|
|
||||||
excerpt_content,
|
|
||||||
row_range,
|
|
||||||
..
|
|
||||||
} = loaded_result;
|
|
||||||
let section_start_ix = text.len();
|
|
||||||
text.push_str(&codeblock_fence_for_path(
|
|
||||||
Some(&path),
|
|
||||||
Some(row_range.clone()),
|
|
||||||
));
|
|
||||||
|
|
||||||
text.push_str(&excerpt_content);
|
|
||||||
if !text.ends_with('\n') {
|
|
||||||
text.push('\n');
|
|
||||||
}
|
|
||||||
writeln!(text, "```\n").unwrap();
|
|
||||||
let section_end_ix = text.len() - 1;
|
|
||||||
sections.push(build_entry_output_section(
|
|
||||||
section_start_ix..section_end_ix,
|
|
||||||
Some(&full_path),
|
|
||||||
false,
|
|
||||||
Some(row_range.start() + 1..row_range.end() + 1),
|
|
||||||
));
|
|
||||||
}
|
|
Loading…
Add table
Add a link
Reference in a new issue