use crate::tool_types::CompactStr;
pub type ToolOutputId = u64;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CompactActivityMetadata {
pub group_id: u64,
pub command_count: usize,
pub command: Option<CompactStr>,
pub hidden_line_count: usize,
pub suffix: Option<CompactStr>,
pub review_anchor: Option<ToolOutputId>,
pub review_anchors: Vec<ToolOutputId>,
}
impl CompactActivityMetadata {
pub fn display_text(&self) -> String {
let mut text = if self.command_count > 1 {
format!("• Ran {} commands", self.command_count)
} else {
format!("• Ran {}", self.command.as_deref().unwrap_or("command"))
};
if self.command_count == 1 && self.hidden_line_count > 0 {
text.push_str(&format!(" · … +{} lines", self.hidden_line_count));
}
if let Some(suffix) = self.suffix.as_deref().filter(|suffix| !suffix.is_empty()) {
text.push_str(" · ");
text.push_str(suffix);
}
text
}
}
#[cfg(test)]
mod tests {
use super::CompactActivityMetadata;
#[test]
fn compact_activity_display_includes_single_command_output_count() {
let activity = CompactActivityMetadata {
group_id: 1,
command_count: 1,
command: Some("cargo check".into()),
hidden_line_count: 3,
suffix: None,
review_anchor: Some(7),
review_anchors: vec![7],
};
assert_eq!(activity.display_text(), "• Ran cargo check · … +3 lines");
}
#[test]
fn compact_activity_display_collapses_grouped_commands() {
let activity = CompactActivityMetadata {
group_id: 2,
command_count: 4,
command: None,
hidden_line_count: 12,
suffix: Some("output retained".into()),
review_anchor: Some(9),
review_anchors: vec![9],
};
assert_eq!(activity.display_text(), "• Ran 4 commands · output retained");
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CompactToolSummaryLine {
pub kind: CompactToolSummaryLineKind,
pub text: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CompactToolSummaryLineKind {
Info,
Detail,
}