telos_agent/tools/builtin/
mod.rs1use std::sync::{Arc, Mutex};
8
9use serde::{Deserialize, Serialize};
10
11use crate::knowledge::skills::SkillRegistry;
12use crate::knowledge::tasks::TaskManager;
13use crate::tools::api::ToolRegistry;
14
15mod ask_user_question;
16pub(crate) mod browser;
17mod code_index;
18pub(crate) mod domain_filter;
19mod enter_plan_mode;
20mod exit_plan_mode;
21mod file_edit;
22mod file_read;
23mod file_write;
24mod glob;
25mod grep;
26mod memory;
27mod powershell;
28mod python;
29mod send_user_message;
30mod shared;
31mod shell;
32mod skill;
33mod tasks;
34mod team_create;
35mod team_delete;
36mod todo_write;
37mod web_fetch;
38pub(crate) mod web_search;
39
40pub use ask_user_question::AskUserQuestionTool;
41pub use browser::{
42 BrowserBackTool, BrowserClickTool, BrowserCloseTool, BrowserFindUrlTool, BrowserManager,
43 BrowserNavigateTool, BrowserScreenshotTool, BrowserScrollTool, BrowserSelectTool,
44 BrowserStartTool, BrowserStateTool, BrowserTypeTool,
45};
46pub use code_index::{CodeContextTool, CodeIndexRefreshTool, CodeSearchTool};
47pub use enter_plan_mode::EnterPlanModeTool;
48pub use exit_plan_mode::ExitPlanModeTool;
49pub use file_edit::FileEditTool;
50pub use file_read::FileReadTool;
51pub use file_write::FileWriteTool;
52pub use glob::GlobTool;
53pub use grep::GrepTool;
54pub use memory::{
55 MemoryEditTool, MemoryGrepTool, MemoryMaintenanceTool, MemoryReadTool, MemoryStatusTool,
56 MemoryWriteTool,
57};
58pub use powershell::PowerShellTool;
59pub use python::PythonScriptTool;
60pub use send_user_message::SendUserMessageTool;
61pub use shell::ShellTool;
62pub use skill::SkillTool;
63pub use tasks::{
64 TaskCreateTool, TaskGetTool, TaskListTool, TaskOutputTool, TaskStopTool, TaskUpdateTool,
65};
66pub use team_create::TeamCreateTool;
67pub use team_delete::TeamDeleteTool;
68pub use todo_write::TodoWriteTool;
69pub use web_fetch::WebFetchTool;
70pub use web_search::WebSearchTool;
71
72#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
74#[serde(rename_all = "kebab-case")]
75pub enum DefaultShell {
76 Bash,
77 #[serde(rename = "powershell")]
78 PowerShell,
79}
80
81impl DefaultShell {
82 pub fn current_platform() -> Self {
84 Self::for_target_os(std::env::consts::OS)
85 }
86
87 pub fn for_target_os(target_os: &str) -> Self {
89 if target_os == "windows" { Self::PowerShell } else { Self::Bash }
90 }
91
92 pub fn tool_name(self) -> &'static str {
94 match self {
95 Self::Bash => "Bash",
96 Self::PowerShell => "PowerShell",
97 }
98 }
99}
100
101pub fn register_core_tools(registry: &mut ToolRegistry) {
103 register_core_tools_with_shell(registry, DefaultShell::current_platform());
104}
105
106pub fn register_core_tools_with_shell(registry: &mut ToolRegistry, default_shell: DefaultShell) {
108 let browser_manager = BrowserManager::new();
109 match default_shell {
110 DefaultShell::Bash => registry.register(ShellTool),
111 DefaultShell::PowerShell => registry.register(PowerShellTool),
112 }
113 registry.register(FileReadTool);
114 registry.register(FileWriteTool);
115 registry.register(FileEditTool);
116 registry.register(GlobTool);
117 registry.register(GrepTool);
118 registry.register(CodeSearchTool);
119 registry.register(CodeContextTool);
120 registry.register(CodeIndexRefreshTool);
121 registry.register(WebFetchTool::new());
122 registry.register(WebSearchTool);
123 registry.register(PythonScriptTool);
124 registry.register(BrowserStartTool::new(browser_manager.clone()));
125 registry.register(BrowserNavigateTool::new(browser_manager.clone()));
126 registry.register(BrowserStateTool::new(browser_manager.clone()));
127 registry.register(BrowserClickTool::new(browser_manager.clone()));
128 registry.register(BrowserTypeTool::new(browser_manager.clone()));
129 registry.register(BrowserSelectTool::new(browser_manager.clone()));
130 registry.register(BrowserScrollTool::new(browser_manager.clone()));
131 registry.register(BrowserBackTool::new(browser_manager.clone()));
132 registry.register(BrowserScreenshotTool::new(browser_manager.clone()));
133 registry.register(BrowserCloseTool::new(browser_manager));
134 registry.register(BrowserFindUrlTool);
135}
136
137pub fn register_task_tools(registry: &mut ToolRegistry, task_manager: Arc<TaskManager>) {
139 registry.register(TaskCreateTool::new(task_manager.clone()));
140 registry.register(TaskGetTool::new(task_manager.clone()));
141 registry.register(TaskListTool::new(task_manager.clone()));
142 registry.register(TaskUpdateTool::new(task_manager.clone()));
143 registry.register(TaskOutputTool::new(task_manager.clone()));
144 registry.register(TaskStopTool::new(task_manager));
145}
146
147pub fn register_memory_tools(
149 registry: &mut ToolRegistry,
150 store: Arc<Mutex<crate::knowledge::memory::MemoryStore>>,
151) {
152 registry.register(MemoryReadTool::new(store.clone()));
153 registry.register(MemoryWriteTool::new(store.clone()));
154 registry.register(MemoryGrepTool::new(store.clone()));
155 registry.register(MemoryEditTool::new(store.clone()));
156 registry.register(MemoryStatusTool::new(store.clone()));
157 registry.register(MemoryMaintenanceTool::new(store));
158}
159
160pub fn register_skill_tool(registry: &mut ToolRegistry, skill_registry: Arc<SkillRegistry>) {
162 registry.register(SkillTool::new(skill_registry));
163}
164
165pub(crate) use shared::{
167 canonicalize_within_cwd, display_relative, ensure_file_was_read_and_unchanged,
168 modified_timestamp_ms, optional_bool, optional_usize_any, required_string, required_string_any,
169 resolve_workspace_path,
170};