use std::path::PathBuf;
use std::process::ExitCode;
use tokio::io::AsyncWriteExt;
use tokio::net::UnixStream;
use trusty_memory::resolve_palace_registry_dir;
use trusty_memory::transport::uds::{socket_path, UDS_ADDR_FILE};
const SOCKET_ENV: &str = "TRUSTY_MEMORY_SOCKET";
fn resolve_socket_path() -> PathBuf {
if let Ok(p) = std::env::var(SOCKET_ENV) {
if !p.is_empty() {
return PathBuf::from(p);
}
}
if let Ok(data_dir) = trusty_common::resolve_data_dir("trusty-memory") {
let palace_registry_dir = resolve_palace_registry_dir(data_dir.clone());
if palace_registry_dir != data_dir {
let addr_file = palace_registry_dir.join(UDS_ADDR_FILE);
if let Ok(contents) = std::fs::read_to_string(&addr_file) {
let path = contents.trim();
if !path.is_empty() {
return PathBuf::from(path);
}
}
}
let addr_file = data_dir.join(UDS_ADDR_FILE);
if let Ok(contents) = std::fs::read_to_string(&addr_file) {
let path = contents.trim();
if !path.is_empty() {
return PathBuf::from(path);
}
}
}
socket_path()
}
#[tokio::main]
async fn main() -> ExitCode {
let sock_path = resolve_socket_path();
let sock = match UnixStream::connect(&sock_path).await {
Ok(s) => s,
Err(e) => {
eprintln!(
"trusty-memory-mcp-bridge: could not connect to daemon socket {}: {e}",
sock_path.display()
);
eprintln!(
"hint: start the daemon with `trusty-memory start` or `trusty-memory serve --foreground`"
);
return ExitCode::from(1);
}
};
let (mut sock_r, mut sock_w) = sock.into_split();
let mut stdin = tokio::io::stdin();
let mut stdout = tokio::io::stdout();
let upstream = async move {
let n = tokio::io::copy(&mut stdin, &mut sock_w).await?;
sock_w.shutdown().await?;
Ok::<u64, std::io::Error>(n)
};
let downstream = async move {
let n = tokio::io::copy(&mut sock_r, &mut stdout).await?;
stdout.flush().await?;
Ok::<u64, std::io::Error>(n)
};
tokio::select! {
res = upstream => match res {
Ok(_) => ExitCode::from(0),
Err(e) => {
eprintln!("trusty-memory-mcp-bridge: stdin→socket copy failed: {e}");
ExitCode::from(1)
}
},
res = downstream => match res {
Ok(_) => ExitCode::from(0),
Err(e) => {
eprintln!("trusty-memory-mcp-bridge: socket→stdout copy failed: {e}");
ExitCode::from(1)
}
},
}
}