vtcode_config/constants/
tools.rs1pub const EXEC_COMMAND: &str = "exec_command";
6pub const WRITE_STDIN: &str = "write_stdin";
8pub const APPLY_PATCH: &str = "apply_patch";
10pub const RECORD_DECISION: &str = "record_decision";
12pub const CODE_SEARCH: &str = "code_search";
14
15pub const UNIFIED_SEARCH: &str = "search_dispatch_internal";
20pub const UNIFIED_EXEC: &str = "command_session_internal";
22pub const UNIFIED_FILE: &str = "file_operation_internal";
24
25pub const THINK: &str = "think";
29pub const SEARCH_TOOLS: &str = "search_tools";
30pub const MCP: &str = "mcp";
36pub const MCP_SEARCH_TOOLS: &str = "mcp_search_tools";
37pub const MCP_GET_TOOL_DETAILS: &str = "mcp_get_tool_details";
38pub const MCP_LIST_SERVERS: &str = "mcp_list_servers";
39pub const MCP_CONNECT_SERVER: &str = "mcp_connect_server";
40pub const MCP_DISCONNECT_SERVER: &str = "mcp_disconnect_server";
41pub const WEB_SEARCH: &str = "web_search";
42pub const WEB_FETCH: &str = "web_fetch";
43pub const FETCH_URL: &str = "fetch_url";
44pub const DEFUDDLE_FETCH: &str = "defuddle_fetch";
48pub const LIST: &str = "list";
49pub const GREP: &str = "grep";
50pub const FETCH: &str = "fetch";
51pub const EXEC_PTY_CMD: &str = "exec_pty_cmd";
52pub const SHELL: &str = "shell";
53pub const GREP_FILE: &str = "grep_file";
54pub const LIST_FILES: &str = "list_files";
55
56pub const LIST_SKILLS: &str = "list_skills";
61pub const LOAD_SKILL: &str = "load_skill";
63pub const LOAD_SKILL_RESOURCE: &str = "load_skill_resource";
65
66pub const RUN_PTY_CMD: &str = "run_pty_cmd";
70pub const CREATE_PTY_SESSION: &str = "create_pty_session";
71pub const LIST_PTY_SESSIONS: &str = "list_pty_sessions";
72pub const CLOSE_PTY_SESSION: &str = "close_pty_session";
73pub const SEND_PTY_INPUT: &str = "send_pty_input";
74pub const READ_PTY_SESSION: &str = "read_pty_session";
75pub const RESIZE_PTY_SESSION: &str = "resize_pty_session";
76pub const EXECUTE_CODE: &str = "execute_code";
77
78pub const READ_FILE: &str = "read_file";
82pub const WRITE_FILE: &str = "write_file";
83pub const EDIT_FILE: &str = "edit_file";
84pub const DELETE_FILE: &str = "delete_file";
85pub const CREATE_FILE: &str = "create_file";
86pub const SEARCH_REPLACE: &str = "search_replace";
87pub const FILE_OP: &str = "file_op";
88pub const MOVE_FILE: &str = "move_file";
89pub const COPY_FILE: &str = "copy_file";
90
91pub const GET_ERRORS: &str = "get_errors";
95
96pub const REQUEST_USER_INPUT: &str = "request_user_input";
101pub const MEMORY: &str = "memory";
103pub const ASK_QUESTIONS: &str = "ask_questions";
105pub const ASK_USER_QUESTION: &str = "ask_user_question";
107pub const MATRIX: &str = "matrix";
109pub const AGENT: &str = "agent";
116pub const CRON: &str = "cron";
118pub const CRON_CREATE: &str = "cron_create";
120pub const CRON_LIST: &str = "cron_list";
122pub const CRON_DELETE: &str = "cron_delete";
124
125pub const START_PLANNING: &str = "start_planning";
130pub const TASK_TRACKER: &str = "task_tracker";
132
133pub const SPAWN_AGENT: &str = "spawn_agent";
138pub const SPAWN_BACKGROUND_SUBPROCESS: &str = "spawn_background_subprocess";
140pub const SEND_INPUT: &str = "send_input";
142pub const WAIT_AGENT: &str = "wait_agent";
144pub const RESUME_AGENT: &str = "resume_agent";
146pub const CLOSE_AGENT: &str = "close_agent";
148
149pub const LIFECYCLE_CLEANUP_TOOLS: &[&str] = &[WAIT_AGENT, CLOSE_AGENT];
153
154pub const ALWAYS_AVAILABLE_WORKFLOW_TOOLS: &[&str] = &[TASK_TRACKER, START_PLANNING, REQUEST_USER_INPUT, MATRIX];
163
164#[inline]
167pub fn is_workflow_coordination_tool(canonical_name: &str) -> bool {
168 ALWAYS_AVAILABLE_WORKFLOW_TOOLS.contains(&canonical_name)
169}
170
171pub const WILDCARD_ALL: &str = "*";
173
174const _: () = {
184 const fn validate_tool_name(name: &str) {
188 assert!(!name.is_empty(), "tool name must not be empty");
189 let bytes = name.as_bytes();
190 if bytes.len() == 1 && bytes[0] == b'*' {
192 return;
193 }
194 assert!(
195 bytes[0] != b'_' && bytes[bytes.len() - 1] != b'_',
196 "tool name must not have leading/trailing underscores"
197 );
198 let mut i = 0;
199 while i < bytes.len() {
200 let b = bytes[i];
201 assert!(b.is_ascii_lowercase() || b.is_ascii_digit() || b == b'_', "tool name must contain only [a-z0-9_]");
202 i += 1;
203 }
204 }
205
206 validate_tool_name(EXEC_COMMAND);
208 validate_tool_name(WRITE_STDIN);
209 validate_tool_name(APPLY_PATCH);
210 validate_tool_name(CODE_SEARCH);
211
212 validate_tool_name(UNIFIED_SEARCH);
214 validate_tool_name(UNIFIED_EXEC);
215 validate_tool_name(UNIFIED_FILE);
216
217 validate_tool_name(THINK);
219 validate_tool_name(SEARCH_TOOLS);
220 validate_tool_name(MCP);
221 validate_tool_name(MCP_SEARCH_TOOLS);
222 validate_tool_name(MCP_GET_TOOL_DETAILS);
223 validate_tool_name(MCP_LIST_SERVERS);
224 validate_tool_name(MCP_CONNECT_SERVER);
225 validate_tool_name(MCP_DISCONNECT_SERVER);
226 validate_tool_name(WEB_SEARCH);
227 validate_tool_name(WEB_FETCH);
228 validate_tool_name(FETCH_URL);
229 validate_tool_name(DEFUDDLE_FETCH);
230 validate_tool_name(LIST);
231 validate_tool_name(GREP);
232 validate_tool_name(FETCH);
233 validate_tool_name(EXEC_PTY_CMD);
234 validate_tool_name(SHELL);
235 validate_tool_name(GREP_FILE);
236 validate_tool_name(LIST_FILES);
237
238 validate_tool_name(LIST_SKILLS);
240 validate_tool_name(LOAD_SKILL);
241 validate_tool_name(LOAD_SKILL_RESOURCE);
242
243 validate_tool_name(RUN_PTY_CMD);
245 validate_tool_name(CREATE_PTY_SESSION);
246 validate_tool_name(LIST_PTY_SESSIONS);
247 validate_tool_name(CLOSE_PTY_SESSION);
248 validate_tool_name(SEND_PTY_INPUT);
249 validate_tool_name(READ_PTY_SESSION);
250 validate_tool_name(RESIZE_PTY_SESSION);
251 validate_tool_name(EXECUTE_CODE);
252
253 validate_tool_name(READ_FILE);
255 validate_tool_name(WRITE_FILE);
256 validate_tool_name(EDIT_FILE);
257 validate_tool_name(DELETE_FILE);
258 validate_tool_name(CREATE_FILE);
259 validate_tool_name(SEARCH_REPLACE);
260 validate_tool_name(FILE_OP);
261 validate_tool_name(MOVE_FILE);
262 validate_tool_name(COPY_FILE);
263
264 validate_tool_name(GET_ERRORS);
266
267 validate_tool_name(REQUEST_USER_INPUT);
269 validate_tool_name(MEMORY);
270 validate_tool_name(ASK_QUESTIONS);
271 validate_tool_name(ASK_USER_QUESTION);
272 validate_tool_name(AGENT);
273 validate_tool_name(CRON);
274 validate_tool_name(CRON_CREATE);
275 validate_tool_name(CRON_LIST);
276 validate_tool_name(CRON_DELETE);
277
278 validate_tool_name(START_PLANNING);
280 validate_tool_name(TASK_TRACKER);
281
282 validate_tool_name(SPAWN_AGENT);
284 validate_tool_name(SPAWN_BACKGROUND_SUBPROCESS);
285 validate_tool_name(SEND_INPUT);
286 validate_tool_name(WAIT_AGENT);
287 validate_tool_name(RESUME_AGENT);
288 validate_tool_name(CLOSE_AGENT);
289
290 validate_tool_name(WILDCARD_ALL);
292};
293
294#[cfg(test)]
295mod tests {
296 use super::*;
297
298 #[test]
299 fn workflow_coordination_tools_bypass_the_full_auto_allow_list() {
300 for tool in [TASK_TRACKER, START_PLANNING, REQUEST_USER_INPUT] {
301 assert!(is_workflow_coordination_tool(tool), "{tool} must bypass the allow-list");
302 }
303 }
304
305 #[test]
306 fn execution_tools_do_not_bypass_the_full_auto_allow_list() {
307 for tool in [
308 EXEC_COMMAND,
309 WRITE_STDIN,
310 APPLY_PATCH,
311 CODE_SEARCH,
312 WEB_FETCH,
313 "not_a_tool",
314 ] {
315 assert!(!is_workflow_coordination_tool(tool), "{tool} must stay allow-list gated");
316 }
317 }
318}