Skip to main content

agent_core_runtime/agent/
messages.rs

1// Message types for TUI-Controller communication
2//
3// These types are used to send events from the LLM controller to the TUI
4// and from the TUI to the controller.
5
6use crate::controller::types::ControlCmd;
7use crate::controller::{AskUserQuestionsRequest, ToolResultStatus, TurnId};
8use crate::permissions::{BatchPermissionRequest, PermissionRequest};
9
10/// Messages sent from the controller to the TUI for display
11#[derive(Debug, Clone)]
12pub enum UiMessage {
13    /// Streaming text chunk from LLM response
14    TextChunk {
15        session_id: i64,
16        turn_id: Option<TurnId>,
17        text: String,
18        input_tokens: i64,
19        output_tokens: i64,
20    },
21
22    /// General display message (tool status, info, etc.)
23    Display {
24        session_id: i64,
25        turn_id: Option<TurnId>,
26        message: String,
27    },
28
29    /// Tool execution has started
30    ToolExecuting {
31        session_id: i64,
32        turn_id: Option<TurnId>,
33        tool_use_id: String,
34        display_name: String,
35        display_title: String,
36    },
37
38    /// Tool execution has completed
39    ToolCompleted {
40        session_id: i64,
41        turn_id: Option<TurnId>,
42        tool_use_id: String,
43        status: ToolResultStatus,
44        error: Option<String>,
45    },
46
47    /// LLM response is complete
48    Complete {
49        session_id: i64,
50        turn_id: Option<TurnId>,
51        input_tokens: i64,
52        output_tokens: i64,
53        /// Stop reason from LLM - "tool_use" means tools will execute, "end_turn" means done
54        stop_reason: Option<String>,
55    },
56
57    /// Real-time token count update
58    TokenUpdate {
59        session_id: i64,
60        turn_id: Option<TurnId>,
61        input_tokens: i64,
62        output_tokens: i64,
63        context_limit: i32,
64    },
65
66    /// Error from the controller
67    Error {
68        session_id: i64,
69        turn_id: Option<TurnId>,
70        error: String,
71    },
72
73    /// System message (TUI-local, not from controller)
74    System { session_id: i64, message: String },
75
76    /// Control command completed
77    CommandComplete {
78        session_id: i64,
79        command: ControlCmd,
80        success: bool,
81        message: Option<String>,
82    },
83
84    /// Tool is blocked waiting for user interaction (e.g., AskUserQuestions)
85    UserInteractionRequired {
86        session_id: i64,
87        tool_use_id: String,
88        request: AskUserQuestionsRequest,
89        turn_id: Option<TurnId>,
90    },
91
92    /// Tool is blocked waiting for permission (e.g., AskForPermissions)
93    PermissionRequired {
94        session_id: i64,
95        tool_use_id: String,
96        request: PermissionRequest,
97        turn_id: Option<TurnId>,
98    },
99
100    /// Multiple tools are blocked waiting for batch permission.
101    /// This is used when parallel tools need permissions - presenting all requests
102    /// together avoids deadlocks and allows the user to make informed decisions.
103    BatchPermissionRequired {
104        session_id: i64,
105        batch: BatchPermissionRequest,
106        turn_id: Option<TurnId>,
107    },
108}
109
110/// Channel type aliases for TUI-Controller communication
111pub mod channels {
112    use crate::controller::ControllerInputPayload;
113    use tokio::sync::mpsc;
114
115    use super::UiMessage;
116
117    // Re-export from controller for backwards compatibility
118    pub use crate::controller::DEFAULT_CHANNEL_SIZE;
119
120    /// Sender for messages from TUI to controller
121    pub type ToControllerTx = mpsc::Sender<ControllerInputPayload>;
122    /// Receiver for messages from TUI to controller
123    pub type ToControllerRx = mpsc::Receiver<ControllerInputPayload>;
124
125    /// Sender for messages from controller to TUI
126    pub type FromControllerTx = mpsc::Sender<UiMessage>;
127    /// Receiver for messages from controller to TUI
128    pub type FromControllerRx = mpsc::Receiver<UiMessage>;
129
130    /// Creates a pair of channels for TUI-Controller communication
131    ///
132    /// # Arguments
133    /// * `channel_size` - Optional buffer size for channels. Uses DEFAULT_CHANNEL_SIZE if None.
134    pub fn create_channels(
135        channel_size: Option<usize>,
136    ) -> (ToControllerTx, ToControllerRx, FromControllerTx, FromControllerRx) {
137        let size = channel_size.unwrap_or(DEFAULT_CHANNEL_SIZE);
138        let (to_ctrl_tx, to_ctrl_rx) = mpsc::channel(size);
139        let (from_ctrl_tx, from_ctrl_rx) = mpsc::channel(size);
140        (to_ctrl_tx, to_ctrl_rx, from_ctrl_tx, from_ctrl_rx)
141    }
142}