agtrace_runtime/domain/
events.rs

1use agtrace_types::{AgentEvent, EventPayload};
2
3pub struct EventFilters {
4    pub hide: Option<Vec<String>>,
5    pub only: Option<Vec<String>>,
6}
7
8pub fn filter_events(events: &[AgentEvent], filters: EventFilters) -> Vec<AgentEvent> {
9    let mut filtered = events.to_vec();
10
11    if let Some(only_patterns) = filters.only {
12        filtered.retain(|e| {
13            only_patterns.iter().any(|pattern| {
14                let pattern_lower = pattern.to_lowercase();
15                match &e.payload {
16                    EventPayload::User(_) => pattern_lower == "user",
17                    EventPayload::Message(_) => {
18                        pattern_lower == "assistant" || pattern_lower == "message"
19                    }
20                    EventPayload::ToolCall(_) | EventPayload::ToolResult(_) => {
21                        pattern_lower == "tool"
22                    }
23                    EventPayload::Reasoning(_) => pattern_lower == "reasoning",
24                    EventPayload::TokenUsage(_) => {
25                        pattern_lower == "token" || pattern_lower == "tokenusage"
26                    }
27                    EventPayload::Notification(_) => {
28                        pattern_lower == "notification" || pattern_lower == "info"
29                    }
30                }
31            })
32        });
33    }
34
35    if let Some(hide_patterns) = filters.hide {
36        filtered.retain(|e| {
37            !hide_patterns.iter().any(|pattern| {
38                let pattern_lower = pattern.to_lowercase();
39                match &e.payload {
40                    EventPayload::User(_) => pattern_lower == "user",
41                    EventPayload::Message(_) => {
42                        pattern_lower == "assistant" || pattern_lower == "message"
43                    }
44                    EventPayload::ToolCall(_) | EventPayload::ToolResult(_) => {
45                        pattern_lower == "tool"
46                    }
47                    EventPayload::Reasoning(_) => pattern_lower == "reasoning",
48                    EventPayload::TokenUsage(_) => {
49                        pattern_lower == "token" || pattern_lower == "tokenusage"
50                    }
51                    EventPayload::Notification(_) => {
52                        pattern_lower == "notification" || pattern_lower == "info"
53                    }
54                }
55            })
56        });
57    }
58
59    filtered
60}