//! Initialize the embedded agent and start the resulting world through the CLI. use sausage::Host; use serde_json::{Value, json}; use std::process::{Command, Stdio}; /// Environment configuration creates a complete world with a callable agent. #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn init_builds_agent() { let temporary = std::env::temp_dir().join(format!("sausage-cli-{}", uuid::Uuid::now_v7())); std::fs::create_dir_all(&temporary).unwrap(); let world = temporary.join("world"); let output = Command::new(env!("CARGO_BIN_EXE_sausage")) .arg("init") .arg(&world) .env("SAUSAGE_API", "anthropic-messages") .env("SAUSAGE_BASE_URL", "http://127.0.0.1:1/") .env("SAUSAGE_MODEL", "init-test") .env("SAUSAGE_API_TOKEN", "fake-token") .stdin(Stdio::null()) .output() .unwrap(); assert!( output.status.success(), "stdout: {}\nstderr: {}", String::from_utf8_lossy(&output.stdout), String::from_utf8_lossy(&output.stderr) ); let stdout = String::from_utf8(output.stdout).unwrap(); assert!(stdout.contains("first agent build takes a few minutes")); assert!(stdout.contains("sausage run")); let config: Value = serde_json::from_slice(&std::fs::read(world.join("config/agent.json")).unwrap()).unwrap(); assert_eq!( config, json!({"api":"anthropic-messages","base_url":"http://127.0.0.1:1","model":"init-test","token":"fake-token"}) ); assert_eq!( serde_json::from_slice::(&std::fs::read(world.join("config/boot.json")).unwrap()) .unwrap(), json!([]) ); for file in [ "plugins/cargo/sdk/Cargo.toml", "plugins/cargo/sdk/src/lib.rs", "plugins/agent/source/Cargo.toml", "plugins/agent/source/src/main.rs", "plugins/agent/plugin.wasm", ] { assert!(world.join(file).is_file(), "missing {file}"); } let cache = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../target/sdk/cli-cache"); let host = Host::start_with_cache(&world, &cache).await.unwrap(); let doc = host.call("agent.rpc.discover", json!({})).await.unwrap(); assert_eq!(doc["x-sausage-grace"], 600); assert!( doc["methods"] .as_array() .unwrap() .iter() .any(|method| method["name"] == "chat") ); host.stop().await; std::fs::remove_dir_all(temporary).unwrap(); }