mod batch_tool;mod code_action_tool;mod code_symbols_tool;mod contents_tool;mod copy_path_tool;mod create_directory_tool;mod create_file_tool;mod delete_path_tool;mod diagnostics_tool;mod fetch_tool;mod find_replace_file_tool;mod list_directory_tool;mod move_path_tool;mod now_tool;mod open_tool;mod path_search_tool;mod read_file_tool;mod regex_search_tool;mod rename_tool;mod replace;mod schema;mod symbol_info_tool;mod terminal_tool;mod thinking_tool;use std::sync::Arc;use assistant_tool::ToolRegistry;use copy_path_tool::CopyPathTool;use gpui::App;use http_client::HttpClientWithUrl;use move_path_tool::MovePathTool;use crate::batch_tool::BatchTool;use crate::code_action_tool::CodeActionTool;use crate::code_symbols_tool::CodeSymbolsTool;use crate::contents_tool::ContentsTool;use crate::create_directory_tool::CreateDirectoryTool;use crate::create_file_tool::CreateFileTool;use crate::delete_path_tool::DeletePathTool;use crate::diagnostics_tool::DiagnosticsTool;use crate::fetch_tool::FetchTool;use crate::find_replace_file_tool::FindReplaceFileTool;use crate::list_directory_tool::ListDirectoryTool;use crate::now_tool::NowTool;use crate::open_tool::OpenTool;use crate::path_search_tool::PathSearchTool;use crate::read_file_tool::ReadFileTool;use crate::regex_search_tool::RegexSearchTool;use crate::rename_tool::RenameTool;use crate::symbol_info_tool::SymbolInfoTool;use crate::terminal_tool::TerminalTool;use crate::thinking_tool::ThinkingTool;pub fn init(http_client: Arc<HttpClientWithUrl>, cx: &mut App) { assistant_tool::init(cx); let registry = ToolRegistry::global(cx); registry.register_tool(TerminalTool); registry.register_tool(BatchTool); registry.register_tool(CreateDirectoryTool); registry.register_tool(CreateFileTool); registry.register_tool(CopyPathTool); registry.register_tool(DeletePathTool); registry.register_tool(FindReplaceFileTool); registry.register_tool(SymbolInfoTool); registry.register_tool(CodeActionTool); registry.register_tool(MovePathTool); registry.register_tool(DiagnosticsTool); registry.register_tool(ListDirectoryTool); registry.register_tool(NowTool); registry.register_tool(OpenTool); registry.register_tool(CodeSymbolsTool); registry.register_tool(ContentsTool); registry.register_tool(PathSearchTool); registry.register_tool(ReadFileTool); registry.register_tool(RegexSearchTool); registry.register_tool(RenameTool); registry.register_tool(ThinkingTool); registry.register_tool(FetchTool::new(http_client));}#[cfg(test)]mod tests { use http_client::FakeHttpClient; use super::*; #[gpui::test] fn test_builtin_tool_schema_compatibility(cx: &mut App) { crate::init( Arc::new(http_client::HttpClientWithUrl::new( FakeHttpClient::with_200_response(), "https://zed.dev", None, )), cx, ); for tool in ToolRegistry::global(cx).tools() { let actual_schema = tool .input_schema(language_model::LanguageModelToolSchemaFormat::JsonSchemaSubset) .unwrap(); let mut expected_schema = actual_schema.clone(); assistant_tool::adapt_schema_to_format( &mut expected_schema, language_model::LanguageModelToolSchemaFormat::JsonSchemaSubset, ) .unwrap(); let error_message = format!( "Tool schema for `{}` is not compatible with `language_model::LanguageModelToolSchemaFormat::JsonSchemaSubset` (Gemini Models).\n\ Are you using `schema::json_schema_for<T>(format)` to generate the schema?", tool.name(), ); assert_eq!(actual_schema, expected_schema, "{}", error_message) } }}
mod batch_tool;
mod code_action_tool;
mod code_symbols_tool;
mod contents_tool;
mod copy_path_tool;
mod create_directory_tool;
mod create_file_tool;
mod delete_path_tool;
mod diagnostics_tool;
mod fetch_tool;
mod find_replace_file_tool;
mod list_directory_tool;
mod move_path_tool;
mod now_tool;
mod open_tool;
mod path_search_tool;
mod read_file_tool;
mod regex_search_tool;
mod rename_tool;
mod replace;
mod schema;
mod symbol_info_tool;
mod terminal_tool;
mod thinking_tool;
use std::sync::Arc;
use assistant_tool::ToolRegistry;
use copy_path_tool::CopyPathTool;
use gpui::App;
use http_client::HttpClientWithUrl;
use move_path_tool::MovePathTool;
use crate::batch_tool::BatchTool;
use crate::code_action_tool::CodeActionTool;
use crate::code_symbols_tool::CodeSymbolsTool;
use crate::contents_tool::ContentsTool;
use crate::create_directory_tool::CreateDirectoryTool;
use crate::create_file_tool::CreateFileTool;
use crate::delete_path_tool::DeletePathTool;
use crate::diagnostics_tool::DiagnosticsTool;
use crate::fetch_tool::FetchTool;
use crate::find_replace_file_tool::FindReplaceFileTool;
use crate::list_directory_tool::ListDirectoryTool;
use crate::now_tool::NowTool;
use crate::open_tool::OpenTool;
use crate::path_search_tool::PathSearchTool;
use crate::read_file_tool::ReadFileTool;
use crate::regex_search_tool::RegexSearchTool;
use crate::rename_tool::RenameTool;
use crate::symbol_info_tool::SymbolInfoTool;
use crate::terminal_tool::TerminalTool;
use crate::thinking_tool::ThinkingTool;
pub fn init(http_client: Arc<HttpClientWithUrl>, cx: &mut App) {
assistant_tool::init(cx);
let registry = ToolRegistry::global(cx);
registry.register_tool(TerminalTool);
registry.register_tool(BatchTool);
registry.register_tool(CreateDirectoryTool);
registry.register_tool(CreateFileTool);
registry.register_tool(CopyPathTool);
registry.register_tool(DeletePathTool);
registry.register_tool(FindReplaceFileTool);
registry.register_tool(SymbolInfoTool);
registry.register_tool(CodeActionTool);
registry.register_tool(MovePathTool);
registry.register_tool(DiagnosticsTool);
registry.register_tool(ListDirectoryTool);
registry.register_tool(NowTool);
registry.register_tool(OpenTool);
registry.register_tool(CodeSymbolsTool);
registry.register_tool(ContentsTool);
registry.register_tool(PathSearchTool);
registry.register_tool(ReadFileTool);
registry.register_tool(RegexSearchTool);
registry.register_tool(RenameTool);
registry.register_tool(ThinkingTool);
registry.register_tool(FetchTool::new(http_client));
}
#[cfg(test)]
mod tests {
use http_client::FakeHttpClient;
use super::*;
#[gpui::test]
fn test_builtin_tool_schema_compatibility(cx: &mut App) {
crate::init(
Arc::new(http_client::HttpClientWithUrl::new(
FakeHttpClient::with_200_response(),
"https://zed.dev",
None,
)),
cx,
);
for tool in ToolRegistry::global(cx).tools() {
let actual_schema = tool
.input_schema(language_model::LanguageModelToolSchemaFormat::JsonSchemaSubset)
.unwrap();
let mut expected_schema = actual_schema.clone();
assistant_tool::adapt_schema_to_format(
&mut expected_schema,
language_model::LanguageModelToolSchemaFormat::JsonSchemaSubset,
)
.unwrap();
let error_message = format!(
"Tool schema for `{}` is not compatible with `language_model::LanguageModelToolSchemaFormat::JsonSchemaSubset` (Gemini Models).\n\
Are you using `schema::json_schema_for<T>(format)` to generate the schema?",
tool.name(),
);
assert_eq!(actual_schema, expected_schema, "{}", error_message)
}
}
}