agent2: Port edit_file
tool (#35844)
TODO: - [x] Authorization - [x] Restore tests Release Notes: - N/A --------- Co-authored-by: Antonio Scandurra <me@as-cii.com> Co-authored-by: Ben Brandt <benjamin.j.brandt@gmail.com>
This commit is contained in:
parent
d705585a2e
commit
2526dcb5a5
20 changed files with 2075 additions and 414 deletions
|
@ -1,6 +1,8 @@
|
|||
use crate::{AgentTool, ToolCallEventStream};
|
||||
use agent_client_protocol as acp;
|
||||
use anyhow::{anyhow, Result};
|
||||
use gpui::{App, AppContext, Entity, SharedString, Task};
|
||||
use language_model::LanguageModelToolResultContent;
|
||||
use project::Project;
|
||||
use schemars::JsonSchema;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
@ -8,8 +10,6 @@ use std::fmt::Write;
|
|||
use std::{cmp, path::PathBuf, sync::Arc};
|
||||
use util::paths::PathMatcher;
|
||||
|
||||
use crate::{AgentTool, ToolCallEventStream};
|
||||
|
||||
/// Fast file path pattern matching tool that works with any codebase size
|
||||
///
|
||||
/// - Supports glob patterns like "**/*.js" or "src/**/*.ts"
|
||||
|
@ -39,8 +39,35 @@ pub struct FindPathToolInput {
|
|||
}
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize)]
|
||||
struct FindPathToolOutput {
|
||||
paths: Vec<PathBuf>,
|
||||
pub struct FindPathToolOutput {
|
||||
offset: usize,
|
||||
current_matches_page: Vec<PathBuf>,
|
||||
all_matches_len: usize,
|
||||
}
|
||||
|
||||
impl From<FindPathToolOutput> for LanguageModelToolResultContent {
|
||||
fn from(output: FindPathToolOutput) -> Self {
|
||||
if output.current_matches_page.is_empty() {
|
||||
"No matches found".into()
|
||||
} else {
|
||||
let mut llm_output = format!("Found {} total matches.", output.all_matches_len);
|
||||
if output.all_matches_len > RESULTS_PER_PAGE {
|
||||
write!(
|
||||
&mut llm_output,
|
||||
"\nShowing results {}-{} (provide 'offset' parameter for more results):",
|
||||
output.offset + 1,
|
||||
output.offset + output.current_matches_page.len()
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
for mat in output.current_matches_page {
|
||||
write!(&mut llm_output, "\n{}", mat.display()).unwrap();
|
||||
}
|
||||
|
||||
llm_output.into()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const RESULTS_PER_PAGE: usize = 50;
|
||||
|
@ -57,6 +84,7 @@ impl FindPathTool {
|
|||
|
||||
impl AgentTool for FindPathTool {
|
||||
type Input = FindPathToolInput;
|
||||
type Output = FindPathToolOutput;
|
||||
|
||||
fn name(&self) -> SharedString {
|
||||
"find_path".into()
|
||||
|
@ -75,7 +103,7 @@ impl AgentTool for FindPathTool {
|
|||
input: Self::Input,
|
||||
event_stream: ToolCallEventStream,
|
||||
cx: &mut App,
|
||||
) -> Task<Result<String>> {
|
||||
) -> Task<Result<FindPathToolOutput>> {
|
||||
let search_paths_task = search_paths(&input.glob, self.project.clone(), cx);
|
||||
|
||||
cx.background_spawn(async move {
|
||||
|
@ -113,26 +141,11 @@ impl AgentTool for FindPathTool {
|
|||
..Default::default()
|
||||
});
|
||||
|
||||
if matches.is_empty() {
|
||||
Ok("No matches found".into())
|
||||
} else {
|
||||
let mut message = format!("Found {} total matches.", matches.len());
|
||||
if matches.len() > RESULTS_PER_PAGE {
|
||||
write!(
|
||||
&mut message,
|
||||
"\nShowing results {}-{} (provide 'offset' parameter for more results):",
|
||||
input.offset + 1,
|
||||
input.offset + paginated_matches.len()
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
for mat in matches.iter().skip(input.offset).take(RESULTS_PER_PAGE) {
|
||||
write!(&mut message, "\n{}", mat.display()).unwrap();
|
||||
}
|
||||
|
||||
Ok(message)
|
||||
}
|
||||
Ok(FindPathToolOutput {
|
||||
offset: input.offset,
|
||||
current_matches_page: paginated_matches.to_vec(),
|
||||
all_matches_len: matches.len(),
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue