vv-agent 0.4.1

VectorVein agent runtime, SDK, CLI, tools, and workspace backends
Documentation
use base64::{engine::general_purpose, Engine as _};

pub fn decode_api_key(raw_value: &str) -> String {
    let raw = raw_value.trim();
    if raw.is_empty() {
        return raw.to_string();
    }

    if let Some(direct) = extract_suffix_key(raw) {
        return direct;
    }

    if std::env::var("V_AGENT_ENABLE_BASE64_KEY_DECODE").as_deref() == Ok("1") {
        if let Some(decoded) = maybe_base64_decode(raw) {
            if let Some(from_decoded) = extract_suffix_key(&decoded) {
                return from_decoded;
            }
            if looks_like_api_key(&decoded) {
                return decoded;
            }
        }
    }

    raw.to_string()
}

fn extract_suffix_key(value: &str) -> Option<String> {
    let (_, suffix) = value.split_once(':')?;
    let suffix = suffix.trim();
    looks_like_api_key(suffix).then(|| suffix.to_string())
}

fn maybe_base64_decode(value: &str) -> Option<String> {
    let mut padded = value.to_string();
    let remainder = padded.len() % 4;
    if remainder != 0 {
        padded.extend(std::iter::repeat_n('=', 4 - remainder));
    }
    let decoded = general_purpose::STANDARD.decode(padded).ok()?;
    String::from_utf8(decoded).ok()
}

fn looks_like_api_key(value: &str) -> bool {
    !value.is_empty() && value.len() >= 10 && !value.chars().any(char::is_whitespace)
}