Skip to main content

ai_agent/bridge/
repl_bridge_handle.rs

1//! REPL Bridge Handle types.
2//!
3//! Translated from openclaudecode/src/bridge/replBridgeHandle.ts
4
5use crate::session_history::SDKMessage;
6
7/// Handle for interacting with the REPL bridge.
8/// This is the main interface for sending/receiving messages through the bridge.
9pub trait ReplBridgeHandle: Send + Sync {
10    /// Get the bridge session ID (session_* or cse_* form).
11    fn bridge_session_id(&self) -> &str;
12
13    /// Get the environment ID (empty for env-less v2 bridge).
14    fn environment_id(&self) -> &str;
15
16    /// Get the session ingress URL.
17    fn session_ingress_url(&self) -> &str;
18
19    /// Write messages to the bridge.
20    fn write_messages(&self, messages: Vec<SDKMessage>);
21
22    /// Write SDK messages directly to the bridge.
23    fn write_sdk_messages(&self, messages: Vec<SDKMessage>);
24
25    /// Send a control request.
26    fn send_control_request(&self, request: crate::bridge::BridgeControlRequest);
27
28    /// Send a control response.
29    fn send_control_response(&self, response: crate::bridge::BridgeControlResponse);
30
31    /// Send a control cancel request.
32    fn send_control_cancel_request(&self, request_id: &str);
33
34    /// Send a result message.
35    fn send_result(&self);
36
37    /// Tear down the bridge connection.
38    async fn teardown(&self);
39}
40
41/// Bridge connection state.
42#[derive(Debug, Clone, PartialEq)]
43pub enum BridgeState {
44    Ready,
45    Connected,
46    Reconnecting,
47    Failed,
48}
49
50impl std::fmt::Display for BridgeState {
51    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
52        match self {
53            BridgeState::Ready => write!(f, "ready"),
54            BridgeState::Connected => write!(f, "connected"),
55            BridgeState::Reconnecting => write!(f, "reconnecting"),
56            BridgeState::Failed => write!(f, "failed"),
57        }
58    }
59}
60
61/// Bridge control request types.
62#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
63#[serde(tag = "type", rename_all = "snake_case")]
64pub enum BridgeControlRequest {
65    /// Request to use a tool.
66    #[serde(rename = "control_request")]
67    ToolUse {
68        request_id: String,
69        request: ToolUseRequest,
70    },
71    /// Request to begin a new conversation turn.
72    #[serde(rename = "control_request")]
73    TurnStart {
74        request_id: String,
75        request: TurnStartRequest,
76    },
77}
78
79/// Tool use request.
80#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
81pub struct ToolUseRequest {
82    pub name: String,
83    pub input: serde_json::Value,
84}
85
86/// Turn start request.
87#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
88pub struct TurnStartRequest {
89    pub turn_id: String,
90}
91
92/// Bridge control response types.
93#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
94#[serde(tag = "type", rename_all = "snake_case")]
95pub enum BridgeControlResponse {
96    /// Response to a tool use request.
97    #[serde(rename = "control_response")]
98    ToolUse {
99        request_id: String,
100        response: ToolUseResponse,
101    },
102    /// Response indicating the turn is complete.
103    #[serde(rename = "control_response")]
104    TurnEnd {
105        request_id: String,
106        response: TurnEndResponse,
107    },
108}
109
110/// Tool use response.
111#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
112pub struct ToolUseResponse {
113    pub content: Vec<serde_json::Value>,
114}
115
116/// Turn end response.
117#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
118pub struct TurnEndResponse {
119    /// The model that produced the response.
120    #[serde(default)]
121    pub model: Option<String>,
122    /// Total number of tokens used.
123    #[serde(default)]
124    pub tokens: Option<u32>,
125}
126
127/// Session state for reporting to CCR.
128#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
129#[serde(rename_all = "lowercase")]
130pub enum SessionState {
131    Idle,
132    Running,
133    RequiresAction,
134}