Skip to main content

steer_core/tools/
factory.rs

1use 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}