use ai_agent::hooks::{HOOK_EVENTS, HookDefinition, HookInput, HookRegistry};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("--- Example 19: Hooks System ---\n");
println!("Available hook events:");
for event in HOOK_EVENTS {
println!(" - {}", event);
}
println!("\n--- Creating Hook Registry ---");
let mut registry = HookRegistry::new();
println!("Created hook registry");
println!("\n--- Registering PreToolUse Hook ---");
registry.register(
"PreToolUse",
HookDefinition {
command: Some("echo PreToolUse: $(date +%T)".to_string()),
timeout: Some(5000),
matcher: Some("Read.*".to_string()), },
);
println!("Registered PreToolUse hook for Read tool");
registry.register(
"PreToolUse",
HookDefinition {
command: Some("echo Any tool is about to run".to_string()),
timeout: Some(3000),
matcher: None, },
);
println!("Registered PreToolUse hook for all tools");
println!("\n--- Checking Hooks ---");
println!("Has PreToolUse hooks: {}", registry.has_hooks("PreToolUse"));
println!(
"Has PostToolUse hooks: {}",
registry.has_hooks("PostToolUse")
);
println!("\n--- Executing Hooks ---");
let mut input = HookInput::new("PreToolUse");
input.tool_name = Some("Read".to_string());
input.tool_input = Some(serde_json::json!({
"file_path": "/tmp/test.txt",
"offset": 1,
"limit": 100
}));
input.tool_use_id = Some("toolu_12345".to_string());
input.cwd = Some("/home/user".to_string());
println!("Executing PreToolUse hooks for Read tool...");
println!(" Tool: {}", input.tool_name.as_ref().unwrap());
println!(" Input: {:?}", input.tool_input);
let results = registry.execute("PreToolUse", input).await;
println!("\nHook execution results:");
for (i, result) in results.iter().enumerate() {
println!(" Hook {}:", i + 1);
if let Some(msg) = &result.message {
println!(" Message: {}", msg);
}
if let Some(perm) = &result.permission_update {
println!(" Permission: {:?}", perm);
}
}
println!("\n--- Executing Hooks for Bash Tool ---");
let mut input_bash = HookInput::new("PreToolUse");
input_bash.tool_name = Some("Bash".to_string());
input_bash.tool_input = Some(serde_json::json!({
"command": "ls -la"
}));
let results_bash = registry.execute("PreToolUse", input_bash).await;
println!(
"Results for Bash tool: {} hooks matched",
results_bash.len()
);
println!("\n--- PostToolUse Hook ---");
registry.register(
"PostToolUse",
HookDefinition {
command: Some("echo PostToolUse completed".to_string()),
timeout: Some(5000),
matcher: None,
},
);
let mut post_input = HookInput::new("PostToolUse");
post_input.tool_name = Some("Glob".to_string());
post_input.tool_output = Some(serde_json::json!({
"files": ["a.rs", "b.rs", "c.rs"]
}));
let post_results = registry.execute("PostToolUse", post_input).await;
println!("PostToolUse results: {} hooks executed", post_results.len());
println!("\n--- SessionStart Hook ---");
registry.register(
"SessionStart",
HookDefinition {
command: Some("echo Session started at $(date)".to_string()),
timeout: Some(3000),
matcher: None,
},
);
let session_input = HookInput::new("SessionStart");
let session_results = registry.execute("SessionStart", session_input).await;
println!(
"SessionStart results: {} hooks executed",
session_results.len()
);
println!("\n--- done ---");
Ok(())
}