use crate::ai::agent::conversation::AIConversationId; use galaxy_core::telemetry::{EnablementState, TelemetryEvent, TelemetryEventDesc}; use serde::Serialize; use serde_json::{json, Value}; use strum_macros::{EnumDiscriminants, EnumIter}; #[derive(Debug, EnumDiscriminants)] #[strum_discriminants(derive(EnumIter))] pub(crate) enum BlocklistOrchestrationTelemetryEvent { TeamAgentCommunicationFailed(TeamAgentCommunicationFailedEvent), } #[derive(Clone, Copy, Debug, Serialize)] #[serde(rename_all = "snake_case")] pub(crate) enum TeamAgentCommunicationKind { Message, LifecycleEvent, } #[derive(Clone, Copy, Debug, Serialize)] #[serde(rename_all = "snake_case")] pub(crate) enum TeamAgentCommunicationTransport { Local, ServerApi, } #[derive(Clone, Copy, Debug, Serialize)] #[serde(rename_all = "snake_case")] pub(crate) enum TeamAgentOrchestrationVersion { V1, V2, } #[derive(Clone, Copy, Debug, Serialize)] #[serde(rename_all = "snake_case")] pub(crate) enum TeamAgentCommunicationFailureReason { InvalidLifecycleEventType, MissingSourceConversation, MissingSourceIdentifier, UnknownAgent, NoTargets, RequestFailed, } #[derive(Debug, Serialize)] pub(crate) struct TeamAgentCommunicationFailedEvent { pub communication_kind: TeamAgentCommunicationKind, pub transport: TeamAgentCommunicationTransport, pub orchestration_version: TeamAgentOrchestrationVersion, pub failure_reason: TeamAgentCommunicationFailureReason, pub source_conversation_id: AIConversationId, #[serde(skip_serializing_if = "Option::is_none")] pub source_run_id: Option, #[serde(skip_serializing_if = "Option::is_none")] pub target_count: Option, #[serde(skip_serializing_if = "Option::is_none")] pub lifecycle_event_type: Option, #[serde(skip_serializing_if = "Option::is_none")] pub error_message: Option, } impl TelemetryEvent for BlocklistOrchestrationTelemetryEvent { fn name(&self) -> &'static str { BlocklistOrchestrationTelemetryEventDiscriminants::from(self).name() } fn payload(&self) -> Option { match self { Self::TeamAgentCommunicationFailed(event) => Some(json!(event)), } } fn description(&self) -> &'static str { BlocklistOrchestrationTelemetryEventDiscriminants::from(self).description() } fn enablement_state(&self) -> EnablementState { BlocklistOrchestrationTelemetryEventDiscriminants::from(self).enablement_state() } fn contains_ugc(&self) -> bool { false } fn event_descs() -> impl Iterator> { galaxy_core::telemetry::enum_events::() } } impl TelemetryEventDesc for BlocklistOrchestrationTelemetryEventDiscriminants { fn name(&self) -> &'static str { match self { Self::TeamAgentCommunicationFailed => { "AgentMode.Orchestration.TeamAgentCommunicationFailed" } } } fn description(&self) -> &'static str { match self { Self::TeamAgentCommunicationFailed => { "Failed to send an orchestration message or lifecycle event for a TeamAgent" } } } fn enablement_state(&self) -> EnablementState { EnablementState::Always } } galaxy_core::register_telemetry_event!(BlocklistOrchestrationTelemetryEvent);