#![allow(dead_code)]
use std::path::PathBuf;
use std::sync::Once;
use agent_os_client::config::AgentOsConfig;
use agent_os_client::AgentOs;
static INIT: Once = Once::new();
pub fn ensure_sidecar_env() {
INIT.call_once(|| {
if std::env::var("AGENT_OS_SIDECAR_BIN").is_err() {
let bin = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.join("../../target/debug/agent-os-sidecar");
#[allow(unused_unsafe)]
unsafe {
std::env::set_var("AGENT_OS_SIDECAR_BIN", bin);
}
}
});
}
pub fn sidecar_available() -> bool {
ensure_sidecar_env();
std::env::var("AGENT_OS_SIDECAR_BIN")
.map(|path| PathBuf::from(path).exists())
.unwrap_or(false)
}
pub async fn new_vm() -> AgentOs {
ensure_sidecar_env();
AgentOs::create(AgentOsConfig::default())
.await
.expect("create VM against real sidecar")
}
pub fn coreutils_wasm_dir() -> Option<PathBuf> {
let pnpm = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../../node_modules/.pnpm");
for entry in std::fs::read_dir(&pnpm).ok()?.flatten() {
if entry
.file_name()
.to_string_lossy()
.starts_with("@rivet-dev+agent-os-coreutils@")
{
let wasm = entry
.path()
.join("node_modules/@rivet-dev/agent-os-coreutils/wasm");
if wasm.is_dir() {
return std::fs::canonicalize(&wasm).ok();
}
}
}
None
}
pub async fn new_vm_with_commands() -> Option<AgentOs> {
ensure_sidecar_env();
let wasm_dir = coreutils_wasm_dir()?;
let config = AgentOsConfig {
software: vec![agent_os_client::SoftwareInput {
package: wasm_dir.to_string_lossy().into_owned(),
version: None,
kind: agent_os_client::SoftwareKind::WasmCommands,
}],
..Default::default()
};
Some(
AgentOs::create(config)
.await
.expect("create VM with coreutils command software"),
)
}
pub async fn wasm_commands_available(os: &AgentOs) -> bool {
os.exec("sh", agent_os_client::ExecOptions::default())
.await
.is_ok()
}