agtrace_engine/session/extensions.rs
1//! Extension traits for session analysis.
2//!
3//! These traits provide complex computation logic for session types
4//! defined in agtrace-types, keeping the types crate lightweight and
5//! focused on data structures while engine handles analysis logic.
6
7use super::types::{AgentSession, TurnMetrics};
8
9/// Extension trait for `AgentSession` providing analysis and metrics computation.
10pub trait SessionAnalysisExt {
11 /// Compute presentation metrics for all turns
12 fn compute_turn_metrics(&self, max_context: Option<u32>) -> Vec<TurnMetrics>;
13}
14
15impl SessionAnalysisExt for AgentSession {
16 fn compute_turn_metrics(&self, max_context: Option<u32>) -> Vec<TurnMetrics> {
17 let mut cumulative_total = 0u32;
18 let mut metrics = Vec::new();
19 let total_turns = self.turns.len();
20
21 for (idx, turn) in self.turns.iter().enumerate() {
22 let turn_end_cumulative = turn.cumulative_total_tokens(cumulative_total);
23 let delta = turn_end_cumulative.saturating_sub(cumulative_total);
24 let prev_total = cumulative_total;
25
26 // Last turn is always active during streaming to avoid flicker
27 // when steps transition between InProgress and Done
28 let is_active = if idx == total_turns.saturating_sub(1) {
29 // For streaming sessions, last turn is active regardless of step status
30 // This prevents "CURRENT TURN" display from flickering during step transitions
31 true
32 } else {
33 false
34 };
35
36 metrics.push(TurnMetrics {
37 turn_index: idx,
38 prev_total,
39 delta,
40 is_heavy: TurnMetrics::is_delta_heavy(delta, max_context),
41 is_active,
42 });
43
44 cumulative_total = turn_end_cumulative;
45 }
46
47 metrics
48 }
49}