use rust_embed::RustEmbed;
use std::path::PathBuf;
pub const AGENTS_MD: &str = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/assets/AGENTS.md"));
pub const LABELS_YML: &str =
include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/assets/labels.yml"));
pub const AVAILABLE_MODELS_JSON: &str = include_str!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/assets/available-models.json"
));
#[derive(RustEmbed)]
#[folder = "assets/skills/"]
pub struct SkillAssets;
#[derive(RustEmbed)]
#[folder = "assets/workflows/"]
pub struct WorkflowAssets;
pub fn assets_dir() -> PathBuf {
#[cfg(not(target_arch = "wasm32"))]
let base = dirs::data_dir().unwrap_or_else(|| PathBuf::from("."));
#[cfg(target_arch = "wasm32")]
let base = PathBuf::from(".");
let dir = base.join("caretta");
let _ = std::fs::create_dir_all(&dir);
dir
}
pub fn materialize_assets() -> PathBuf {
let dir = assets_dir();
let agents_md = dir.join("AGENTS.md");
let _ = std::fs::write(&agents_md, AGENTS_MD.as_bytes());
for file in SkillAssets::iter() {
let path = dir.join("skills").join(file.as_ref());
if let Some(parent) = path.parent() {
let _ = std::fs::create_dir_all(parent);
}
if let Some(embedded) = SkillAssets::get(file.as_ref()) {
let _ = std::fs::write(&path, embedded.data);
}
}
for file in WorkflowAssets::iter() {
let path = dir.join("workflows").join(file.as_ref());
if let Some(parent) = path.parent() {
let _ = std::fs::create_dir_all(parent);
}
if let Some(embedded) = WorkflowAssets::get(file.as_ref()) {
let _ = std::fs::write(&path, embedded.data);
}
}
dir
}