use std::sync::Arc;
use tokio_util::sync::CancellationToken;
use zeph_common::TaskSupervisor;
pub(crate) struct WorktreeCleanupGuard {
pub(crate) wm: Arc<zeph_worktree::DefaultWorktreeManager>,
pub(crate) handle: zeph_worktree::WorktreeHandle,
pub(crate) prune: bool,
pub(crate) enabled: bool,
pub(crate) task_supervisor: Option<TaskSupervisor>,
}
impl Drop for WorktreeCleanupGuard {
fn drop(&mut self) {
if !self.enabled {
return;
}
if tokio::runtime::Handle::try_current().is_err() {
tracing::error!(
"no tokio runtime in WorktreeCleanupGuard::drop — worktree cleanup skipped"
);
return;
}
let wm = Arc::clone(&self.wm);
let h = self.handle.clone();
let prune = self.prune;
let name: Arc<str> = Arc::from(format!("worktree-cleanup-{}", h.subagent_id));
let factory = move || async move {
if let Err(e) = wm.remove(&h, prune).await {
tracing::warn!(error = %e, "failed to remove sub-agent worktree");
}
};
match &self.task_supervisor {
Some(sup) => {
sup.spawn_oneshot(name, factory);
}
None => {
TaskSupervisor::new(CancellationToken::new()).spawn_oneshot(name, factory);
}
}
}
}