use agy_bridge::{
AgyBridge,
config::AgentConfig,
hooks::{HookResult, Hooks, PreToolCallDecideContext, PreTurnContext},
};
#[tokio::main]
async fn main() -> Result<(), agy_bridge::error::Error> {
agy_bridge::load_dotenv();
let hooks = Hooks::new()
.with_pre_turn("turn_logger", |ctx: &PreTurnContext| {
println!(
" [hook:turn_logger] Turn {} prompt: {}",
ctx.turn_number, ctx.prompt
);
})
.with_pre_tool_call_decide("safety_gate", |ctx: &PreToolCallDecideContext| {
if ctx.tool_name == "dangerous_tool" {
println!(" [hook:safety_gate] Blocking tool: {}", ctx.tool_name);
HookResult::deny("dangerous_tool is not allowed")
} else {
HookResult::allow()
}
});
hooks.run_pre_turn(&PreTurnContext {
prompt: "Hello from the hook demo!".into(),
turn_number: 1,
});
let safe_result = hooks.run_pre_tool_call_decide(&PreToolCallDecideContext {
tool_name: "view_file".into(),
tool_args: serde_json::Value::Null,
});
println!(" view_file decision: allowed={}", safe_result.allow);
let blocked_result = hooks.run_pre_tool_call_decide(&PreToolCallDecideContext {
tool_name: "dangerous_tool".into(),
tool_args: serde_json::Value::Null,
});
println!(
" dangerous_tool decision: allowed={}, reason='{}'",
blocked_result.allow, blocked_result.message
);
let config = AgentConfig::default();
let bridge = AgyBridge::builder().build()?;
let agent = bridge.agent(config).hooks(hooks).await?;
let prompt = "Describe how hooks can guard agent behaviour.";
println!(" User: {prompt}");
let response_text = agent.chat(prompt).await?.text().await?;
println!(" Agent: {response_text}");
agent.shutdown().await?;
Ok(())
}