agtrace_runtime/domain/
events.rs1use 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}