use async_trait::async_trait;
use everruns_capability::CapabilityRef as AgentCapabilityConfig;
use everruns_core::ExecutionSession;
use everruns_provider::error::Result;
use everruns_provider::typed_id::SessionId;
#[async_trait]
pub trait SessionMutator: Send + Sync {
async fn update_session_title(
&self,
session_id: SessionId,
title: String,
) -> Result<ExecutionSession>;
async fn upsert_session_capability(
&self,
_session_id: SessionId,
_capability: AgentCapabilityConfig,
) -> Result<ExecutionSession> {
Err(everruns_provider::error::AgentLoopError::store(
"session backend does not support live capability reconfiguration",
))
}
async fn remove_session_capability(
&self,
_session_id: SessionId,
_capability_id: &str,
) -> Result<ExecutionSession> {
Err(everruns_provider::error::AgentLoopError::store(
"session backend does not support live capability reconfiguration",
))
}
}
#[async_trait]
impl<T: SessionMutator + ?Sized> SessionMutator for std::sync::Arc<T> {
async fn update_session_title(
&self,
session_id: SessionId,
title: String,
) -> Result<ExecutionSession> {
(**self).update_session_title(session_id, title).await
}
async fn upsert_session_capability(
&self,
session_id: SessionId,
capability: AgentCapabilityConfig,
) -> Result<ExecutionSession> {
(**self)
.upsert_session_capability(session_id, capability)
.await
}
async fn remove_session_capability(
&self,
session_id: SessionId,
capability_id: &str,
) -> Result<ExecutionSession> {
(**self)
.remove_session_capability(session_id, capability_id)
.await
}
}
#[derive(Clone)]
pub struct SessionMutatorExt(pub std::sync::Arc<dyn SessionMutator>);