mod assistant_segments;
#[cfg(test)]
#[path = "assistant_segments_tests.rs"]
mod assistant_segments_tests;
mod structured_stream;
#[cfg(test)]
#[path = "structured_stream_tests.rs"]
mod structured_stream_tests;
mod summary;
#[cfg(test)]
#[path = "summary_tests.rs"]
mod summary_tests;
mod todocards;
#[cfg(test)]
#[path = "todocards_tests.rs"]
mod todocards_tests;
mod toolcards;
#[cfg(test)]
#[path = "toolcards_tests.rs"]
mod toolcards_tests;
mod truncate;
#[cfg(test)]
#[path = "truncate_tests.rs"]
mod truncate_tests;
pub(crate) use assistant_segments::{
assistant_segments_to_lines_with_meta, parse_assistant_segments,
};
pub(crate) use structured_stream::build_streaming_transcript_view;
pub(crate) use summary::transcript_to_lines;
pub(crate) use toolcards::{render_tool_card, tool_summary_cli};
pub(crate) use truncate::truncate_chars_cli;
use crate::app::agent::agent::loop_::cli::theme::{
ACCENT_CYAN, ACCENT_RED, SUCCESS, TEXT_SUBTLE, WARNING,
};
use ratatui::style::{Color, Modifier, Style};
use ratatui::text::{Line, Span};
use std::collections::BTreeSet;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) struct ThinkBlockMeta {
pub(crate) id: u64,
pub(crate) open: bool,
}
pub(crate) fn think_block_expanded(
meta: ThinkBlockMeta,
expand_think_all: bool,
think_detail_overrides: &BTreeSet<u64>,
) -> bool {
if expand_think_all {
return true;
}
if think_detail_overrides.contains(&meta.id) { !meta.open } else { meta.open }
}
#[cfg(test)]
mod tests;
#[derive(Clone, Copy)]
pub(crate) enum TranscriptRole {
System,
User,
Assistant,
Progress,
Error,
}
#[derive(Clone)]
pub(crate) struct TranscriptEntry {
pub(crate) role: TranscriptRole,
pub(crate) at: chrono::DateTime<chrono::Local>,
pub(crate) text: String,
}
impl TranscriptEntry {
pub(crate) fn new(role: TranscriptRole, text: impl Into<String>) -> Self {
Self { role, at: chrono::Local::now(), text: text.into() }
}
}
pub(crate) fn wrap_trim_disabled() -> ratatui::widgets::Wrap {
ratatui::widgets::Wrap { trim: false }
}
pub(crate) fn transcript_prefix_style(role: TranscriptRole) -> (String, Color, Style) {
let (prefix, color) = match role {
TranscriptRole::System => ("", TEXT_SUBTLE),
TranscriptRole::User => ("> ", SUCCESS),
TranscriptRole::Assistant => ("● ", ACCENT_CYAN),
TranscriptRole::Progress => ("", WARNING),
TranscriptRole::Error => ("", ACCENT_RED),
};
let style = Style::default().fg(color).add_modifier(Modifier::BOLD);
(prefix.to_string(), color, style)
}
pub(crate) fn default_empty_transcript_line() -> Line<'static> {
Line::from(Span::styled("Ready. Type /help for commands.", Style::default().fg(TEXT_SUBTLE)))
}