Initial public release of Warp.

Repo-Sync-Origin: warpdotdev/warp-internal@12af1d983b
This commit is contained in:
David Stern
2026-04-28 08:43:33 -05:00
commit 0dbd3d567a
4982 changed files with 1431549 additions and 0 deletions
+217
View File
@@ -0,0 +1,217 @@
use serde::{Deserialize, Serialize};
use serde_json::{json, Value};
use strum_macros::{EnumDiscriminants, EnumIter};
use warp_core::telemetry::{EnablementState, TelemetryEvent, TelemetryEventDesc};
/// 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<String>,
autonomy: Option<String>,
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<Value> {
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<Item = Box<dyn TelemetryEventDesc>> {
warp_core::telemetry::enum_events::<Self>()
}
}
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
}
}
warp_core::register_telemetry_event!(OnboardingEvent);