An AI agent built to do Ralph loops - plan mode for planning and ralph mode for implementing.
at new-directions 92 lines 3.6 kB view raw
1use crate::agent::AgentId; 2use crate::context::ReadAgentsMdTool; 3use crate::graph::store::GraphStore; 4use crate::message::MessageBus; 5use crate::security::SecurityValidator; 6use crate::security::permission::PermissionHandler; 7use crate::tools::ToolRegistry; 8use crate::tools::agent_tools::{QueryAgentStatusTool, SendMessageTool, SpawnSubAgentTool}; 9use crate::tools::file::{ListFilesTool, ReadFileTool, WriteFileTool}; 10use crate::tools::graph_tools::{ 11 AddEdgeTool, ChooseOptionTool, ClaimTaskTool, CreateNodeTool, LogDecisionTool, QueryNodesTool, 12 RecordObservationTool, RecordOutcomeTool, RevisitTool, SearchNodesTool, UpdateNodeTool, 13}; 14use crate::tools::search::CodeSearchTool; 15use crate::tools::shell::RunCommandTool; 16use crate::tools::signal::SignalTool; 17use std::path::PathBuf; 18use std::sync::Arc; 19 20pub fn create_default_registry( 21 validator: Arc<SecurityValidator>, 22 permission_handler: Arc<dyn PermissionHandler>, 23) -> ToolRegistry { 24 let registry = ToolRegistry::new(); 25 26 registry.register(Arc::new(ReadFileTool::new( 27 validator.clone(), 28 permission_handler.clone(), 29 ))); 30 registry.register(Arc::new(WriteFileTool::new( 31 validator.clone(), 32 permission_handler.clone(), 33 ))); 34 registry.register(Arc::new(ListFilesTool::new( 35 validator.clone(), 36 permission_handler.clone(), 37 ))); 38 registry.register(Arc::new(RunCommandTool::new( 39 validator.clone(), 40 permission_handler.clone(), 41 ))); 42 registry.register(Arc::new(SignalTool::new())); 43 44 registry 45} 46 47/// Create a v2 registry for agent runtime with graph tools registered. 48/// 49/// Pass `message_bus` and `agent_id` for multi-agent mode (enables agent tools). 50/// Pass `None, None` for single-agent mode (agent tools are omitted). 51pub fn create_v2_registry( 52 validator: Arc<SecurityValidator>, 53 permission_handler: Arc<dyn PermissionHandler>, 54 graph_store: Arc<dyn GraphStore>, 55 message_bus: Option<Arc<dyn MessageBus>>, 56 agent_id: Option<AgentId>, 57 project_root: PathBuf, 58) -> ToolRegistry { 59 let registry = create_default_registry(validator, permission_handler); 60 61 // Register graph tools 62 registry.register(Arc::new(CreateNodeTool::new(graph_store.clone()))); 63 registry.register(Arc::new(UpdateNodeTool::new(graph_store.clone()))); 64 registry.register(Arc::new(AddEdgeTool::new(graph_store.clone()))); 65 registry.register(Arc::new(QueryNodesTool::new(graph_store.clone()))); 66 registry.register(Arc::new(SearchNodesTool::new(graph_store.clone()))); 67 registry.register(Arc::new(ClaimTaskTool::new(graph_store.clone()))); 68 registry.register(Arc::new(LogDecisionTool::new(graph_store.clone()))); 69 registry.register(Arc::new(ChooseOptionTool::new(graph_store.clone()))); 70 registry.register(Arc::new(RecordOutcomeTool::new(graph_store.clone()))); 71 registry.register(Arc::new(RecordObservationTool::new(graph_store.clone()))); 72 registry.register(Arc::new(RevisitTool::new(graph_store.clone()))); 73 74 // Register context tools 75 registry.register(Arc::new(ReadAgentsMdTool::new())); 76 77 // Register search tools 78 registry.register(Arc::new(CodeSearchTool::new(project_root))); 79 80 // Register agent tools (only in multi-agent mode) 81 if let (Some(bus), Some(id)) = (message_bus, agent_id) { 82 registry.register(Arc::new(SpawnSubAgentTool::new( 83 graph_store.clone(), 84 bus.clone(), 85 id.clone(), 86 ))); 87 registry.register(Arc::new(SendMessageTool::new(bus.clone()))); 88 registry.register(Arc::new(QueryAgentStatusTool::new(graph_store))); 89 } 90 91 registry 92}