An AI agent built to do Ralph loops - plan mode for planning and ralph mode for implementing.

refactor: extract tool registry factory to eliminate duplication

+38 -41
+3 -22
src/planning/mod.rs
··· 2 2 use crate::llm::factory::create_client; 3 3 use crate::llm::{LlmClient, Message, ResponseContent}; 4 4 use crate::security::{SecurityValidator, permission::CliPermissionHandler}; 5 - use crate::tools::{ 6 - ToolRegistry, 7 - file::{ListFilesTool, ReadFileTool, WriteFileTool}, 8 - shell::RunCommandTool, 9 - }; 5 + use crate::tools::ToolRegistry; 6 + use crate::tools::factory::create_default_registry; 10 7 use std::io::{self, Write}; 11 8 use std::sync::Arc; 12 9 ··· 32 29 let permission_handler = Arc::new(CliPermissionHandler); 33 30 34 31 // Create and populate tool registry 35 - let registry = ToolRegistry::new(); 36 - registry.register(Arc::new(ReadFileTool::new( 37 - validator.clone(), 38 - permission_handler.clone(), 39 - ))); 40 - registry.register(Arc::new(WriteFileTool::new( 41 - validator.clone(), 42 - permission_handler.clone(), 43 - ))); 44 - registry.register(Arc::new(ListFilesTool::new( 45 - validator.clone(), 46 - permission_handler.clone(), 47 - ))); 48 - registry.register(Arc::new(RunCommandTool::new( 49 - validator.clone(), 50 - permission_handler.clone(), 51 - ))); 32 + let registry = create_default_registry(validator, permission_handler); 52 33 53 34 // Initialize conversation with system message 54 35 let system_message = Message::system(PLANNING_SYSTEM_PROMPT);
+2 -19
src/ralph/mod.rs
··· 4 4 use crate::security::{SecurityValidator, permission::CliPermissionHandler}; 5 5 use crate::spec::{Spec, TaskStatus}; 6 6 use crate::tools::ToolRegistry; 7 - use crate::tools::file::{ListFilesTool, ReadFileTool, WriteFileTool}; 8 - use crate::tools::shell::RunCommandTool; 7 + use crate::tools::factory::create_default_registry; 9 8 use anyhow::{Context, Result}; 10 9 use chrono::Utc; 11 10 use std::sync::Arc; ··· 32 31 let permission_handler = Arc::new(CliPermissionHandler); 33 32 34 33 // Register tools 35 - let tools = ToolRegistry::new(); 36 - tools.register(Arc::new(ReadFileTool::new( 37 - validator.clone(), 38 - permission_handler.clone(), 39 - ))); 40 - tools.register(Arc::new(WriteFileTool::new( 41 - validator.clone(), 42 - permission_handler.clone(), 43 - ))); 44 - tools.register(Arc::new(ListFilesTool::new( 45 - validator.clone(), 46 - permission_handler.clone(), 47 - ))); 48 - tools.register(Arc::new(RunCommandTool::new( 49 - validator.clone(), 50 - permission_handler.clone(), 51 - ))); 34 + let tools = create_default_registry(validator, permission_handler); 52 35 53 36 let max_iterations = max_iterations 54 37 .or(config.rustagent.max_iterations)
+32
src/tools/factory.rs
··· 1 + use crate::security::permission::PermissionHandler; 2 + use crate::security::SecurityValidator; 3 + use crate::tools::file::{ListFilesTool, ReadFileTool, WriteFileTool}; 4 + use crate::tools::shell::RunCommandTool; 5 + use crate::tools::ToolRegistry; 6 + use std::sync::Arc; 7 + 8 + pub fn create_default_registry( 9 + validator: Arc<SecurityValidator>, 10 + permission_handler: Arc<dyn PermissionHandler>, 11 + ) -> ToolRegistry { 12 + let registry = ToolRegistry::new(); 13 + 14 + registry.register(Arc::new(ReadFileTool::new( 15 + validator.clone(), 16 + permission_handler.clone(), 17 + ))); 18 + registry.register(Arc::new(WriteFileTool::new( 19 + validator.clone(), 20 + permission_handler.clone(), 21 + ))); 22 + registry.register(Arc::new(ListFilesTool::new( 23 + validator.clone(), 24 + permission_handler.clone(), 25 + ))); 26 + registry.register(Arc::new(RunCommandTool::new( 27 + validator.clone(), 28 + permission_handler.clone(), 29 + ))); 30 + 31 + registry 32 + }
+1
src/tools/mod.rs
··· 80 80 } 81 81 } 82 82 83 + pub mod factory; 83 84 pub mod file; 84 85 pub mod shell;