mod fs;
mod policy;
mod shell;
#[cfg(feature = "web-tools")]
mod web;
use std::sync::Arc;
use serde_json::Value;
use crate::models::ToolResult;
use crate::tool::Tool;
pub use fs::{EditFileTool, ListDirTool, PatchFileTool, ReadFileTool, SearchTool, WriteFileTool};
pub use policy::{
DEFAULT_USER_AGENT, ToolPolicy, WebFormat, WebPolicy, normalize_path, resolve_for_containment,
};
pub use shell::ShellTool;
#[cfg(feature = "web-tools")]
pub use web::{FetchWebpageTool, fetch_text};
pub fn tool_result(content: impl Into<String>) -> ToolResult {
ToolResult {
content: content.into(),
is_error: false,
}
}
pub fn tool_error(msg: impl Into<String>) -> ToolResult {
ToolResult {
content: msg.into(),
is_error: true,
}
}
pub(crate) fn req_str<'a>(args: &'a Value, key: &str) -> Option<&'a str> {
args[key].as_str()
}
pub fn register_all_tools() -> Vec<Arc<dyn Tool>> {
register_all_tools_with_policy(Arc::new(ToolPolicy::default()))
}
pub fn register_all_tools_with_policy(policy: Arc<ToolPolicy>) -> Vec<Arc<dyn Tool>> {
#[cfg_attr(not(feature = "web-tools"), allow(unused_mut))]
let mut tools: Vec<Arc<dyn Tool>> = vec![
Arc::new(ReadFileTool::new(Arc::clone(&policy))),
Arc::new(ListDirTool::new(Arc::clone(&policy))),
Arc::new(SearchTool::new(Arc::clone(&policy))),
Arc::new(EditFileTool::new(Arc::clone(&policy))),
Arc::new(WriteFileTool::new(Arc::clone(&policy))),
Arc::new(PatchFileTool::new(Arc::clone(&policy))),
Arc::new(ShellTool::new(Arc::clone(&policy))),
];
#[cfg(feature = "web-tools")]
tools.push(Arc::new(FetchWebpageTool::new(Arc::clone(&policy))));
tools
}