Skip to main content

codetether_agent/tui/app/state/
timing.rs

1//! Request timing / latency tracking methods.
2//!
3//! First-token and last-token timestamps per request; completed timings
4//! are promoted to `last_request_*` fields for the UI.
5
6use std::time::Instant;
7
8impl super::AppState {
9    pub fn begin_request_timing(&mut self) {
10        self.processing_started_at = Some(Instant::now());
11        self.current_request_first_token_ms = None;
12        self.current_request_last_token_ms = None;
13    }
14
15    pub fn current_request_elapsed_ms(&self) -> Option<u64> {
16        self.processing_started_at
17            .map(|started| started.elapsed().as_millis() as u64)
18    }
19
20    pub fn note_text_token(&mut self) {
21        let Some(elapsed_ms) = self.current_request_elapsed_ms() else {
22            return;
23        };
24        if self.current_request_first_token_ms.is_none() {
25            self.current_request_first_token_ms = Some(elapsed_ms);
26        }
27        self.current_request_last_token_ms = Some(elapsed_ms);
28    }
29
30    pub fn complete_request_timing(&mut self) {
31        self.last_request_first_token_ms = self.current_request_first_token_ms;
32        self.last_request_last_token_ms = self.current_request_last_token_ms;
33        self.clear_request_timing();
34    }
35
36    pub fn clear_request_timing(&mut self) {
37        self.processing_started_at = None;
38        self.current_request_first_token_ms = None;
39        self.current_request_last_token_ms = None;
40    }
41}