use crate::agent_proto::BrainEventsRequest;
pub(crate) fn brain_event_matches(ev: &observe::BrainEvent, filter: &BrainEventsRequest) -> bool {
if !filter.kind.is_empty() && ev.kind() != filter.kind {
return false;
}
if !filter.tool_id.is_empty() && ev.tool_id() != Some(filter.tool_id.as_str()) {
return false;
}
if !filter.principal.is_empty() {
return false;
}
if !filter.since.is_empty() {
let Ok(since) = chrono::DateTime::parse_from_rfc3339(&filter.since) else {
return false;
};
let since = since.with_timezone(&chrono::Utc);
if brain_event_ts(ev) < since {
return false;
}
}
true
}
pub(crate) fn brain_event_ts(ev: &observe::BrainEvent) -> chrono::DateTime<chrono::Utc> {
use observe::BrainEvent::*;
match ev {
SignalReceived { ts, .. }
| IntentClassified { ts, .. }
| ToolRouteResolved { ts, .. }
| ConfirmationRequested { ts, .. }
| ConfirmationResolved { ts, .. }
| ToolCallStarted { ts, .. }
| ToolCallFinished { ts, .. }
| ReflexFired { ts, .. }
| AuditAppended { ts, .. }
| BudgetCrossed { ts, .. }
| ResourcePressure { ts, .. }
| BreakerStateChange { ts, .. }
| Error { ts, .. }
| TerminalSessionOpened { ts, .. }
| TerminalSessionClosed { ts, .. }
| TaskStateChange { ts, .. }
| ServiceHealthChanged { ts, .. } => *ts,
}
}