use crate::session_history::SDKMessage;
pub trait ReplBridgeHandle: Send + Sync {
fn bridge_session_id(&self) -> &str;
fn environment_id(&self) -> &str;
fn session_ingress_url(&self) -> &str;
fn write_messages(&self, messages: Vec<SDKMessage>);
fn write_sdk_messages(&self, messages: Vec<SDKMessage>);
fn send_control_request(&self, request: crate::bridge::BridgeControlRequest);
fn send_control_response(&self, response: crate::bridge::BridgeControlResponse);
fn send_control_cancel_request(&self, request_id: &str);
fn send_result(&self);
async fn teardown(&self);
}
#[derive(Debug, Clone, PartialEq)]
pub enum BridgeState {
Ready,
Connected,
Reconnecting,
Failed,
}
impl std::fmt::Display for BridgeState {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
BridgeState::Ready => write!(f, "ready"),
BridgeState::Connected => write!(f, "connected"),
BridgeState::Reconnecting => write!(f, "reconnecting"),
BridgeState::Failed => write!(f, "failed"),
}
}
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum BridgeControlRequest {
#[serde(rename = "control_request")]
ToolUse {
request_id: String,
request: ToolUseRequest,
},
#[serde(rename = "control_request")]
TurnStart {
request_id: String,
request: TurnStartRequest,
},
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct ToolUseRequest {
pub name: String,
pub input: serde_json::Value,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct TurnStartRequest {
pub turn_id: String,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum BridgeControlResponse {
#[serde(rename = "control_response")]
ToolUse {
request_id: String,
response: ToolUseResponse,
},
#[serde(rename = "control_response")]
TurnEnd {
request_id: String,
response: TurnEndResponse,
},
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct ToolUseResponse {
pub content: Vec<serde_json::Value>,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct TurnEndResponse {
#[serde(default)]
pub model: Option<String>,
#[serde(default)]
pub tokens: Option<u32>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum SessionState {
Idle,
Running,
RequiresAction,
}