use async_trait::async_trait;
use tokio::sync::mpsc;
use crate::error::Result;
use crate::event::{AgentEvent, FrontendMessage};
use crate::tool::ToolCallInfo;
#[async_trait]
pub trait Frontend: Send + Sync {
async fn on_event(&self, event: AgentEvent) -> Result<()>;
async fn request_tool_confirmation(&self, info: &ToolCallInfo) -> Result<bool>;
}
pub struct AgentChannels {
pub event_tx: mpsc::Sender<AgentEvent>,
pub message_rx: mpsc::Receiver<FrontendMessage>,
}
pub struct FrontendChannels {
pub event_rx: mpsc::Receiver<AgentEvent>,
pub message_tx: mpsc::Sender<FrontendMessage>,
}
pub fn create_channels(
event_buffer: usize,
message_buffer: usize,
) -> (AgentChannels, FrontendChannels) {
let (event_tx, event_rx) = mpsc::channel(event_buffer);
let (message_tx, message_rx) = mpsc::channel(message_buffer);
let agent_channels = AgentChannels {
event_tx,
message_rx,
};
let frontend_channels = FrontendChannels {
event_rx,
message_tx,
};
(agent_channels, frontend_channels)
}