Skip to main content

bamboo_engine/runtime/
agent.rs

1//! Stable public API for the agent runtime.
2//!
3//! [`Agent`] wraps an [`AgentRuntime`] with method-based access and serves as
4//! the primary entry point for SDK consumers.
5
6use std::sync::Arc;
7
8use bamboo_agent_core::Session;
9
10use crate::runtime::{AgentRuntime, AgentRuntimeBuilder, ExecuteRequest};
11use bamboo_domain::RuntimeSessionPersistence;
12
13// ---------------------------------------------------------------------------
14// Agent — stable public object
15// ---------------------------------------------------------------------------
16
17/// Stable public entry point for agent execution.
18///
19/// Wraps an [`AgentRuntime`] and provides:
20/// - [`Agent::execute()`] — run the agent loop on a session
21/// - [`Agent::storage()`] — access the shared storage backend
22///
23/// Clone is cheap (inner is `Arc`).
24#[derive(Clone)]
25pub struct Agent {
26    runtime: Arc<AgentRuntime>,
27}
28
29impl Agent {
30    /// Wrap an existing [`AgentRuntime`] in an `Agent`.
31    pub fn from_runtime(runtime: Arc<AgentRuntime>) -> Self {
32        Agent { runtime }
33    }
34
35    /// Return a new builder.
36    pub fn builder() -> AgentBuilder {
37        AgentBuilder::new()
38    }
39
40    /// Execute the agent loop with the given request.
41    pub async fn execute(
42        &self,
43        session: &mut Session,
44        req: ExecuteRequest,
45    ) -> crate::runtime::runner::Result<()> {
46        self.runtime.execute(session, req).await
47    }
48
49    /// Access the shared storage backend.
50    pub fn storage(&self) -> &Arc<dyn bamboo_agent_core::storage::Storage> {
51        &self.runtime.storage
52    }
53
54    /// Access the runtime persistence adapter for non-authoritative saves.
55    pub fn persistence(&self) -> &Arc<dyn RuntimeSessionPersistence> {
56        &self.runtime.persistence
57    }
58}
59
60// ---------------------------------------------------------------------------
61// AgentBuilder
62// ---------------------------------------------------------------------------
63
64/// Builder for [`Agent`].
65///
66/// Delegates to [`AgentRuntimeBuilder`] internally.
67pub struct AgentBuilder {
68    inner: AgentRuntimeBuilder,
69}
70
71impl AgentBuilder {
72    pub fn new() -> Self {
73        Self {
74            inner: AgentRuntimeBuilder::new(),
75        }
76    }
77
78    pub fn storage(mut self, v: Arc<dyn bamboo_agent_core::storage::Storage>) -> Self {
79        self.inner = self.inner.storage(v);
80        self
81    }
82
83    pub fn persistence(mut self, v: Arc<dyn RuntimeSessionPersistence>) -> Self {
84        self.inner = self.inner.persistence(v);
85        self
86    }
87
88    pub fn attachment_reader(
89        mut self,
90        v: Arc<dyn bamboo_agent_core::storage::AttachmentReader>,
91    ) -> Self {
92        self.inner = self.inner.attachment_reader(v);
93        self
94    }
95
96    pub fn skill_manager(mut self, v: Arc<crate::skills::SkillManager>) -> Self {
97        self.inner = self.inner.skill_manager(v);
98        self
99    }
100
101    pub fn metrics_collector(mut self, v: crate::metrics::MetricsCollector) -> Self {
102        self.inner = self.inner.metrics_collector(v);
103        self
104    }
105
106    pub fn config(mut self, v: Arc<tokio::sync::RwLock<bamboo_infrastructure::Config>>) -> Self {
107        self.inner = self.inner.config(v);
108        self
109    }
110
111    pub fn provider(mut self, v: Arc<dyn bamboo_infrastructure::LLMProvider>) -> Self {
112        self.inner = self.inner.provider(v);
113        self
114    }
115
116    pub fn default_tools(mut self, v: Arc<dyn bamboo_agent_core::tools::ToolExecutor>) -> Self {
117        self.inner = self.inner.default_tools(v);
118        self
119    }
120
121    pub fn build(self) -> Result<Agent, &'static str> {
122        let runtime = self.inner.build()?;
123        Ok(Agent {
124            runtime: Arc::new(runtime),
125        })
126    }
127}
128
129impl Default for AgentBuilder {
130    fn default() -> Self {
131        Self::new()
132    }
133}