use super::engine::HookEngine;
use super::types::{HookContext, HookEvent, HookResult};
use serde_json::Value;
use std::sync::Arc;
pub struct HookTrigger {
engine: Arc<HookEngine>,
}
impl HookTrigger {
pub fn new(engine: Arc<HookEngine>) -> Self {
Self { engine }
}
pub async fn trigger(&self, event: HookEvent, data: Value) -> Vec<HookResult> {
let context = HookContext::new(event, data);
match self.engine.execute(&context).await {
Ok(results) => results,
Err(e) => {
tracing::error!("Hook execution error: {}", e);
Vec::new()
}
}
}
pub async fn system_start(&self) -> Vec<HookResult> {
self.trigger(HookEvent::SystemStart, Value::Null).await
}
pub async fn config_loaded(&self, config: &crate::config::runtime::RuntimeConfig) -> Vec<HookResult> {
let data = serde_json::json!({
"gateway_host": config.gateway.host.to_string(),
"gateway_port": config.gateway.port,
});
self.trigger(HookEvent::ConfigLoaded, data).await
}
pub async fn gateway_start(&self, host: &str, port: u16) -> Vec<HookResult> {
let data = serde_json::json!({
"host": host,
"port": port,
});
self.trigger(HookEvent::GatewayStart, data).await
}
pub async fn agent_create(&self, agent_name: &str) -> Vec<HookResult> {
let data = serde_json::json!({
"agent_name": agent_name,
});
self.trigger(HookEvent::AgentCreate, data).await
}
pub async fn agent_chat(&self, agent_name: &str, message: &str) -> Vec<HookResult> {
let data = serde_json::json!({
"agent_name": agent_name,
"message": message,
});
self.trigger(HookEvent::AgentChat, data).await
}
pub async fn agent_destroy(&self, agent_name: &str) -> Vec<HookResult> {
let data = serde_json::json!({
"agent_name": agent_name,
});
self.trigger(HookEvent::AgentDestroy, data).await
}
pub async fn skill_loaded(&self, skill_name: &str) -> Vec<HookResult> {
let data = serde_json::json!({
"skill_name": skill_name,
});
self.trigger(HookEvent::SkillLoaded, data).await
}
pub async fn skill_run_start(&self, skill_name: &str) -> Vec<HookResult> {
let data = serde_json::json!({
"skill_name": skill_name,
});
self.trigger(HookEvent::SkillRunStart, data).await
}
pub async fn skill_run_end(&self, skill_name: &str, success: bool) -> Vec<HookResult> {
let data = serde_json::json!({
"skill_name": skill_name,
"success": success,
});
self.trigger(HookEvent::SkillRunEnd, data).await
}
pub async fn cron_job_execute(&self, job_id: &str) -> Vec<HookResult> {
let data = serde_json::json!({
"job_id": job_id,
});
self.trigger(HookEvent::CronJobExecute, data).await
}
pub async fn message_received(&self, channel: &str, session_id: &str) -> Vec<HookResult> {
let data = serde_json::json!({
"channel": channel,
"session_id": session_id,
});
self.trigger(HookEvent::MessageReceived, data).await
}
pub async fn message_sent(&self, channel: &str, session_id: &str) -> Vec<HookResult> {
let data = serde_json::json!({
"channel": channel,
"session_id": session_id,
});
self.trigger(HookEvent::MessageSent, data).await
}
}