use crate::SessionMutator;
use crate::events::{EventLog, EventSink, InMemoryEventLog, NoopEventSink};
use crate::in_memory::{
InMemoryAgentStore, InMemoryCompactionCheckpointStore, InMemoryHarnessStore,
InMemoryProviderStore, InMemorySessionStorageStore, InMemorySessionStore,
};
use async_trait::async_trait;
use everruns_core::agent_definition::AgentDefinition;
use everruns_core::harness_definition::HarnessDefinition;
use everruns_core::session::ExecutionSession;
use everruns_core::session_task::SessionTaskRegistry;
use everruns_core::{
connection_services::UserConnectionResolver, execution_loading::AgentStore,
execution_loading::HarnessStore, execution_loading::SessionStore,
provider_resolution::ProviderStore, session_services::SessionScheduleStore,
session_services::SessionStorageStore,
};
use everruns_provider::error::Result;
use everruns_provider::model_spec::ModelSpec;
use everruns_provider::typed_id::HarnessId;
use std::sync::Arc;
pub type ScheduleStoreFactory = Arc<dyn Fn(i64) -> Arc<dyn SessionScheduleStore> + Send + Sync>;
#[async_trait]
pub trait RuntimeAgentStore: AgentStore + Send + Sync {
async fn add_agent(&self, agent: AgentDefinition) -> Result<()>;
}
#[async_trait]
pub trait RuntimeHarnessStore: HarnessStore + Send + Sync {
async fn add_harness(&self, harness_id: HarnessId, harness: HarnessDefinition) -> Result<()>;
}
#[async_trait]
pub trait RuntimeSessionStore: SessionStore + SessionMutator + Send + Sync {
async fn add_session(&self, session: ExecutionSession) -> Result<()>;
}
#[async_trait]
pub trait RuntimeProviderStore: ProviderStore + Send + Sync {
async fn set_default_model_spec(&self, model: ModelSpec) -> Result<()>;
}
#[derive(Clone)]
pub struct HostBackends {
pub native_async_store: Option<Arc<dyn everruns_core::native_async_store::NativeAsyncStore>>,
pub harness_store: Arc<dyn RuntimeHarnessStore>,
pub agent_store: Arc<dyn RuntimeAgentStore>,
pub session_store: Arc<dyn RuntimeSessionStore>,
pub event_log: Arc<dyn EventLog>,
pub compaction_checkpoint_store: Arc<dyn everruns_core::CompactionCheckpointStore>,
pub provider_store: Arc<dyn RuntimeProviderStore>,
pub event_sink: Arc<dyn EventSink>,
pub storage_store: Arc<dyn SessionStorageStore>,
pub connection_resolver: Option<Arc<dyn UserConnectionResolver>>,
pub session_task_registry: Option<Arc<dyn SessionTaskRegistry>>,
pub schedule_store_factory: Option<ScheduleStoreFactory>,
pub tool_context_extensions_factory: Option<crate::ToolContextExtensionsFactory>,
pub subagent_delegate_factory: Option<crate::SubagentDelegateFactory>,
pub tool_augmentor: Option<Arc<dyn crate::HostToolAugmentor>>,
}
impl HostBackends {
pub fn in_memory() -> Self {
Self {
harness_store: Arc::new(InMemoryHarnessStore::new()),
agent_store: Arc::new(InMemoryAgentStore::new()),
session_store: Arc::new(InMemorySessionStore::new()),
event_log: Arc::new(InMemoryEventLog::new()),
native_async_store: None,
compaction_checkpoint_store: Arc::new(InMemoryCompactionCheckpointStore::default()),
provider_store: Arc::new(InMemoryProviderStore::new()),
event_sink: Arc::new(NoopEventSink),
storage_store: Arc::new(InMemorySessionStorageStore::new()),
connection_resolver: None,
session_task_registry: None,
schedule_store_factory: None,
tool_context_extensions_factory: None,
subagent_delegate_factory: None,
tool_augmentor: None,
}
}
pub fn with_harness_store(mut self, store: Arc<dyn RuntimeHarnessStore>) -> Self {
self.harness_store = store;
self
}
pub fn with_agent_store(mut self, store: Arc<dyn RuntimeAgentStore>) -> Self {
self.agent_store = store;
self
}
pub fn with_session_store(mut self, store: Arc<dyn RuntimeSessionStore>) -> Self {
self.session_store = store;
self
}
pub fn with_event_log(mut self, log: Arc<dyn EventLog>) -> Self {
self.event_log = log;
self
}
pub fn with_native_async_store(
mut self,
store: Arc<dyn everruns_core::native_async_store::NativeAsyncStore>,
) -> Self {
self.native_async_store = Some(store);
self
}
pub fn with_compaction_checkpoint_store(
mut self,
store: Arc<dyn everruns_core::CompactionCheckpointStore>,
) -> Self {
self.compaction_checkpoint_store = store;
self
}
pub fn with_provider_store(mut self, store: Arc<dyn RuntimeProviderStore>) -> Self {
self.provider_store = store;
self
}
pub fn with_event_sink(mut self, sink: Arc<dyn EventSink>) -> Self {
self.event_sink = sink;
self
}
pub fn with_storage_store(mut self, store: Arc<dyn SessionStorageStore>) -> Self {
self.storage_store = store;
self
}
pub fn with_connection_resolver(mut self, resolver: Arc<dyn UserConnectionResolver>) -> Self {
self.connection_resolver = Some(resolver);
self
}
pub fn with_session_task_registry(mut self, registry: Arc<dyn SessionTaskRegistry>) -> Self {
self.session_task_registry = Some(registry);
self
}
pub fn with_schedule_store_factory(mut self, factory: ScheduleStoreFactory) -> Self {
self.schedule_store_factory = Some(factory);
self
}
pub fn with_tool_context_extensions_factory(
mut self,
factory: crate::ToolContextExtensionsFactory,
) -> Self {
self.tool_context_extensions_factory = Some(factory);
self
}
pub fn with_subagent_delegate_factory(
mut self,
factory: crate::SubagentDelegateFactory,
) -> Self {
self.subagent_delegate_factory = Some(factory);
self
}
pub fn with_tool_augmentor(mut self, augmentor: Arc<dyn crate::HostToolAugmentor>) -> Self {
self.tool_augmentor = Some(augmentor);
self
}
}
#[async_trait]
impl RuntimeAgentStore for InMemoryAgentStore {
async fn add_agent(&self, agent: AgentDefinition) -> Result<()> {
InMemoryAgentStore::add_agent(self, agent).await;
Ok(())
}
}
#[async_trait]
impl RuntimeHarnessStore for InMemoryHarnessStore {
async fn add_harness(&self, harness_id: HarnessId, harness: HarnessDefinition) -> Result<()> {
InMemoryHarnessStore::add_harness(self, harness_id, harness).await;
Ok(())
}
}
#[async_trait]
impl RuntimeSessionStore for InMemorySessionStore {
async fn add_session(&self, session: ExecutionSession) -> Result<()> {
InMemorySessionStore::add_session(self, session).await;
Ok(())
}
}
#[async_trait]
impl RuntimeProviderStore for InMemoryProviderStore {
async fn set_default_model_spec(&self, model: ModelSpec) -> Result<()> {
InMemoryProviderStore::set_default_model_spec(self, model).await;
Ok(())
}
}