magi-code 0.64.0

Repository-aware CLI coding agent for terminal work
Documentation
use super::super::render_scroll_view_persistent_state;
use super::{SYSTEM_PROMPT_MODAL, draw_modal_panel, modal_text_area};
use crate::tui::{state::MissionControlState, theme::MATRIX_GREEN};
use ratatui::{
    Frame,
    layout::Rect,
    widgets::{Paragraph, Wrap},
};

pub(crate) fn rewind_modal_text_area(area: Rect) -> Option<Rect> {
    modal_text_area(area, "Rewind", SYSTEM_PROMPT_MODAL)
}

pub(in crate::tui::render) fn draw_rewind_modal(
    frame: &mut Frame<'_>,
    area: Rect,
    state: &MissionControlState,
) {
    let Some(modal) = &state.modals.rewind_modal else {
        return;
    };
    let Some(text_area) = draw_modal_panel(frame, area, "Rewind", SYSTEM_PROMPT_MODAL) else {
        return;
    };
    let help = if modal.plan.is_some() || !modal.plans.is_empty() {
        "[Enter] apply rewind • [Esc] cancel • [Up]/[Down] select/scroll"
    } else {
        "[Esc] close • [Up]/[Down] scroll"
    };
    let prefix = if modal.plans.len() > 1 {
        format!(
            "Target {}/{}: turn {}\n\n",
            modal.selected + 1,
            modal.plans.len(),
            modal.plans[modal.selected].target_turn
        )
    } else {
        String::new()
    };
    let content = format!("{help}\n\n{prefix}{}", modal.content);
    let wrap_width = super::super::scroll_view_content_width(text_area).max(1);
    render_scroll_view_persistent_state(
        frame,
        text_area,
        super::super::usize_to_u16_saturating(crate::tui::transcript::ratatui_wrapped_visual_rows(
            &content, wrap_width,
        )),
        Paragraph::new(content)
            .style(MATRIX_GREEN.pane())
            .wrap(Wrap { trim: false }),
        &state.scroll_views.rewind_modal,
    );
}