use std::sync::Arc;
use std::sync::atomic::AtomicBool;
pub type SharedPlanMode = Arc<AtomicBool>;
#[must_use]
pub fn new_shared_plan_mode() -> SharedPlanMode {
Arc::new(AtomicBool::new(false))
}
const PLAN_CONTROL_TOOLS: &[&str] = &["EnterPlanMode", "ExitPlanMode"];
#[must_use]
pub fn is_plan_control_tool(name: &str) -> bool {
PLAN_CONTROL_TOOLS.contains(&name)
}
#[cfg(test)]
mod tests {
use super::*;
use std::sync::atomic::Ordering;
#[test]
fn defaults_to_false() {
let f = new_shared_plan_mode();
assert!(!f.load(Ordering::Relaxed));
}
#[test]
fn store_visible_across_clones() {
let a = new_shared_plan_mode();
let b = Arc::clone(&a);
b.store(true, Ordering::Relaxed);
assert!(a.load(Ordering::Relaxed));
}
#[test]
fn plan_control_tools_recognized() {
assert!(is_plan_control_tool("EnterPlanMode"));
assert!(is_plan_control_tool("ExitPlanMode"));
}
#[test]
fn non_control_tools_are_not_plan_control() {
for name in [
"Read", "Grep", "Glob", "WebFetch", "Skill", "Bash", "Write", "Edit",
] {
assert!(
!is_plan_control_tool(name),
"{name} should not be plan-control"
);
}
}
}