Skip to main content

telos_agent/tools/builtin/
mod.rs

1//! Built-in tools: shell, file read/write/edit, glob, grep.
2//!
3//! Each tool gates write access through [`PermissionDecision::Ask`](crate::PermissionDecision::Ask) so the
4//! host (typically a human approval prompt) keeps the final say. Read-only
5//! tools are marked concurrency-safe so they can run in parallel batches.
6
7use 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/// Default shell exposed to the model for shell-style commands.
73#[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    /// Choose the platform default for the current Rust target.
83    pub fn current_platform() -> Self {
84        Self::for_target_os(std::env::consts::OS)
85    }
86
87    /// Choose the platform default for a Rust `target_os` value.
88    pub fn for_target_os(target_os: &str) -> Self {
89        if target_os == "windows" { Self::PowerShell } else { Self::Bash }
90    }
91
92    /// Canonical tool name for this shell.
93    pub fn tool_name(self) -> &'static str {
94        match self {
95            Self::Bash => "Bash",
96            Self::PowerShell => "PowerShell",
97        }
98    }
99}
100
101/// Register every built-in tool with the current platform's default shell.
102pub fn register_core_tools(registry: &mut ToolRegistry) {
103    register_core_tools_with_shell(registry, DefaultShell::current_platform());
104}
105
106/// Register every built-in tool with an explicit default shell.
107pub 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
137/// Register task tracking tools with the supplied registry.
138pub 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
147/// Register memory tools with the supplied registry.
148pub 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
160/// Register the Skill tool if a skill registry is available.
161pub fn register_skill_tool(registry: &mut ToolRegistry, skill_registry: Arc<SkillRegistry>) {
162    registry.register(SkillTool::new(skill_registry));
163}
164
165// Re-export shared helpers that other crate modules use directly.
166pub(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};