An AI agent built to do Ralph loops - plan mode for planning and ralph mode for implementing.
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}