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)
}
}