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}