use std::sync::Arc;
use async_trait::async_trait;
use crate::agent::AgentOutput;
use crate::config::AgentConfig;
use crate::traits::context_manager::ContextManager;
use crate::traits::execution_strategy::ExecutionStrategy;
use crate::traits::guard::Guard;
use crate::traits::hint::Hint;
use crate::traits::memory::Memory;
use crate::traits::output_transformer::OutputTransformer;
use crate::traits::provider::Provider;
use crate::traits::tool::ErasedTool;
use crate::traits::tool_registry::ToolRegistry;
use crate::traits::tracker::Tracker;
use crate::Result;
#[derive(Clone)]
pub struct AgentRuntime {
pub provider: Arc<dyn Provider>,
pub tools: Vec<Arc<dyn ErasedTool>>,
pub memory: Arc<dyn Memory>,
pub guards: Vec<Arc<dyn Guard>>,
pub hints: Vec<Arc<dyn Hint>>,
pub tracker: Arc<dyn Tracker>,
pub context_manager: Arc<dyn ContextManager>,
pub execution_strategy: Arc<dyn ExecutionStrategy>,
pub output_transformer: Arc<dyn OutputTransformer>,
pub tool_registry: Arc<dyn ToolRegistry>,
pub config: AgentConfig,
pub hooks: Vec<Arc<dyn super::hook::AgentHook>>,
}
#[async_trait]
pub trait AgentStrategy: Send + Sync + 'static {
async fn execute(
&self,
runtime: &AgentRuntime,
input: &str,
session_id: &str,
) -> Result<AgentOutput>;
fn stream(
&self,
_runtime: &AgentRuntime,
_input: &str,
_session_id: &str,
) -> std::pin::Pin<
Box<dyn tokio_stream::Stream<Item = Result<crate::types::stream::StreamEvent>> + Send>,
> {
let (tx, rx) = tokio::sync::mpsc::channel(1);
let _ = tx.try_send(Err(crate::Error::Runtime(
"Streaming is not supported by this AgentStrategy".into(),
)));
Box::pin(tokio_stream::wrappers::ReceiverStream::new(rx))
}
}
#[cfg(test)]
mod tests {
use super::*;
fn _assert_object_safe(_: &dyn AgentStrategy) {}
fn _assert_send_sync(_: &(dyn AgentStrategy + Send + Sync)) {}
}