hello/hello.rs
1//! Minimal hello extension, mirroring the Go example in `doc/extensions.md`.
2
3use phi_ext::{phi, pxb};
4
5fn main() -> Result<(), phi::Error> {
6 let mut m = phi::Extension::new("hello", "0.1.0");
7
8 m.register_command(
9 "hello",
10 phi::Command::new("Say hi", |_args, ctx| {
11 ctx.notify("info", "Hello!");
12 // ctx.submit("follow-up"); // after /hello returns
13 // ctx.send_user_message("…"); // enqueue a turn anytime
14 Ok(())
15 }),
16 );
17
18 m.on_user_input(|_ev| {
19 // return Some(phi::UserInputResult { handled: true, ..Default::default() }) to swallow
20 // return Some(phi::UserInputResult { text: Some("rewritten".into()), ..Default::default() }) to transform
21 None
22 });
23
24 m.on_tool_call(|_ev| {
25 // return Some(phi::ToolCallResult { block: true, reason: "...".into(), ..Default::default() }) to deny
26 None
27 });
28
29 m.on_tool_result(|_ev| {
30 // return Some(phi::ToolResultResult { stop: true, ..Default::default() }) to end the agent loop
31 None
32 });
33
34 m.on_turn_stopping(|_ev| {
35 // return Some(phi::TurnStoppingResult { continue_: true, message: "check X".into(), ..Default::default() }) to steer
36 None
37 });
38
39 m.subscribe(pxb::Event::SessionStart, |ev| {
40 let _ = ev; // Reason, PreviousSessionID, …
41 });
42
43 m.run()
44}