use crate::controller::types::ControlCmd;
use crate::controller::{AskUserQuestionsRequest, ToolResultStatus, TurnId};
use crate::permissions::{BatchPermissionRequest, PermissionRequest};
#[derive(Debug, Clone)]
pub enum UiMessage {
TextChunk {
session_id: i64,
turn_id: Option<TurnId>,
text: String,
input_tokens: i64,
output_tokens: i64,
},
Display {
session_id: i64,
turn_id: Option<TurnId>,
message: String,
},
ToolExecuting {
session_id: i64,
turn_id: Option<TurnId>,
tool_use_id: String,
display_name: String,
display_title: String,
},
ToolCompleted {
session_id: i64,
turn_id: Option<TurnId>,
tool_use_id: String,
status: ToolResultStatus,
error: Option<String>,
},
Complete {
session_id: i64,
turn_id: Option<TurnId>,
input_tokens: i64,
output_tokens: i64,
stop_reason: Option<String>,
},
TokenUpdate {
session_id: i64,
turn_id: Option<TurnId>,
input_tokens: i64,
output_tokens: i64,
context_limit: i32,
},
Error {
session_id: i64,
turn_id: Option<TurnId>,
error: String,
},
System { session_id: i64, message: String },
CommandComplete {
session_id: i64,
command: ControlCmd,
success: bool,
message: Option<String>,
},
UserInteractionRequired {
session_id: i64,
tool_use_id: String,
request: AskUserQuestionsRequest,
turn_id: Option<TurnId>,
},
PermissionRequired {
session_id: i64,
tool_use_id: String,
request: PermissionRequest,
turn_id: Option<TurnId>,
},
BatchPermissionRequired {
session_id: i64,
batch: BatchPermissionRequest,
turn_id: Option<TurnId>,
},
}
pub mod channels {
use crate::controller::ControllerInputPayload;
use tokio::sync::mpsc;
use super::UiMessage;
pub use crate::controller::DEFAULT_CHANNEL_SIZE;
pub type ToControllerTx = mpsc::Sender<ControllerInputPayload>;
pub type ToControllerRx = mpsc::Receiver<ControllerInputPayload>;
pub type FromControllerTx = mpsc::Sender<UiMessage>;
pub type FromControllerRx = mpsc::Receiver<UiMessage>;
pub fn create_channels(
channel_size: Option<usize>,
) -> (
ToControllerTx,
ToControllerRx,
FromControllerTx,
FromControllerRx,
) {
let size = channel_size.unwrap_or(DEFAULT_CHANNEL_SIZE);
let (to_ctrl_tx, to_ctrl_rx) = mpsc::channel(size);
let (from_ctrl_tx, from_ctrl_rx) = mpsc::channel(size);
(to_ctrl_tx, to_ctrl_rx, from_ctrl_tx, from_ctrl_rx)
}
}