use std::process::Command;
pub fn is_enabled() -> bool {
std::env::var("BATTLECOMMAND_VOICE")
.map(|v| v == "1" || v == "true")
.unwrap_or(false)
}
pub fn say(message: &str) {
if !is_enabled() || !cfg!(target_os = "macos") {
return;
}
let msg = message.to_string();
tokio::spawn(async move {
let _ = Command::new("say").args(["-v", "Samantha", &msg]).output();
});
}
pub fn mission_start(prompt: &str) {
let short: String = prompt.chars().take(60).collect();
say(&format!("Mission starting. {}", short));
}
pub fn quality_gate(score: f32, passed: bool) {
if passed {
say(&format!(
"Quality gate passed with score {:.1}. Shipping production grade code.",
score
));
} else {
say(&format!(
"Quality gate failed. Score {:.1}. Starting fix round.",
score
));
}
}
pub fn fix_round(round: usize, max: usize) {
say(&format!("Fix round {} of {}.", round, max));
}
pub fn mission_complete(passed: bool, score: f32) {
if passed {
say(&format!(
"Mission complete. Production grade code shipped. Score {:.1}.",
score
));
} else {
say(&format!(
"Mission complete. Human review required. Best score {:.1}.",
score
));
}
}
pub fn decomposed(count: usize) {
say(&format!("Mission decomposed into {} subtasks.", count));
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_is_enabled_default() {
assert!(!is_enabled());
}
}