magi-code 0.96.1

Repository-aware CLI coding agent for terminal work
Documentation
use super::*;

/// A full conversation projection, not the bounded subagent preview. Its state
/// survives hiding and uses the same card, selection, and prompt geometry.
#[derive(Debug)]
pub(crate) struct TranscriptModal {
    pub(crate) state: MissionControlState,
    pub(crate) visible: bool,
    pub(crate) active: bool,
    pub(crate) unread: bool,
}

impl TranscriptModal {
    pub(crate) fn new(mut state: MissionControlState) -> Self {
        state.transcript_only_layout = true;
        state.welcome_render_cache.get_mut().take();
        state.focus_prompt();
        Self {
            state,
            visible: true,
            active: false,
            unread: false,
        }
    }

    fn modal_area(area: Rect) -> Rect {
        crate::tui::modal_container::modal_area(area, 60, 60)
    }

    pub(crate) fn close_control_area(area: Rect) -> Option<Rect> {
        crate::tui::modal_container::close_control_area(Self::modal_area(area), Some("[Esc] close"))
    }

    pub(crate) fn content_area(area: Rect) -> Rect {
        Self::modal_area(area).inner(Margin {
            horizontal: 1,
            vertical: 1,
        })
    }

    pub(super) fn draw(&self, frame: &mut Frame<'_>) {
        if !self.visible {
            if self.active || self.unread {
                let label = match (self.active, self.unread) {
                    (true, true) => " /side running • unread ",
                    (true, false) => " /side running ",
                    _ => " /side unread ",
                };
                let area = frame.area();
                let width = (label.len() as u16).min(area.width);
                frame.render_widget(
                    Paragraph::new(label).style(self.state.theme.app()),
                    Rect::new(area.right().saturating_sub(width), area.y, width, 1),
                );
            }
            return;
        }
        let area = Self::modal_area(frame.area());
        let content = crate::tui::modal_container::draw_modal_container(
            frame,
            area,
            "Side",
            "[Alt+C] cancel · /reset",
            self.state.theme,
            Some("[Esc] close"),
        );
        super::draw_in_area(frame, content, &self.state);
    }
}

impl MissionControlState {
    pub(crate) fn focused_conversation_mut(&mut self) -> &mut Self {
        if self
            .conversation_modal
            .as_ref()
            .is_some_and(|modal| modal.visible)
        {
            &mut self
                .conversation_modal
                .as_mut()
                .expect("visible modal")
                .state
        } else {
            self
        }
    }
}