use std::sync::Arc;
use everruns_core::error::Result;
use everruns_core::traits::{SessionFileSystemFactory, SessionFileSystemFactoryContext};
use everruns_core::{PlatformDefinition, ResolvedModel};
use everruns_runtime::{
InProcessRuntime, InProcessRuntimeBuilder, RealDiskSessionFileSystemFactory,
};
use crate::backends::LocalBackends;
use crate::profile::LocalProfile;
pub struct LocalRuntimeBuilder {
profile: LocalProfile,
inner: InProcessRuntimeBuilder,
file_system_factory: Option<Arc<dyn SessionFileSystemFactory>>,
platform_definition: Option<PlatformDefinition>,
}
impl LocalRuntimeBuilder {
pub fn new(profile: LocalProfile) -> Self {
Self {
profile,
inner: InProcessRuntimeBuilder::new(),
file_system_factory: None,
platform_definition: None,
}
}
pub fn platform_definition(mut self, platform_definition: PlatformDefinition) -> Self {
self.platform_definition = Some(platform_definition);
self
}
pub fn llm_sim(mut self, config: everruns_core::llmsim_driver::LlmSimConfig) -> Self {
self.inner = self.inner.llm_sim(config);
self
}
pub fn default_model(mut self, model: ResolvedModel) -> Self {
self.inner = self.inner.default_model(model);
self
}
pub fn harness(mut self, harness: everruns_core::Harness) -> Self {
self.inner = self.inner.harness(harness);
self
}
pub fn agent(mut self, agent: everruns_core::Agent) -> Self {
self.inner = self.inner.agent(agent);
self
}
pub fn session(mut self, session: everruns_core::Session) -> Self {
self.inner = self.inner.session(session);
self
}
pub fn session_file_system_factory(
mut self,
factory: Arc<dyn SessionFileSystemFactory>,
) -> Self {
self.file_system_factory = Some(factory);
self
}
pub fn inner_mut(&mut self) -> &mut InProcessRuntimeBuilder {
&mut self.inner
}
pub async fn build(self) -> Result<(InProcessRuntime, LocalBackends)> {
self.profile
.ensure_dirs()
.map_err(|e| everruns_core::AgentLoopError::config(e.to_string()))?;
let local = LocalBackends::new(
self.profile.clone(),
everruns_runtime::RuntimeBackends::in_memory(),
)?;
let platform_definition = match self.platform_definition {
Some(pd) => pd,
None => {
let factory = self.file_system_factory.unwrap_or_else(|| {
Arc::new(RealDiskSessionFileSystemFactory::new(
self.profile.workspace_root.clone(),
))
});
PlatformDefinition::builder()
.capability_registry(everruns_core::CapabilityRegistry::with_builtins())
.driver_registry(everruns_core::DriverRegistry::new())
.session_file_system_factory(factory)
.build()
}
};
let runtime = self
.inner
.platform_definition(platform_definition)
.session_file_system_factory_context(SessionFileSystemFactoryContext::new())
.backends(local.runtime_backends.clone())
.build()
.await?;
Ok((runtime, local))
}
}