use galaxy_core::telemetry::{EnablementState, TelemetryEvent, TelemetryEventDesc}; use serde::{Deserialize, Serialize}; use serde_json::{json, Value}; use strum_macros::{EnumDiscriminants, EnumIter}; /// Telemetry events for the onboarding flow. #[derive(Clone, Debug, Serialize, Deserialize, EnumDiscriminants)] #[strum_discriminants(derive(EnumIter))] #[strum_discriminants(name(OnboardingEventDiscriminant))] pub enum OnboardingEvent { /// The onboarding flow was started. OnboardingStarted, /// A specific slide was viewed. SlideViewed { slide_name: String }, /// A setting was changed during onboarding. SettingChanged { setting: String, value: String }, /// The onboarding slides were completed. OnboardingSlidesCompleted { intention: String, model: Option, autonomy: Option, has_project_path: bool, }, /// The user clicked the "Get Started" button. GetStartedClicked, /// The user started folder selection. FolderSelectionStarted, /// The user selected a folder. FolderSelected, /// A callout was displayed. CalloutDisplayed { callout: String }, /// The user clicked next on a callout. CalloutNext, /// The user completed the callout flow. CalloutCompleted { completion_type: String }, /// The user navigated to the next slide. SlideNavigatedNext, /// The user navigated to the previous slide. SlideNavigatedBack, /// The user clicked the upgrade/subscribe button on the FreeUserNoAi experiment slide. FreeUserNoAiUpgradeClicked, /// The user clicked the "Upgrade" button on the "Customize your agent" slide. AgentSlideUpgradeClicked, /// The user clicked the "Log in" link on the welcome/intro slide. WelcomeLoginClicked, } impl TelemetryEvent for OnboardingEvent { fn name(&self) -> &'static str { match self { OnboardingEvent::OnboardingStarted => "onboarding_started", OnboardingEvent::SlideViewed { .. } => "onboarding_slide_viewed", OnboardingEvent::SettingChanged { .. } => "onboarding_setting_changed", OnboardingEvent::OnboardingSlidesCompleted { .. } => "onboarding_slides_completed", OnboardingEvent::GetStartedClicked => "onboarding_get_started_clicked", OnboardingEvent::FolderSelectionStarted => "onboarding_folder_selection_started", OnboardingEvent::FolderSelected => "onboarding_folder_selected", OnboardingEvent::CalloutDisplayed { .. } => "onboarding_callout_displayed", OnboardingEvent::CalloutNext => "onboarding_callout_next", OnboardingEvent::CalloutCompleted { .. } => "onboarding_callout_completed", OnboardingEvent::SlideNavigatedNext => "onboarding_slide_navigated_next", OnboardingEvent::SlideNavigatedBack => "onboarding_slide_navigated_back", OnboardingEvent::FreeUserNoAiUpgradeClicked => { "onboarding_free_user_no_ai_upgrade_clicked" } OnboardingEvent::AgentSlideUpgradeClicked => "onboarding_agent_slide_upgrade_clicked", OnboardingEvent::WelcomeLoginClicked => "onboarding_welcome_login_clicked", } } fn payload(&self) -> Option { match self { OnboardingEvent::OnboardingStarted => None, OnboardingEvent::SlideViewed { slide_name } => Some(json!({ "slide_name": slide_name, })), OnboardingEvent::SettingChanged { setting, value } => Some(json!({ "setting": setting, "value": value, })), OnboardingEvent::OnboardingSlidesCompleted { intention, model, autonomy, has_project_path, } => Some(json!({ "intention": intention, "model": model, "autonomy": autonomy, "has_project_path": has_project_path, })), OnboardingEvent::GetStartedClicked => None, OnboardingEvent::FolderSelectionStarted => None, OnboardingEvent::FolderSelected => None, OnboardingEvent::CalloutDisplayed { callout } => Some(json!({ "callout": callout, })), OnboardingEvent::CalloutNext => None, OnboardingEvent::CalloutCompleted { completion_type } => Some(json!({ "completion_type": completion_type, })), OnboardingEvent::SlideNavigatedNext => None, OnboardingEvent::SlideNavigatedBack => None, OnboardingEvent::FreeUserNoAiUpgradeClicked => None, OnboardingEvent::AgentSlideUpgradeClicked => None, OnboardingEvent::WelcomeLoginClicked => None, } } fn description(&self) -> &'static str { match self { OnboardingEvent::OnboardingStarted => "User started the onboarding flow", OnboardingEvent::SlideViewed { .. } => "User viewed a slide in the onboarding flow", OnboardingEvent::SettingChanged { .. } => "User changed a setting during onboarding", OnboardingEvent::OnboardingSlidesCompleted { .. } => { "User completed the onboarding slides" } OnboardingEvent::GetStartedClicked => "User clicked the Get Started button", OnboardingEvent::FolderSelectionStarted => "User started folder selection", OnboardingEvent::FolderSelected => "User selected a folder", OnboardingEvent::CalloutDisplayed { .. } => "A callout was displayed to the user", OnboardingEvent::CalloutNext => "User clicked next on a callout", OnboardingEvent::CalloutCompleted { .. } => "User completed the callout flow", OnboardingEvent::SlideNavigatedNext => "User navigated to the next slide", OnboardingEvent::SlideNavigatedBack => "User navigated to the previous slide", OnboardingEvent::FreeUserNoAiUpgradeClicked => { "User clicked the upgrade button on the free-user no-AI experiment slide" } OnboardingEvent::AgentSlideUpgradeClicked => { "User clicked the Upgrade button on the Customize your agent slide" } OnboardingEvent::WelcomeLoginClicked => { "User clicked the Log in link on the welcome/intro slide" } } } fn enablement_state(&self) -> EnablementState { EnablementState::Always } fn contains_ugc(&self) -> bool { false } fn event_descs() -> impl Iterator> { galaxy_core::telemetry::enum_events::() } } impl TelemetryEventDesc for OnboardingEventDiscriminant { fn name(&self) -> &'static str { match self { OnboardingEventDiscriminant::OnboardingStarted => "onboarding_started", OnboardingEventDiscriminant::SlideViewed => "onboarding_slide_viewed", OnboardingEventDiscriminant::SettingChanged => "onboarding_setting_changed", OnboardingEventDiscriminant::OnboardingSlidesCompleted => "onboarding_slides_completed", OnboardingEventDiscriminant::GetStartedClicked => "onboarding_get_started_clicked", OnboardingEventDiscriminant::FolderSelectionStarted => { "onboarding_folder_selection_started" } OnboardingEventDiscriminant::FolderSelected => "onboarding_folder_selected", OnboardingEventDiscriminant::CalloutDisplayed => "onboarding_callout_displayed", OnboardingEventDiscriminant::CalloutNext => "onboarding_callout_next", OnboardingEventDiscriminant::CalloutCompleted => "onboarding_callout_completed", OnboardingEventDiscriminant::SlideNavigatedNext => "onboarding_slide_navigated_next", OnboardingEventDiscriminant::SlideNavigatedBack => "onboarding_slide_navigated_back", OnboardingEventDiscriminant::FreeUserNoAiUpgradeClicked => { "onboarding_free_user_no_ai_upgrade_clicked" } OnboardingEventDiscriminant::AgentSlideUpgradeClicked => { "onboarding_agent_slide_upgrade_clicked" } OnboardingEventDiscriminant::WelcomeLoginClicked => "onboarding_welcome_login_clicked", } } fn description(&self) -> &'static str { match self { OnboardingEventDiscriminant::OnboardingStarted => "User started the onboarding flow", OnboardingEventDiscriminant::SlideViewed => { "User viewed a slide in the onboarding flow" } OnboardingEventDiscriminant::SettingChanged => { "User changed a setting during onboarding" } OnboardingEventDiscriminant::OnboardingSlidesCompleted => { "User completed the onboarding slides" } OnboardingEventDiscriminant::GetStartedClicked => "User clicked the Get Started button", OnboardingEventDiscriminant::FolderSelectionStarted => "User started folder selection", OnboardingEventDiscriminant::FolderSelected => "User selected a folder", OnboardingEventDiscriminant::CalloutDisplayed => "A callout was displayed to the user", OnboardingEventDiscriminant::CalloutNext => "User clicked next on a callout", OnboardingEventDiscriminant::CalloutCompleted => "User completed the callout flow", OnboardingEventDiscriminant::SlideNavigatedNext => "User navigated to the next slide", OnboardingEventDiscriminant::SlideNavigatedBack => { "User navigated to the previous slide" } OnboardingEventDiscriminant::FreeUserNoAiUpgradeClicked => { "User clicked the upgrade button on the free-user no-AI experiment slide" } OnboardingEventDiscriminant::AgentSlideUpgradeClicked => { "User clicked the Upgrade button on the Customize your agent slide" } OnboardingEventDiscriminant::WelcomeLoginClicked => { "User clicked the Log in link on the welcome/intro slide" } } } fn enablement_state(&self) -> EnablementState { EnablementState::Always } } galaxy_core::register_telemetry_event!(OnboardingEvent);