codetether-agent 4.5.7

A2A-native AI coding agent for the CodeTether ecosystem
Documentation
use std::{panic, sync::Arc};

use super::terminal_state::restore_terminal_state;

type PanicHook = dyn Fn(&panic::PanicHookInfo<'_>) + Send + Sync + 'static;

pub(super) struct PanicHookGuard {
    previous: Arc<PanicHook>,
}

pub(super) fn install_panic_cleanup_hook() -> PanicHookGuard {
    let previous: Arc<PanicHook> = panic::take_hook().into();
    let hook = Arc::clone(&previous);
    panic::set_hook(Box::new(move |info| {
        restore_terminal_state();
        hook(info);
    }));
    PanicHookGuard { previous }
}

impl Drop for PanicHookGuard {
    fn drop(&mut self) {
        let previous = Arc::clone(&self.previous);
        panic::set_hook(Box::new(move |info| previous(info)));
    }
}