magi-code 0.63.4

Repository-aware CLI coding agent for terminal work
Documentation
use crate::output::{CliRenderer, OutputEvent, OutputMode, OutputRenderer};
use anyhow::Result;
use std::io::Write;

pub(super) struct CliOutputSink<'a, W: Write> {
    renderer: CliRenderer<'a, W>,
    suppress_session_header: bool,
}

impl<'a, W: Write> CliOutputSink<'a, W> {
    #[cfg(test)]
    pub(super) fn new(writer: &'a mut W) -> Self {
        Self::with_mode(writer, OutputMode::Plain)
    }

    pub(super) fn with_mode(writer: &'a mut W, mode: OutputMode) -> Self {
        Self {
            renderer: CliRenderer::new(writer, mode),
            suppress_session_header: false,
        }
    }

    pub(super) fn suppress_session_header(mut self, suppress: bool) -> Self {
        self.suppress_session_header = suppress;
        self
    }

    pub(super) fn finish_line(&mut self) -> Result<()> {
        self.renderer.finish()
    }
}

impl<W: Write> crate::agent::AgentOutputSink for CliOutputSink<'_, W> {
    fn assistant_delta(&mut self, text: &str) -> Result<()> {
        self.renderer.render_assistant_delta(text)
    }

    fn output_event(&mut self, event: OutputEvent) -> Result<()> {
        if self.suppress_session_header && matches!(event, OutputEvent::SessionHeader { .. }) {
            return Ok(());
        }
        self.renderer.render(&event)
    }

    fn tool_block(&mut self, block: &str) -> Result<()> {
        self.renderer.render_tool_block(block)
    }
}