everruns_host/
backends.rs1use crate::SessionMutator;
7use crate::events::{EventLog, EventSink, InMemoryEventLog, NoopEventSink};
8use crate::in_memory::{
9 InMemoryAgentStore, InMemoryCompactionCheckpointStore, InMemoryHarnessStore,
10 InMemoryProviderStore, InMemorySessionStorageStore, InMemorySessionStore,
11};
12use async_trait::async_trait;
13use everruns_core::agent_definition::AgentDefinition;
14use everruns_core::harness_definition::HarnessDefinition;
15use everruns_core::session::ExecutionSession;
16use everruns_core::session_task::SessionTaskRegistry;
17use everruns_core::{
18 connection_services::UserConnectionResolver, execution_loading::AgentStore,
19 execution_loading::HarnessStore, execution_loading::SessionStore,
20 provider_resolution::ProviderStore, session_services::SessionScheduleStore,
21 session_services::SessionStorageStore,
22};
23use everruns_provider::error::Result;
24use everruns_provider::model_spec::ModelSpec;
25use everruns_provider::typed_id::HarnessId;
26use std::sync::Arc;
27
28pub type ScheduleStoreFactory = Arc<dyn Fn(i64) -> Arc<dyn SessionScheduleStore> + Send + Sync>;
32
33#[async_trait]
38pub trait RuntimeAgentStore: AgentStore + Send + Sync {
39 async fn add_agent(&self, agent: AgentDefinition) -> Result<()>;
41}
42
43#[async_trait]
48pub trait RuntimeHarnessStore: HarnessStore + Send + Sync {
49 async fn add_harness(&self, harness_id: HarnessId, harness: HarnessDefinition) -> Result<()>;
51}
52
53#[async_trait]
58pub trait RuntimeSessionStore: SessionStore + SessionMutator + Send + Sync {
59 async fn add_session(&self, session: ExecutionSession) -> Result<()>;
61}
62
63#[async_trait]
65pub trait RuntimeProviderStore: ProviderStore + Send + Sync {
66 async fn set_default_model_spec(&self, model: ModelSpec) -> Result<()>;
68}
69
70#[derive(Clone)]
76pub struct HostBackends {
77 pub native_async_store: Option<Arc<dyn everruns_core::native_async_store::NativeAsyncStore>>,
79 pub harness_store: Arc<dyn RuntimeHarnessStore>,
81 pub agent_store: Arc<dyn RuntimeAgentStore>,
83 pub session_store: Arc<dyn RuntimeSessionStore>,
85 pub event_log: Arc<dyn EventLog>,
87 pub compaction_checkpoint_store: Arc<dyn everruns_core::CompactionCheckpointStore>,
89 pub provider_store: Arc<dyn RuntimeProviderStore>,
91 pub event_sink: Arc<dyn EventSink>,
93 pub storage_store: Arc<dyn SessionStorageStore>,
95 pub connection_resolver: Option<Arc<dyn UserConnectionResolver>>,
103 pub session_task_registry: Option<Arc<dyn SessionTaskRegistry>>,
108 pub schedule_store_factory: Option<ScheduleStoreFactory>,
111 pub tool_context_extensions_factory: Option<crate::ToolContextExtensionsFactory>,
113 pub subagent_delegate_factory: Option<crate::SubagentDelegateFactory>,
115 pub tool_augmentor: Option<Arc<dyn crate::HostToolAugmentor>>,
117}
118
119impl HostBackends {
120 pub fn in_memory() -> Self {
125 Self {
126 harness_store: Arc::new(InMemoryHarnessStore::new()),
127 agent_store: Arc::new(InMemoryAgentStore::new()),
128 session_store: Arc::new(InMemorySessionStore::new()),
129 event_log: Arc::new(InMemoryEventLog::new()),
130 native_async_store: None,
131 compaction_checkpoint_store: Arc::new(InMemoryCompactionCheckpointStore::default()),
132 provider_store: Arc::new(InMemoryProviderStore::new()),
133 event_sink: Arc::new(NoopEventSink),
134 storage_store: Arc::new(InMemorySessionStorageStore::new()),
135 connection_resolver: None,
136 session_task_registry: None,
137 schedule_store_factory: None,
138 tool_context_extensions_factory: None,
139 subagent_delegate_factory: None,
140 tool_augmentor: None,
141 }
142 }
143
144 pub fn with_harness_store(mut self, store: Arc<dyn RuntimeHarnessStore>) -> Self {
145 self.harness_store = store;
146 self
147 }
148
149 pub fn with_agent_store(mut self, store: Arc<dyn RuntimeAgentStore>) -> Self {
150 self.agent_store = store;
151 self
152 }
153
154 pub fn with_session_store(mut self, store: Arc<dyn RuntimeSessionStore>) -> Self {
155 self.session_store = store;
156 self
157 }
158
159 pub fn with_event_log(mut self, log: Arc<dyn EventLog>) -> Self {
161 self.event_log = log;
162 self
163 }
164
165 pub fn with_native_async_store(
166 mut self,
167 store: Arc<dyn everruns_core::native_async_store::NativeAsyncStore>,
168 ) -> Self {
169 self.native_async_store = Some(store);
170 self
171 }
172
173 pub fn with_compaction_checkpoint_store(
174 mut self,
175 store: Arc<dyn everruns_core::CompactionCheckpointStore>,
176 ) -> Self {
177 self.compaction_checkpoint_store = store;
178 self
179 }
180
181 pub fn with_provider_store(mut self, store: Arc<dyn RuntimeProviderStore>) -> Self {
182 self.provider_store = store;
183 self
184 }
185
186 pub fn with_event_sink(mut self, sink: Arc<dyn EventSink>) -> Self {
188 self.event_sink = sink;
189 self
190 }
191
192 pub fn with_storage_store(mut self, store: Arc<dyn SessionStorageStore>) -> Self {
193 self.storage_store = store;
194 self
195 }
196
197 pub fn with_connection_resolver(mut self, resolver: Arc<dyn UserConnectionResolver>) -> Self {
202 self.connection_resolver = Some(resolver);
203 self
204 }
205
206 pub fn with_session_task_registry(mut self, registry: Arc<dyn SessionTaskRegistry>) -> Self {
210 self.session_task_registry = Some(registry);
211 self
212 }
213
214 pub fn with_schedule_store_factory(mut self, factory: ScheduleStoreFactory) -> Self {
217 self.schedule_store_factory = Some(factory);
218 self
219 }
220
221 pub fn with_tool_context_extensions_factory(
223 mut self,
224 factory: crate::ToolContextExtensionsFactory,
225 ) -> Self {
226 self.tool_context_extensions_factory = Some(factory);
227 self
228 }
229
230 pub fn with_subagent_delegate_factory(
232 mut self,
233 factory: crate::SubagentDelegateFactory,
234 ) -> Self {
235 self.subagent_delegate_factory = Some(factory);
236 self
237 }
238
239 pub fn with_tool_augmentor(mut self, augmentor: Arc<dyn crate::HostToolAugmentor>) -> Self {
241 self.tool_augmentor = Some(augmentor);
242 self
243 }
244}
245
246#[async_trait]
247impl RuntimeAgentStore for InMemoryAgentStore {
248 async fn add_agent(&self, agent: AgentDefinition) -> Result<()> {
249 InMemoryAgentStore::add_agent(self, agent).await;
250 Ok(())
251 }
252}
253
254#[async_trait]
255impl RuntimeHarnessStore for InMemoryHarnessStore {
256 async fn add_harness(&self, harness_id: HarnessId, harness: HarnessDefinition) -> Result<()> {
257 InMemoryHarnessStore::add_harness(self, harness_id, harness).await;
258 Ok(())
259 }
260}
261
262#[async_trait]
263impl RuntimeSessionStore for InMemorySessionStore {
264 async fn add_session(&self, session: ExecutionSession) -> Result<()> {
265 InMemorySessionStore::add_session(self, session).await;
266 Ok(())
267 }
268}
269
270#[async_trait]
271impl RuntimeProviderStore for InMemoryProviderStore {
272 async fn set_default_model_spec(&self, model: ModelSpec) -> Result<()> {
273 InMemoryProviderStore::set_default_model_spec(self, model).await;
274 Ok(())
275 }
276}