lingshu-plugins 0.10.0

Shared plugin discovery, manifest parsing, skill loading, and runtime helpers
use crate::types::SkillReadinessStatus;

pub const REMOTE_ENV_BACKENDS: &[&str] = &["docker", "singularity", "modal", "ssh", "daytona"];

pub fn resolve_skill_readiness(required_env: &[String]) -> SkillReadinessStatus {
    let missing: Vec<String> = required_env
        .iter()
        .filter(|name| std::env::var(name.as_str()).is_err())
        .cloned()
        .collect();
    if missing.is_empty() {
        return SkillReadinessStatus::Available;
    }
    let remote_backend = std::env::var("HERMES_ENVIRONMENT")
        .ok()
        .map(|value| value.to_ascii_lowercase())
        .filter(|value| {
            REMOTE_ENV_BACKENDS
                .iter()
                .any(|candidate| candidate == value)
        })
        .or_else(|| {
            std::env::var("EDGECRAB_ENVIRONMENT")
                .ok()
                .map(|value| value.to_ascii_lowercase())
                .filter(|value| {
                    REMOTE_ENV_BACKENDS
                        .iter()
                        .any(|candidate| candidate == value)
                })
        });
    if let Some(backend) = remote_backend {
        return SkillReadinessStatus::Unsupported {
            reason: format!("missing required environment variables in remote backend {backend}"),
        };
    }
    SkillReadinessStatus::SetupNeeded { missing }
}