everruns_host/
backends.rs1use crate::events::{EventLog, EventSink, InMemoryEventLog, NoopEventSink};
7use crate::in_memory::{InMemorySessionStorageStore, InMemorySessionStore};
8use async_trait::async_trait;
9use everruns_core::agent::Agent;
10use everruns_core::error::Result;
11use everruns_core::harness::Harness;
12use everruns_core::in_memory::{InMemoryAgentStore, InMemoryHarnessStore, InMemoryProviderStore};
13use everruns_core::session::Session;
14use everruns_core::session_task::SessionTaskRegistry;
15use everruns_core::traits::{
16 AgentStore, HarnessStore, ProviderStore, ResolvedModel, SessionMutator, SessionScheduleStore,
17 SessionStorageStore, SessionStore, UserConnectionResolver,
18};
19use everruns_core::typed_id::SessionId;
20use everruns_platform::PlatformStore;
21use std::sync::Arc;
22
23pub type ScheduleStoreFactory = Arc<dyn Fn(i64) -> Arc<dyn SessionScheduleStore> + Send + Sync>;
27
28pub type PlatformStoreFactory = Arc<dyn Fn(i64, SessionId) -> Arc<dyn PlatformStore> + Send + Sync>;
32
33#[async_trait]
35pub trait RuntimeAgentStore: AgentStore + Send + Sync {
36 async fn add_agent(&self, agent: Agent) -> Result<()>;
38}
39
40#[async_trait]
42pub trait RuntimeHarnessStore: HarnessStore + Send + Sync {
43 async fn add_harness(&self, harness: Harness) -> Result<()>;
45}
46
47#[async_trait]
49pub trait RuntimeSessionStore: SessionStore + SessionMutator + Send + Sync {
50 async fn add_session(&self, session: Session) -> Result<()>;
52}
53
54#[async_trait]
56pub trait RuntimeProviderStore: ProviderStore + Send + Sync {
57 async fn set_default_model(&self, model: ResolvedModel) -> Result<()>;
59}
60
61#[derive(Clone)]
67pub struct HostBackends {
68 pub harness_store: Arc<dyn RuntimeHarnessStore>,
70 pub agent_store: Arc<dyn RuntimeAgentStore>,
72 pub session_store: Arc<dyn RuntimeSessionStore>,
74 pub event_log: Arc<dyn EventLog>,
76 pub compaction_checkpoint_store: Arc<dyn everruns_core::CompactionCheckpointStore>,
78 pub provider_store: Arc<dyn RuntimeProviderStore>,
80 pub event_sink: Arc<dyn EventSink>,
82 pub storage_store: Arc<dyn SessionStorageStore>,
84 pub connection_resolver: Option<Arc<dyn UserConnectionResolver>>,
92 pub session_task_registry: Option<Arc<dyn SessionTaskRegistry>>,
97 pub schedule_store_factory: Option<ScheduleStoreFactory>,
100 pub platform_store_factory: Option<PlatformStoreFactory>,
103}
104
105impl HostBackends {
106 pub fn in_memory() -> Self {
111 Self {
112 harness_store: Arc::new(InMemoryHarnessStore::new()),
113 agent_store: Arc::new(InMemoryAgentStore::new()),
114 session_store: Arc::new(InMemorySessionStore::new()),
115 event_log: Arc::new(InMemoryEventLog::new()),
116 compaction_checkpoint_store: Arc::new(
117 everruns_core::InMemoryCompactionCheckpointStore::default(),
118 ),
119 provider_store: Arc::new(InMemoryProviderStore::new()),
120 event_sink: Arc::new(NoopEventSink),
121 storage_store: Arc::new(InMemorySessionStorageStore::new()),
122 connection_resolver: None,
123 session_task_registry: None,
124 schedule_store_factory: None,
125 platform_store_factory: None,
126 }
127 }
128
129 pub fn with_harness_store(mut self, store: Arc<dyn RuntimeHarnessStore>) -> Self {
130 self.harness_store = store;
131 self
132 }
133
134 pub fn with_agent_store(mut self, store: Arc<dyn RuntimeAgentStore>) -> Self {
135 self.agent_store = store;
136 self
137 }
138
139 pub fn with_session_store(mut self, store: Arc<dyn RuntimeSessionStore>) -> Self {
140 self.session_store = store;
141 self
142 }
143
144 pub fn with_event_log(mut self, log: Arc<dyn EventLog>) -> Self {
146 self.event_log = log;
147 self
148 }
149
150 pub fn with_compaction_checkpoint_store(
151 mut self,
152 store: Arc<dyn everruns_core::CompactionCheckpointStore>,
153 ) -> Self {
154 self.compaction_checkpoint_store = store;
155 self
156 }
157
158 pub fn with_provider_store(mut self, store: Arc<dyn RuntimeProviderStore>) -> Self {
159 self.provider_store = store;
160 self
161 }
162
163 pub fn with_event_sink(mut self, sink: Arc<dyn EventSink>) -> Self {
165 self.event_sink = sink;
166 self
167 }
168
169 pub fn with_storage_store(mut self, store: Arc<dyn SessionStorageStore>) -> Self {
170 self.storage_store = store;
171 self
172 }
173
174 pub fn with_connection_resolver(mut self, resolver: Arc<dyn UserConnectionResolver>) -> Self {
179 self.connection_resolver = Some(resolver);
180 self
181 }
182
183 pub fn with_session_task_registry(mut self, registry: Arc<dyn SessionTaskRegistry>) -> Self {
187 self.session_task_registry = Some(registry);
188 self
189 }
190
191 pub fn with_schedule_store_factory(mut self, factory: ScheduleStoreFactory) -> Self {
194 self.schedule_store_factory = Some(factory);
195 self
196 }
197
198 pub fn with_platform_store_factory(mut self, factory: PlatformStoreFactory) -> Self {
201 self.platform_store_factory = Some(factory);
202 self
203 }
204}
205
206#[async_trait]
207impl RuntimeAgentStore for InMemoryAgentStore {
208 async fn add_agent(&self, agent: Agent) -> Result<()> {
209 InMemoryAgentStore::add_agent(self, agent).await;
210 Ok(())
211 }
212}
213
214#[async_trait]
215impl RuntimeHarnessStore for InMemoryHarnessStore {
216 async fn add_harness(&self, harness: Harness) -> Result<()> {
217 InMemoryHarnessStore::add_harness(self, harness).await;
218 Ok(())
219 }
220}
221
222#[async_trait]
223impl RuntimeSessionStore for InMemorySessionStore {
224 async fn add_session(&self, session: Session) -> Result<()> {
225 InMemorySessionStore::add_session(self, session).await;
226 Ok(())
227 }
228}
229
230#[async_trait]
231impl RuntimeProviderStore for InMemoryProviderStore {
232 async fn set_default_model(&self, model: ResolvedModel) -> Result<()> {
233 InMemoryProviderStore::set_default_model(self, model).await;
234 Ok(())
235 }
236}