use std::collections::BTreeMap;
use async_trait::async_trait;
use super::types::{
AgentBuildContext, AgentBuildDraft, AgentIdentity, CheckpointVersion, ContinuityGeneration,
ContinuityRecord, ContinuityResolveState, ContinuityStoreError, CustomizerError,
DurableAgentSpec, FencingToken, LeaseAcquireResult, LeaseError, LeaseGrant, LeaseRenewResult,
ManagedPeerEdge, RosterContext, RosterError, SessionSnapshot, TopologyContext, TopologyError,
};
use crate::mob_handle_runtime::SessionCreatedContext;
#[async_trait]
pub trait ContinuityStore: Send + Sync {
async fn resolve_many(
&self,
identities: &[AgentIdentity],
) -> Result<BTreeMap<AgentIdentity, ContinuityResolveState>, ContinuityStoreError>;
async fn load_session_snapshot(
&self,
session_id: &meerkat_core::types::SessionId,
) -> Result<Option<SessionSnapshot>, ContinuityStoreError>;
async fn delete_session_snapshot_if_current_revision(
&self,
_session_id: &meerkat_core::types::SessionId,
_expected_current_revision: &str,
) -> Result<bool, ContinuityStoreError> {
Ok(false)
}
async fn save_session_snapshot(
&self,
identity: &AgentIdentity,
session_id: &meerkat_core::types::SessionId,
generation: ContinuityGeneration,
version: CheckpointVersion,
fencing_token: FencingToken,
snapshot: &SessionSnapshot,
) -> Result<(), ContinuityStoreError>;
async fn upsert_continuity_record(
&self,
record: &ContinuityRecord,
fencing_token: FencingToken,
) -> Result<(), ContinuityStoreError>;
async fn delete_continuity_record(
&self,
identity: &AgentIdentity,
fencing_token: FencingToken,
) -> Result<(), ContinuityStoreError>;
}
#[async_trait]
pub trait LeaseProvider: Send + Sync {
async fn acquire_leases(
&self,
identities: &[AgentIdentity],
runtime_instance: &str,
) -> Result<BTreeMap<AgentIdentity, LeaseAcquireResult>, LeaseError>;
async fn renew_leases(
&self,
grants: &[LeaseGrant],
) -> Result<BTreeMap<AgentIdentity, LeaseRenewResult>, LeaseError>;
async fn release_leases(&self, grants: &[LeaseGrant]) -> Result<(), LeaseError>;
}
#[async_trait]
pub trait RosterProvider: Send + Sync {
async fn roster(&self, context: &RosterContext) -> Result<Vec<DurableAgentSpec>, RosterError>;
}
#[async_trait]
pub trait AgentCustomizer: Send + Sync {
async fn customize_build(
&self,
context: &AgentBuildContext,
spec: &DurableAgentSpec,
draft: &mut AgentBuildDraft,
) -> Result<(), CustomizerError>;
async fn after_create(
&self,
identity: &AgentIdentity,
session_id: &meerkat_core::types::SessionId,
context: &SessionCreatedContext,
) -> Result<(), CustomizerError> {
let _ = (identity, session_id, context);
Ok(())
}
}
#[async_trait]
pub trait TopologyProvider: Send + Sync {
async fn compute_edges(
&self,
target_identities: &[AgentIdentity],
context: &TopologyContext,
) -> Result<Vec<ManagedPeerEdge>, TopologyError>;
}