aura-gui 0.2.2

UI nativa acelerada por GPU para escritorio, Android e iOS, en un solo crate: estilo tipo Tailwind, componentes, sombras, animaciones y agentes de IA. Reposo a cero. Licencia AGPL-3.0 o comercial.
//! Claves de API: almacén seguro del sistema (llavero de macOS, Administrador de credenciales de Windows, Secret
//! Service de Linux) y, si no hay, variable de entorno. Nunca se guardan en `settings.json` ni en el log.

use crate::core::platform::secrets;

const SERVICE: &str = "aura-ai";

/// Variable de entorno que se consulta si el almacén no tiene la clave.
fn env_name(provider: &str) -> String {
    if let Some(hosted) = crate::ai::catalog::hosted(provider) {
        return hosted.env.into();
    }
    match provider {
        // Así la llama la documentación de Inception (Mercury).
        "mercury" => "INCEPTION_API_KEY".into(),
        other => format!("{}_API_KEY", other.to_uppercase().replace('-', "_")),
    }
}

/// Clave guardada para `provider` ("anthropic", "openai"…): primero el almacén, luego el entorno.
pub fn get(provider: &str) -> Option<String> {
    secrets::get(SERVICE, provider)
        .or_else(|| std::env::var(env_name(provider)).ok())
        .filter(|key| !key.trim().is_empty())
}

/// Valor guardado bajo `slot`, sin mirar variables de entorno (para tokens de sesión).
pub fn get_exact(slot: &str) -> Option<String> {
    secrets::get(SERVICE, slot).filter(|value| !value.trim().is_empty())
}

/// Guarda (o reemplaza) la clave en el almacén del sistema.
pub fn set(provider: &str, key: &str) -> Result<(), String> {
    secrets::set(SERVICE, provider, key).map_err(|error| format!("{error}; o exporta {}", env_name(provider)))
}

pub fn remove(provider: &str) -> Result<(), String> {
    secrets::remove(SERVICE, provider)
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn nombres_de_variable_por_proveedor() {
        assert_eq!(env_name("anthropic"), "ANTHROPIC_API_KEY");
        assert_eq!(env_name("openai"), "OPENAI_API_KEY");
        assert_eq!(env_name("open-router"), "OPEN_ROUTER_API_KEY");
    }
}