use std::process::Command;
const SECRET_ENV_EXACT: &[&str] = &[
"GITHUB_TOKEN",
"GH_TOKEN",
"AWS_SECRET_ACCESS_KEY",
"AWS_SESSION_TOKEN",
"OPENAI_API_KEY",
"ANTHROPIC_API_KEY",
];
pub fn is_secret_env_name(name: &str) -> bool {
let n = name.to_ascii_uppercase();
if SECRET_ENV_EXACT.iter().any(|s| n == *s) {
return true;
}
if n.ends_with("_API_KEY") {
return true;
}
n.starts_with("WHYCODES_")
&& (n.ends_with("_TOKEN") || n.ends_with("_KEY") || n.ends_with("_SECRET"))
}
pub fn secret_env_names_present() -> Vec<String> {
let mut out = Vec::new();
for (k, _) in std::env::vars_os() {
let name = k.to_string_lossy();
if is_secret_env_name(&name) {
out.push(name.into_owned());
}
}
out
}
pub fn strip_secret_env_vars(mut remove: impl FnMut(&str)) {
for name in SECRET_ENV_EXACT {
remove(name);
}
for name in secret_env_names_present() {
remove(&name);
}
}
pub fn strip_std_command_secrets(cmd: &mut Command) {
strip_secret_env_vars(|name| {
cmd.env_remove(name);
});
}