use super::DraftJournal;
use crate::auth_lys::live::drafts::{DraftError, JournalLimits};
use liminal::durability::DurableStore;
use std::sync::Arc;
pub struct AgentBindings {
pub bounds: crate::agents::config::AgentsConfig,
pub network: String,
pub supervisor: liminal::channel::ChannelSupervisor,
pub device: String,
pub placer: Option<Arc<dyn crate::services::lifecycle::Placer>>,
pub seats: Option<Arc<dyn crate::agents::registry::AgentSeats>>,
}
#[derive(Debug)]
pub struct ApprovalAgents {
journal: Arc<DraftJournal>,
agents: Arc<crate::agents::runtime::Agents>,
}
impl ApprovalAgents {
pub fn open(
store: Arc<dyn DurableStore>,
limits: JournalLimits,
bindings: AgentBindings,
) -> Result<Arc<Self>, DraftError> {
let journal = DraftJournal::open(store, limits)?;
let wrapped: Arc<dyn DurableStore> = journal.clone();
let agents = crate::agents::runtime::Agents::open(
wrapped,
bindings.bounds,
bindings.network,
bindings.supervisor,
&bindings.device,
bindings.placer,
bindings.seats,
)
.map_err(|_| DraftError::Store)?;
for (name, mut waiting) in journal.read(|snapshot| snapshot.waiting.clone())? {
waiting.gone = agents
.presence()
.connection(&name)
.map_err(|_| DraftError::Store)?
.is_none();
agents
.retained()
.publish(&[(
format!("agents.{name}.state"),
waiting.snapshot().map_err(|_| DraftError::Store)?,
)])
.map_err(|_| DraftError::Store)?;
}
Ok(Arc::new(Self { journal, agents }))
}
#[must_use]
pub const fn agents(&self) -> &Arc<crate::agents::runtime::Agents> {
&self.agents
}
#[must_use]
pub const fn journal(&self) -> &Arc<DraftJournal> {
&self.journal
}
}