use std::sync::Arc;
use crate::phase::PhaseRuntime;
use crate::registry::{AgentResolver, ResolvedAgent};
use crate::state::MutationBatch;
use awaken_contract::contract::identity::RunIdentity;
use awaken_contract::contract::message::Message;
use super::AgentLoopError;
pub(super) struct PreparedRun {
pub agent: ResolvedAgent,
pub messages: Vec<Arc<Message>>,
}
pub(super) async fn prepare_run(
resolver: &dyn AgentResolver,
runtime: &PhaseRuntime,
initial_agent_id: &str,
initial_messages: Vec<Message>,
_run_identity: &RunIdentity,
) -> Result<PreparedRun, AgentLoopError> {
let store = runtime.store();
let mut messages: Vec<Arc<Message>> = initial_messages.into_iter().map(Arc::new).collect();
let agent = resolver
.resolve(initial_agent_id)
.map_err(AgentLoopError::RuntimeError)?;
if !agent.env.key_registrations.is_empty() {
store
.register_keys(&agent.env.key_registrations)
.map_err(AgentLoopError::PhaseError)?;
}
{
let mut activate_patch = MutationBatch::new();
for plugin in &agent.env.plugins {
plugin
.on_activate(&agent.spec, &mut activate_patch)
.map_err(AgentLoopError::PhaseError)?;
}
if !activate_patch.is_empty() {
store
.commit(activate_patch)
.map_err(AgentLoopError::PhaseError)?;
}
}
if agent.context_policy().is_some() {
crate::context::trim_to_compaction_boundary(&mut messages);
}
Ok(PreparedRun { agent, messages })
}