use std::path::PathBuf;
use serde::{Deserialize, Serialize};
use tracing::info;
pub struct BridgeState {
pub port: u16,
pub lock_file: PathBuf,
}
#[derive(Debug, Serialize)]
pub struct BridgeStatus {
pub session_id: String,
pub model: String,
pub cwd: String,
pub is_active: bool,
pub turn_count: usize,
pub tool_count: usize,
}
#[derive(Debug, Deserialize)]
pub struct BridgeMessageRequest {
pub content: String,
}
pub fn write_lock_file(port: u16, cwd: &str) -> Result<PathBuf, String> {
let lock_dir = dirs::cache_dir()
.unwrap_or_else(|| PathBuf::from("/tmp"))
.join("agent-code")
.join("bridge");
std::fs::create_dir_all(&lock_dir)
.map_err(|e| format!("Failed to create bridge lock dir: {e}"))?;
let lock_file = lock_dir.join(format!("{}.lock", std::process::id()));
let content = serde_json::json!({
"port": port,
"pid": std::process::id(),
"cwd": cwd,
"started_at": chrono::Utc::now().to_rfc3339(),
});
std::fs::write(&lock_file, serde_json::to_string_pretty(&content).unwrap())
.map_err(|e| format!("Failed to write lock file: {e}"))?;
info!("Bridge lock file: {}", lock_file.display());
Ok(lock_file)
}
pub fn remove_lock_file(lock_file: &PathBuf) {
if lock_file.exists() {
let _ = std::fs::remove_file(lock_file);
}
}
pub fn discover_bridges() -> Vec<BridgeInstance> {
let lock_dir = match dirs::cache_dir() {
Some(d) => d.join("agent-code").join("bridge"),
None => return Vec::new(),
};
if !lock_dir.is_dir() {
return Vec::new();
}
std::fs::read_dir(&lock_dir)
.ok()
.into_iter()
.flatten()
.flatten()
.filter_map(|entry| {
let content = std::fs::read_to_string(entry.path()).ok()?;
let data: serde_json::Value = serde_json::from_str(&content).ok()?;
let pid = data.get("pid")?.as_u64()? as u32;
let port = data.get("port")?.as_u64()? as u16;
let cwd = data.get("cwd")?.as_str()?.to_string();
let alive = std::process::Command::new("kill")
.args(["-0", &pid.to_string()])
.output()
.map(|o| o.status.success())
.unwrap_or(false);
if !alive {
let _ = std::fs::remove_file(entry.path());
return None;
}
Some(BridgeInstance { pid, port, cwd })
})
.collect()
}
#[derive(Debug)]
pub struct BridgeInstance {
pub pid: u32,
pub port: u16,
pub cwd: String,
}