brainwires_agents/task_manager/
time_tracking.rs1use brainwires_core::TaskStatus;
6
7#[derive(Debug, Clone, Default)]
9pub struct TaskStats {
10 pub total: usize,
12 pub pending: usize,
14 pub in_progress: usize,
16 pub completed: usize,
18 pub failed: usize,
20 pub blocked: usize,
22 pub skipped: usize,
24}
25
26#[derive(Debug, Clone)]
28pub struct TaskTimeInfo {
29 pub task_id: String,
31 pub description: String,
33 pub status: TaskStatus,
35 pub started_at: Option<i64>,
37 pub completed_at: Option<i64>,
39 pub duration_secs: Option<i64>,
41 pub elapsed_secs: Option<i64>,
43}
44
45impl TaskTimeInfo {
46 pub fn format_duration(&self) -> String {
48 if let Some(duration) = self.duration_secs {
49 format_duration_secs(duration)
50 } else if let Some(elapsed) = self.elapsed_secs {
51 format!("{}...", format_duration_secs(elapsed))
52 } else {
53 "-".to_string()
54 }
55 }
56}
57
58#[derive(Debug, Clone, Default)]
60pub struct TimeStats {
61 pub total_duration_secs: i64,
63 pub completed_tasks: usize,
65 pub average_duration_secs: Option<i64>,
67 pub current_elapsed_secs: i64,
69 pub in_progress_tasks: usize,
71}
72
73impl TimeStats {
74 pub fn format_total(&self) -> String {
76 format_duration_secs(self.total_duration_secs)
77 }
78
79 pub fn format_average(&self) -> String {
81 if let Some(avg) = self.average_duration_secs {
82 format_duration_secs(avg)
83 } else {
84 "-".to_string()
85 }
86 }
87
88 pub fn format_elapsed(&self) -> String {
90 format_duration_secs(self.current_elapsed_secs)
91 }
92}
93
94pub fn format_duration_secs(secs: i64) -> String {
96 if secs < 0 {
97 return "-".to_string();
98 }
99
100 let hours = secs / 3600;
101 let minutes = (secs % 3600) / 60;
102 let seconds = secs % 60;
103
104 if hours > 0 {
105 format!("{}h {}m", hours, minutes)
106 } else if minutes > 0 {
107 format!("{}m {}s", minutes, seconds)
108 } else {
109 format!("{}s", seconds)
110 }
111}