use std::sync::atomic::{AtomicBool, Ordering};
static SPAWN_PAUSED: AtomicBool = AtomicBool::new(false);
pub fn set_spawn_paused(paused: bool) -> bool {
SPAWN_PAUSED.store(paused, Ordering::SeqCst);
paused
}
pub fn is_spawn_paused() -> bool {
SPAWN_PAUSED.load(Ordering::SeqCst)
}
pub fn toggle_spawn_paused() -> bool {
set_spawn_paused(!is_spawn_paused())
}
pub fn spawn_blocked_message() -> Option<String> {
if is_spawn_paused() {
Some(
"Delegation spawning is paused. Clear the pause via the TUI (`p` in /agents) before retrying."
.into(),
)
} else {
None
}
}
#[cfg(test)]
pub struct SpawnPauseGuard {
previous: bool,
}
#[cfg(test)]
impl SpawnPauseGuard {
pub fn set(paused: bool) -> Self {
let previous = is_spawn_paused();
set_spawn_paused(paused);
Self { previous }
}
}
#[cfg(test)]
impl Drop for SpawnPauseGuard {
fn drop(&mut self) {
set_spawn_paused(self.previous);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
#[serial_test::serial(delegation_spawn_pause)]
fn toggle_and_set_round_trip() {
set_spawn_paused(false);
assert!(!is_spawn_paused());
assert!(set_spawn_paused(true));
assert!(is_spawn_paused());
assert!(!toggle_spawn_paused());
assert!(!is_spawn_paused());
}
}