feat: Improved UX with colored spinners for parallel graph agents and no clobbering outputs for sub-agents

This commit is contained in:
2026-05-21 13:00:44 -06:00
parent 4e88cebe28
commit 209257c7b1
3 changed files with 39 additions and 36 deletions
+20 -14
View File
@@ -25,14 +25,16 @@ impl NodeTiming {
pub struct GraphLogger {
graph_name: String,
log_state_snapshots: bool,
silent: bool,
timings: IndexMap<String, NodeTiming>,
}
impl GraphLogger {
pub fn new(graph_name: &str, log_state_snapshots: bool) -> Self {
pub fn with_visibility(graph_name: &str, log_state_snapshots: bool, silent: bool) -> Self {
Self {
graph_name: graph_name.to_string(),
log_state_snapshots,
silent,
timings: IndexMap::new(),
}
}
@@ -42,13 +44,15 @@ impl GraphLogger {
"[graph:{}] start at '{}' ({} nodes)",
self.graph_name, start_node, node_count
);
eprintln!(
"{}",
dimmed_text(&format!(
"▸ graph: {} (start: {start_node})",
self.graph_name
))
);
if !self.silent {
eprintln!(
"{}",
dimmed_text(&format!(
"▸ graph: {} (start: {start_node})",
self.graph_name
))
);
}
}
pub fn graph_complete(&self, end_node: &str, elapsed: Duration) {
@@ -56,10 +60,12 @@ impl GraphLogger {
"[graph:{}] end '{}' (elapsed {:?})",
self.graph_name, end_node, elapsed
);
eprintln!(
"{}",
dimmed_text(&format!("▸ graph done in {:.2}s", elapsed.as_secs_f64()))
);
if !self.silent {
eprintln!(
"{}",
dimmed_text(&format!("▸ graph done in {:.2}s", elapsed.as_secs_f64()))
);
}
self.log_performance_summary();
}
@@ -157,7 +163,7 @@ mod tests {
#[test]
fn records_and_aggregates_node_timings() {
let mut logger = GraphLogger::new("g", false);
let mut logger = GraphLogger::with_visibility("g", false, false);
logger.record_timing("a", Duration::from_millis(100));
logger.record_timing("a", Duration::from_millis(300));
logger.record_timing("b", Duration::from_millis(50));
@@ -187,7 +193,7 @@ mod tests {
#[test]
fn new_logger_has_no_timings() {
let logger = GraphLogger::new("g", true);
let logger = GraphLogger::with_visibility("g", true, false);
assert!(logger.timings.is_empty());
assert!(logger.log_state_snapshots);