steer_core/tools/
factory.rs1use std::sync::Arc;
2
3use crate::api::Client as ApiClient;
4use crate::app::domain::session::EventStore;
5use crate::app::validation::ValidatorRegistry;
6use crate::model_registry::ModelRegistry;
7use crate::workspace::{RepoManager, Workspace, WorkspaceManager};
8
9use super::BackendRegistry;
10use super::agent_spawner_impl::DefaultAgentSpawner;
11use super::builtin_tools::register_builtin_tools;
12use super::executor::ToolExecutor;
13use super::model_caller_impl::DefaultModelCaller;
14use super::registry::ToolRegistry;
15use super::services::ToolServices;
16
17pub struct ToolSystemBuilder {
18 workspace: Arc<dyn Workspace>,
19 event_store: Arc<dyn EventStore>,
20 api_client: Arc<ApiClient>,
21 model_registry: Arc<ModelRegistry>,
22 backend_registry: Arc<BackendRegistry>,
23 validators: Arc<ValidatorRegistry>,
24 workspace_manager: Option<Arc<dyn WorkspaceManager>>,
25 repo_manager: Option<Arc<dyn RepoManager>>,
26}
27
28impl ToolSystemBuilder {
29 pub fn new(
30 workspace: Arc<dyn Workspace>,
31 event_store: Arc<dyn EventStore>,
32 api_client: Arc<ApiClient>,
33 model_registry: Arc<ModelRegistry>,
34 ) -> Self {
35 Self {
36 workspace,
37 event_store,
38 api_client,
39 model_registry,
40 backend_registry: Arc::new(BackendRegistry::new()),
41 validators: Arc::new(ValidatorRegistry::new()),
42 workspace_manager: None,
43 repo_manager: None,
44 }
45 }
46
47 pub fn with_backend_registry(mut self, registry: Arc<BackendRegistry>) -> Self {
48 self.backend_registry = registry;
49 self
50 }
51
52 pub fn with_validators(mut self, validators: Arc<ValidatorRegistry>) -> Self {
53 self.validators = validators;
54 self
55 }
56
57 pub fn with_workspace_manager(mut self, manager: Arc<dyn WorkspaceManager>) -> Self {
58 self.workspace_manager = Some(manager);
59 self
60 }
61
62 pub fn with_repo_manager(mut self, manager: Arc<dyn RepoManager>) -> Self {
63 self.repo_manager = Some(manager);
64 self
65 }
66
67 pub fn build(self) -> Arc<ToolExecutor> {
68 let base_executor = ToolExecutor::with_components(self.backend_registry, self.validators);
69
70 let agent_spawner = Arc::new(DefaultAgentSpawner::new(
71 self.event_store.clone(),
72 self.api_client.clone(),
73 self.workspace.clone(),
74 self.model_registry,
75 self.workspace_manager.clone(),
76 self.repo_manager.clone(),
77 ));
78
79 let model_caller = Arc::new(DefaultModelCaller::new(self.api_client.clone()));
80
81 let mut services =
82 ToolServices::new(self.workspace.clone(), self.event_store, self.api_client)
83 .with_agent_spawner(agent_spawner)
84 .with_model_caller(model_caller)
85 .with_network();
86 if let Some(manager) = self.workspace_manager {
87 services = services.with_workspace_manager(manager);
88 }
89 if let Some(manager) = self.repo_manager {
90 services = services.with_repo_manager(manager);
91 }
92 let services = Arc::new(services);
93
94 let mut registry = ToolRegistry::new();
95 register_builtin_tools(&mut registry);
96
97 Arc::new(base_executor.with_builtin_tools(Arc::new(registry), services))
98 }
99}