1pub mod core;
38pub mod llm;
39pub mod state;
40pub mod tools;
41
42pub use core::{Tool, ToolArgs, ToolRegistry, ToolResult};
44
45pub use state::{FileState, StateSnapshot, ToolState};
47
48#[cfg(feature = "old")]
50pub use tools::old::{
51 CopyPathTool, CreateDirectoryTool, CreateFileTool, DeleteFunctionTool, DeleteLineTool,
53 DeletePathTool, DeleteTextTool, InsertTextTool, MovePathTool, OverwriteFileTool,
54 ReplaceTextTool,
55 RunCommandTool,
57 CreateTool, GotoTool, OpenTool, ScrollTool, WindowedFile,
59 ConfigurableFilter, FindFileTool, SearchDirTool, SearchFileTool,
61 StateTool,
63 ClassifyTaskTool, CountTokensTool, FilemapTool, SubmitTool,
65};
66
67#[cfg(feature = "opencode")]
69pub use tools::opencode::{
70 BashTool, EditTool, GlobTool, GrepTool, ListTool, MultiEditTool, ReadTool, TodoReadTool,
71 TodoWriteTool, WebFetchTool, WebSearchTool, WriteTool,
72};
73
74pub use llm::{
76 assistant::{generate_assistant_content, ToolCallInfo},
77 converter::json_to_tool_args,
78 executor::{
79 execute_tool_calls, execute_tool_calls_structured, ExecutionCallback, NoOpCallback,
80 ToolCallRequest, ToolExecutionResult,
81 },
82 result_handler::{handle_large_result, ResultHandlerConfig},
83};
84
85#[cfg(all(feature = "old", not(feature = "opencode")))]
87pub use tools::old::{create_tool_registry, create_tool_registry_with_open_window_size};
88
89#[cfg(feature = "opencode")]
90pub use tools::opencode::{create_tool_registry, create_tool_registry_with_open_window_size};
91
92#[cfg(all(test, feature = "old", not(feature = "opencode")))]
93mod tests {
94 use super::*;
95
96 #[test]
97 fn test_registry_creation() {
98 let registry = create_tool_registry();
99
100 let tool_names = registry.list_tools();
102
103 assert!(tool_names.contains(&"open".to_string()));
105 assert!(tool_names.contains(&"goto".to_string()));
106 assert!(tool_names.contains(&"scroll_up".to_string()));
107 assert!(tool_names.contains(&"scroll_down".to_string()));
108 assert!(tool_names.contains(&"create".to_string()));
109
110 assert!(tool_names.contains(&"run_command".to_string()));
112
113 assert!(tool_names.contains(&"find_file".to_string()));
115 assert!(tool_names.contains(&"search_file".to_string()));
116 assert!(tool_names.contains(&"search_dir".to_string()));
117
118 assert!(tool_names.contains(&"create_file".to_string()));
120 assert!(tool_names.contains(&"replace_text".to_string()));
121 assert!(tool_names.contains(&"insert_text".to_string()));
122 assert!(tool_names.contains(&"delete_text".to_string()));
123 assert!(tool_names.contains(&"delete_line".to_string()));
124 assert!(tool_names.contains(&"overwrite_file".to_string()));
125
126 assert!(tool_names.contains(&"delete_path".to_string()));
128 assert!(tool_names.contains(&"move_path".to_string()));
129 assert!(tool_names.contains(&"copy_path".to_string()));
130 assert!(tool_names.contains(&"create_directory".to_string()));
131
132 assert!(tool_names.contains(&"_state".to_string()));
134 assert!(tool_names.contains(&"count_tokens".to_string()));
135 assert!(tool_names.contains(&"filemap".to_string()));
136 assert!(tool_names.contains(&"submit".to_string()));
137 assert!(tool_names.contains(&"classify_task".to_string()));
138 }
139}
140
141#[cfg(all(test, feature = "opencode"))]
142mod opencode_tests {
143 use super::*;
144
145 #[test]
146 fn test_opencode_registry_creation() {
147 let registry = create_tool_registry();
148
149 let tool_names = registry.list_tools();
151
152 assert!(tool_names.contains(&"bash".to_string()));
154 assert!(tool_names.contains(&"read".to_string()));
155 assert!(tool_names.contains(&"write".to_string()));
156 assert!(tool_names.contains(&"edit".to_string()));
157 assert!(tool_names.contains(&"glob".to_string()));
158 assert!(tool_names.contains(&"grep".to_string()));
159 assert!(tool_names.contains(&"list".to_string()));
160
161 assert!(tool_names.contains(&"multiedit".to_string()));
163 assert!(tool_names.contains(&"webfetch".to_string()));
164 assert!(tool_names.contains(&"websearch".to_string()));
165 assert!(tool_names.contains(&"todowrite".to_string()));
166 assert!(tool_names.contains(&"todoread".to_string()));
167 }
168}