use uuid::Uuid;
use crate::engine::{MemoryContext, TurnOutcome};
use ainl_graph_extractor::ExtractionReport;
#[cfg(feature = "async")]
use crate::engine::{PatchDispatchContext, TurnInput};
pub trait TurnHooks: Send + Sync {
fn on_artifact_loaded(&self, _agent_id: &str, _node_count: usize) {}
fn on_persona_compiled(&self, _contribution: Option<&str>) {}
fn on_memory_context_ready(&self, _ctx: &MemoryContext) {}
fn on_episode_recorded(&self, _episode_id: Uuid) {}
fn on_patch_dispatched(&self, _label: &str, _fitness: f32) {}
fn on_extraction_complete(&self, _report: &ExtractionReport) {}
fn on_emit(&self, _target: &str, _payload: &serde_json::Value) {}
fn on_turn_complete(&self, _outcome: &TurnOutcome) {}
}
pub struct NoOpHooks;
impl TurnHooks for NoOpHooks {}
#[cfg(feature = "async")]
#[async_trait::async_trait]
pub trait TurnHooksAsync: Send + Sync {
async fn on_turn_start(&self, _input: &TurnInput) {}
async fn on_patch_dispatched(
&self,
_ctx: &PatchDispatchContext<'_>,
) -> Result<serde_json::Value, String> {
Ok(serde_json::Value::Null)
}
async fn on_turn_complete(&self, _outcome: &TurnOutcome) {}
}
#[cfg(feature = "async")]
pub struct NoOpAsyncHooks;
#[cfg(feature = "async")]
#[async_trait::async_trait]
impl TurnHooksAsync for NoOpAsyncHooks {}