adk_graph/
interrupt.rs

1//! Human-in-the-loop interrupt types
2
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6/// Interrupt request from a node or configuration
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub enum Interrupt {
9    /// Interrupt before executing a node
10    Before(String),
11    /// Interrupt after executing a node
12    After(String),
13    /// Dynamic interrupt from within a node
14    Dynamic {
15        /// Message to display to the user
16        message: String,
17        /// Optional data for the interrupt
18        data: Option<Value>,
19    },
20}
21
22impl std::fmt::Display for Interrupt {
23    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
24        match self {
25            Self::Before(node) => write!(f, "Interrupt before '{}'", node),
26            Self::After(node) => write!(f, "Interrupt after '{}'", node),
27            Self::Dynamic { message, .. } => write!(f, "Dynamic interrupt: {}", message),
28        }
29    }
30}
31
32/// Helper to create a dynamic interrupt from within a node
33pub fn interrupt(message: &str) -> Interrupt {
34    Interrupt::Dynamic { message: message.to_string(), data: None }
35}
36
37/// Helper to create a dynamic interrupt with data
38pub fn interrupt_with_data(message: &str, data: Value) -> Interrupt {
39    Interrupt::Dynamic { message: message.to_string(), data: Some(data) }
40}