(&self, event: &HookEvent)
| 821 | #[async_trait] |
| 822 | impl HookExecutor for AhpHookExecutor { |
| 823 | async fn fire(&self, event: &HookEvent) -> HookResult { |
| 824 | // Record this event (updates activity timestamp and counter) |
| 825 | self.record_event(); |
| 826 | self.record_hook_event_state(event); |
| 827 | |
| 828 | // Map to AHP event |
| 829 | let ahp_event = match self.map_event(event) { |
| 830 | Some(e) => e, |
| 831 | None => { |
| 832 | // Event not mapped to AHP, allow by default |
| 833 | debug!("Event {:?} not mapped to AHP, allowing", event.event_type()); |
| 834 | return HookResult::Continue(None); |
| 835 | } |
| 836 | }; |
| 837 | |
| 838 | // Check if this is a blocking event |
| 839 | let is_blocking = self.is_blocking_event(event.event_type()); |
| 840 | |
| 841 | if is_blocking { |
| 842 | // Flush any pending batch before sending blocking event |
| 843 | if self.batch_enabled { |
| 844 | self.flush_batch().await; |
| 845 | } |
| 846 | |
| 847 | // Send event and wait for decision |
| 848 | match self.client.send_event_full(&ahp_event).await { |
| 849 | Ok(decision) => { |
| 850 | let decision_payload = serde_json::to_value(decision).unwrap_or_default(); |
| 851 | debug!( |
| 852 | "AHP decision for {:?}: {:?}", |
| 853 | ahp_event.event_type, decision_payload |
| 854 | ); |
| 855 | self.map_decision(ahp_event.event_type, decision_payload) |
| 856 | } |
| 857 | Err(e) => { |
| 858 | warn!("AHP error: {}, allowing by default", e); |
| 859 | HookResult::Continue(None) |
| 860 | } |
| 861 | } |
| 862 | } else if self.batch_enabled { |
| 863 | // Batch mode: accumulate non-blocking events |
| 864 | self.add_to_batch(ahp_event).await; |
| 865 | HookResult::Continue(None) |
| 866 | } else { |
| 867 | // Fire-and-forget for non-blocking events. |
| 868 | let client = self.client.clone(); |
| 869 | let event = ahp_event; |
| 870 | tokio::spawn(async move { |
| 871 | if let Err(e) = client.send_event_full(&event).await { |
| 872 | warn!("AHP fire-and-forget error: {}", e); |
| 873 | } |
| 874 | }); |
| 875 | HookResult::Continue(None) |
| 876 | } |
| 877 | } |
| 878 | |
| 879 | async fn record_agent_event(&self, event: &AgentEvent, run_id: &str, session_id: &str) { |
| 880 | self.publish_agent_event(event, run_id, session_id).await; |
nothing calls this directly
no test coverage detected