use std::collections::HashSet; use std::time::Duration; use serde::{Deserialize, Serialize}; use serde_json::json; use serde_json::Value; use session_sharing_protocol::common::ParticipantId; use session_sharing_protocol::common::Role; use session_sharing_protocol::common::SessionId as SharedSessionId; use session_sharing_protocol::sharer::SessionEndedReason; use strum_macros::EnumDiscriminants; use strum_macros::EnumIter; use warp_completer::completer::MatchType; use warp_core::command::ExitCode; use warp_core::telemetry::EnablementState; use warp_core::telemetry::TelemetryEvent as TelemetryEventTrait; use warp_core::telemetry::TelemetryEventDesc; use warpui::keymap::Keystroke; use warpui::notification::{NotificationSendError, RequestPermissionsOutcome}; use warpui::rendering::ThinStrokes; use crate::ai::agent::api::ServerConversationToken; use crate::ai::agent::conversation::AIConversationId; use crate::ai::agent::AIAgentActionId; use crate::ai::agent::AIAgentExchangeId; use crate::ai::agent::AIAgentInput as FullAIAgentInput; use crate::ai::agent::AIIdentifiers; use crate::ai::agent::EntrypointType; use crate::ai::agent::PassiveSuggestionTrigger; use crate::ai::agent::ServerOutputId; use crate::ai::agent::SuggestedLoggingId; use crate::ai::agent_management::notifications::NotificationSourceAgent; use crate::ai::ambient_agents::AmbientAgentTaskId; use crate::ai::blocklist::agent_view::AgentViewEntryOrigin; use crate::ai::blocklist::AIBlockResponseRating; use crate::ai::blocklist::CommandExecutionPermissionAllowedReason; use crate::ai::blocklist::InputType; use crate::ai::mcp::TemplateVariable; use crate::ai::predict::generate_ai_input_suggestions::GenerateAIInputSuggestionsRequest; use crate::ai::predict::generate_ai_input_suggestions::GenerateAIInputSuggestionsResponseV2; use crate::ai::predict::next_command_model::HistoryBasedAutosuggestionState; use crate::auth::auth_manager::LoginGatedFeature; use crate::channel::Channel; use crate::cloud_object::{ model::generic_string_model::GenericStringObjectId, GenericStringObjectFormat, ObjectType, Space, }; #[cfg(feature = "local_fs")] use crate::code::editor_management::CodeSource; use crate::drive::CloudObjectTypeAndId; use crate::drive::DriveSortOrder; use crate::features::FeatureFlag; use crate::launch_configs::save_modal::SaveState; use crate::notebooks::telemetry::NotebookTelemetryAction; use crate::notebooks::NotebookId; use crate::notebooks::NotebookLocation; use crate::palette::PaletteMode; use crate::pane_group::PaneDragDropLocation; use crate::prompt::editor_modal::OpenSource as PromptEditorOpenSource; use crate::search::command_search::searcher::CommandSearchItemAction; use crate::search::QueryFilter; use crate::server::block::DisplaySetting; use crate::server::ids::ObjectUid; use crate::server::ids::ServerId; use crate::settings::import::config::ParsedTerminalSetting; use crate::settings::import::config::SettingType; use crate::settings::import::model::TerminalType; use crate::settings::AgentModeCodingPermissionsType; use crate::settings_view::TeamsInviteOption; use crate::tab::TabTelemetryAction; use crate::terminal::block_list_viewport::InputMode; use crate::terminal::cli_agent_sessions::CLIAgentInputEntrypoint; use crate::terminal::cli_agent_sessions::CLIAgentRichInputCloseReason; use crate::terminal::input::TelemetryInputSuggestionsMode; use crate::terminal::model::ansi::WarpificationUnavailableReason; use crate::terminal::model::block::BlockId; use crate::terminal::model::session::SessionId; use crate::terminal::model::terminal_model::BlockSelectionCardinality; use crate::terminal::model::terminal_model::TmuxInstallationState; use crate::terminal::settings::AltScreenPaddingMode; use crate::terminal::shared_session::SharedSessionActionSource; use crate::terminal::shell::ShellType; use crate::terminal::ssh::ssh_detection::SshInteractiveSessionDetected; use crate::terminal::view::block_onboarding::onboarding_agentic_suggestions_block::OnboardingChipType; use crate::terminal::view::inline_banner::ZeroStatePromptSuggestionTriggeredFrom; use crate::terminal::view::inline_banner::ZeroStatePromptSuggestionType; use crate::terminal::view::BlockEntity; use crate::terminal::view::BlockSelectionDetails; use crate::terminal::view::ContextMenuInfo; use crate::terminal::view::GridHighlightedLink; use crate::terminal::view::PromptPart; use crate::terminal::view::{ NotificationsDiscoveryBannerAction, NotificationsErrorBannerAction, NotificationsTrigger, }; use crate::terminal::ShareBlockType; use crate::tips::WelcomeTipFeature; #[cfg(feature = "local_fs")] use crate::util::file::external_editor::settings::EditorLayout; #[cfg(feature = "local_fs")] use crate::util::openable_file_type::FileTarget; use crate::workflows::WorkflowId; use crate::workflows::WorkflowSelectionSource; use crate::workflows::WorkflowSource; use crate::workspace::tab_settings::TabCloseButtonPosition; use crate::workspace::tab_settings::WorkspaceDecorationVisibility; use crate::workspace::TabMovement; use session_sharing_protocol::sharer::SessionSourceType; use warp_core::interval_timer::TimingDataPoint; #[derive(Clone, Serialize, Deserialize)] pub struct BootstrappingInfo { pub shell: &'static str, pub is_ssh: bool, pub is_subshell: bool, pub is_wsl: bool, pub is_msys2: bool, /// `true` if the bootstrapping process was triggered by an RC file snippet. /// /// This should only be true if `is_subshell` is true. pub was_triggered_by_rc_file: bool, /// The total time it took to bootstrap the shell, in seconds. pub bootstrap_duration_seconds: Option, /// The time it took to source the user's rcfiles, in seconds. May be None /// if we weren't able to get that information from the shell. pub rcfiles_duration_seconds: Option, /// The difference between the total bootstrap time and the rcfile sourcing /// time, which roughly equals the time cost of running our bootstrap /// script. Will be None if `bootstrap_duration_seconds` or /// `rcfiles_duration_seconds` is None. pub warp_attributed_bootstrap_duration_seconds: Option, pub shell_version: Option, pub terminal_session_id: Option, } #[derive(Clone, Serialize, Deserialize)] pub struct SlowBootstrapInfo { pub shell: &'static str, pub is_ssh: bool, pub is_subshell: bool, pub is_wsl: bool, pub is_msys2: bool, /// Contents of the bootstrap block when the slow bootstrap was detected. /// This includes both command and output content from the block. pub bootstrap_block_contents: String, } #[derive(Clone, Serialize, Deserialize)] pub struct AppStartupInfo { pub is_session_restoration_on: bool, /// Whether or not a screen reader is enabled at the time the app is /// launched. Should be set to None if we do not know for sure. pub is_screen_reader_enabled: Option, pub from_relaunch: bool, pub is_crash_reporting_enabled: bool, pub timing_data: Vec, } #[derive(Clone, Copy, Serialize, Deserialize)] pub enum DownloadSource { Website, Homebrew, } #[derive(Clone, Serialize, Deserialize)] pub struct BlockLatencyInfo { pub command: &'static str, pub shell: &'static str, pub is_ssh: bool, pub execution_ms: u64, } // For use when recording what type of cloud object a particular telemetry is for. #[derive(Debug, Clone, Serialize, Deserialize)] pub enum TelemetryCloudObjectType { Workflow, Notebook, Folder, GenericStringObject(GenericStringObjectFormat), } impl From<&CloudObjectTypeAndId> for TelemetryCloudObjectType { fn from(cloud_object_type_and_id: &CloudObjectTypeAndId) -> Self { match cloud_object_type_and_id { CloudObjectTypeAndId::Notebook(_) => Self::Notebook, CloudObjectTypeAndId::Workflow(_) => Self::Workflow, CloudObjectTypeAndId::Folder(_) => Self::Folder, CloudObjectTypeAndId::GenericStringObject { object_type, .. } => { Self::GenericStringObject(*object_type) } } } } /// For use when recording how a user has access to a cloud object. #[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub enum TelemetrySpace { /// The object is owned by the current user. Personal, /// The object is owned by a team the user is on. Team, /// The object was shared with the user. Shared, } impl From for TelemetrySpace { fn from(space: Space) -> Self { match space { Space::Personal => Self::Personal, Space::Team { .. } => Self::Team, Space::Shared => Self::Shared, } } } /// Common metadata to include in all Warp Drive telemetry events that act on a specific object. /// Events that only apply to a single object type may use specific metadata like [`WorkflowTelemetryMetadata`], /// [`NotebookTelemetryMetadata`], or [`EnvVarTelemetryMetadata`] instead. #[derive(Clone, Debug, Serialize, Deserialize)] pub struct CloudObjectTelemetryMetadata { pub object_type: TelemetryCloudObjectType, /// The server UID of the object. This only exists for objects that have been synced to the /// server. pub object_uid: Option, /// The space through which the user has access to the object. pub space: Option, /// If the object is owned by a team, this is the owning team's UID. For shared objects, the /// user might not be on the team. pub team_uid: Option, } #[derive(Clone, Serialize, Deserialize)] pub struct WorkflowTelemetryMetadata { pub workflow_categories: Option>, pub workflow_source: WorkflowSource, pub workflow_space: Option, pub workflow_selection_source: WorkflowSelectionSource, // This field is only populated for cloud workflows that have been synced to the server pub workflow_id: Option, // Any referenced workflow enums that have been synced to the cloud pub enum_ids: Vec, } /// Metadata to include in all notebook telemetry events. /// /// There are 4 expected configurations: /// * Personal cloud notebooks: `notebook_id` is `Some`, `team_uid` is `None`, and location is `PersonalCloud` /// * Team cloud notebooks: `notebook_id` is `Some`, `team_uid` is `Some`, and location is `Team` /// * Local file-based notebooks: `notebook_id` and `team_uid` are `None`, and location is `LocalFile` /// * Remote file-based notebooks: `notebook_id` and `team_uid` are `None`, and location is `RemoteFile` /// /// This representation allows for invalid combinations, but makes querying the data easier (for /// example, to find all notebook events for a given team). #[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub struct NotebookTelemetryMetadata { /// The notebook ID, only available for cloud notebooks that have been synced to the server. pub notebook_id: Option, /// The team UID, only available for cloud notebooks in a shared team. pub team_uid: Option, pub space: Option, /// Where the notebook is canonically located. pub location: NotebookLocation, #[serde(skip_serializing_if = "Option::is_none")] pub markdown_table_count: Option, } impl NotebookTelemetryMetadata { pub fn new( notebook_id: impl Into>, team_uid: impl Into>, location: impl Into, space: Option, ) -> Self { Self { notebook_id: notebook_id.into(), team_uid: team_uid.into(), location: location.into(), space, markdown_table_count: None, } } pub fn with_markdown_table_count(mut self, markdown_table_count: usize) -> Self { self.markdown_table_count = Some(markdown_table_count); self } } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct NotebookActionEvent { #[serde(flatten)] pub action: NotebookTelemetryAction, #[serde(flatten)] pub metadata: NotebookTelemetryMetadata, } #[derive(Clone, Serialize, Deserialize)] pub struct EnvVarTelemetryMetadata { /// The object ID, only available for cloud env vars that have been synced to the server. pub object_id: Option, /// The team UID, only available for cloud env vars in a shared team. pub team_uid: Option, pub space: TelemetrySpace, } #[derive(Clone, Serialize, Deserialize)] pub struct MCPServerTelemetryMetadata { pub object_id: GenericStringObjectId, pub name: String, pub transport_type: MCPServerTelemetryTransportType, /// The MCP server string extracted from '@modelcontextprotocol/<...>'. pub mcp_server: Option, } #[derive(Clone, Debug, Copy, Serialize, Deserialize)] pub enum MCPTemplateCreationSource { #[serde(rename = "json")] Json, #[serde(rename = "conversion")] Conversion, } #[derive(Clone, Debug, Copy, Serialize, Deserialize)] pub enum MCPTemplateInstallationSource { #[serde(rename = "local")] Local, #[serde(rename = "shared")] Shared, #[serde(rename = "gallery")] Gallery, } #[derive(Clone, Debug, Copy, Serialize, Deserialize)] pub enum MCPServerModel { #[serde(rename = "legacy")] Legacy, #[serde(rename = "templatable")] Templatable, } #[derive(Clone, Serialize, Deserialize)] pub enum MCPServerTelemetryTransportType { CLIServer, ServerSentEvents, } #[derive(Debug, Clone, serde::Serialize)] pub enum MCPServerTelemetryError { Initialization(String), RequestCancelled, ResponseError(String), SerializationError(String), CapabilityUnsupported(String), InternalError(String), TransportError(String), } #[cfg(not(target_family = "wasm"))] impl From for MCPServerTelemetryError { fn from(err: rmcp::RmcpError) -> Self { match err { rmcp::RmcpError::ClientInitialize(err) => Self::Initialization(err.to_string()), rmcp::RmcpError::ServerInitialize(err) => Self::Initialization(err.to_string()), rmcp::RmcpError::TransportCreation { error, .. } => { Self::TransportError(error.to_string()) } rmcp::RmcpError::Runtime(err) => Self::InternalError(err.to_string()), rmcp::RmcpError::Service(err) => match err { rmcp::ServiceError::McpError(_) => Self::ResponseError(err.to_string()), rmcp::ServiceError::TransportSend(_) => Self::TransportError(err.to_string()), rmcp::ServiceError::TransportClosed => Self::TransportError(err.to_string()), rmcp::ServiceError::UnexpectedResponse => Self::ResponseError(err.to_string()), rmcp::ServiceError::Cancelled { .. } => Self::InternalError(err.to_string()), rmcp::ServiceError::Timeout { .. } => Self::TransportError(err.to_string()), // The enum is marked as non-exhaustive, so we need a catch-all. _ => Self::InternalError(err.to_string()), }, } } } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct OpenedSharingDialogEvent { pub source: SharingDialogSource, /// Metadata for the object being shared, if it's a Warp Drive object. #[serde(flatten)] pub object_metadata: Option, /// Metadata for the session being shared, if there is one. pub session_id: Option, } /// How the user opened the Warp Drive sharing dialog. #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)] pub enum SharingDialogSource { /// The sharing button in the pane header. PaneHeader, /// The per-pane command palette entry (includes keybindings). CommandPalette, /// The Warp Drive index context menu. DriveIndex, /// The sharing dialog was auto-opened from shared session creation. StartedSessionShare, /// The user intented into Warp with an email address to invite. InviteeRequest, /// The user jumped from an inherited ACL to its definition on a parent object. InheritedPermission, /// The onboarding block shown after users create new personal objects. OnboardingBlock, /// The conversation list overflow menu. ConversationList, /// The AI block context menu. AIBlockContextMenu, } #[derive(Clone, Serialize, Deserialize)] pub enum TabRenameEvent { OpenedEditor, CustomNameSet, CustomNameCleared, } /// The possible sources notifications can turned on from. #[derive(Clone, Serialize, Deserialize)] pub enum NotificationsTurnedOnSource { Settings, Banner, } /// The possible types of toggles in the find bar #[derive(Clone, Serialize, Deserialize)] pub enum FindOption { CaseSensitive, FindInBlock, Regex, } #[derive(Clone, Serialize, Deserialize)] pub enum LinkOpenMethod { CmdClick, ToolTip, MiddleClick, } /// The possible ways to trigger command x-ray #[derive(Clone, Serialize, Deserialize, PartialEq, Eq)] pub enum CommandXRayTrigger { Hover, Keystroke, } #[derive(Clone, Copy, Serialize, Deserialize, Debug)] pub enum PaletteSource { PrefixChange, Keybinding, CtrlTab { shift_pressed_initially: bool }, WarpDrive, QuitModal, LogOutModal, IntegrationTest, ConversationManager, ContextChip, PaneHeader, RecentsViewAll, AgentTip, TitleBarSearchBar, } #[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub enum FileTreeSource { /// Opened from the pane header toolbelt button. PaneHeader, Keybinding, LeftPanelToolbelt, ForceOpened, /// Opened from the CLI agent view footer (e.g., Claude Code). CLIAgentView, } #[cfg(feature = "local_fs")] #[derive(Clone, Copy, Debug, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum CodePanelsFileOpenEntrypoint { CodeReview, ProjectExplorer, GlobalSearch, } /// The CLI agent being used (for telemetry purposes). #[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub enum CLIAgentType { Claude, Gemini, Codex, Amp, Droid, OpenCode, Copilot, Pi, Auggie, Cursor, Unknown, } /// The kind of plugin chip shown or dismissed (for telemetry purposes). #[derive(Clone, Copy, Debug, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum PluginChipTelemetryKind { Install, Update, } /// Identifies the agent variant that triggered a notification (for telemetry purposes). #[derive(Clone, Copy, Debug, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum NotificationAgentVariant { /// Warp's built-in agent (Oz). Oz, /// A CLI agent (e.g., Claude Code, Gemini CLI, etc.). CLIAgent(CLIAgentType), } impl From for NotificationAgentVariant { fn from(agent: NotificationSourceAgent) -> Self { match agent { NotificationSourceAgent::Oz => Self::Oz, NotificationSourceAgent::CLI(cli_agent) => Self::CLIAgent(cli_agent.into()), } } } /// The action taken on a plugin chip (for telemetry purposes). #[derive(Clone, Copy, Debug, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum PluginChipTelemetryAction { /// User clicked the auto-install button. Install, /// User clicked the auto-update button. Update, /// User clicked the manual install instructions button. InstallInstructions, /// User clicked the manual update instructions button. UpdateInstructions, } #[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub enum WarpDriveSource { Legacy, LeftPanelToolbelt, ForceOpened, } #[derive(Clone, Serialize, Deserialize)] pub enum CommandCorrectionAcceptedType { /// TODO: We don't use the Autosuggestion variant yet. We need to wire through /// when an autosuggestion is accepted to be able to check this. Autosuggestion, Banner, Keybinding, } #[derive(Clone, Serialize, Deserialize)] pub enum CommandCorrectionEvent { Proposed { rule: &'static str, }, Accepted { via: CommandCorrectionAcceptedType, rule: &'static str, }, } #[derive(Clone, Serialize, Deserialize)] pub enum CommandSearchResultType { History, Workflow, OpenWarpAI, TranslateUsingWarpAI, Notebook, EnvVarCollection, ViewInWarpDrive, AIQuery, Project, } impl From<&CommandSearchItemAction> for CommandSearchResultType { fn from(action: &CommandSearchItemAction) -> Self { use crate::search::command_search::searcher::CommandSearchItemAction::*; match action { AcceptHistory(_) | ExecuteHistory(_) => Self::History, AcceptWorkflow(_) => Self::Workflow, AcceptNotebook(_) => Self::Notebook, AcceptEnvVarCollection(_) => Self::EnvVarCollection, OpenWarpAI => Self::OpenWarpAI, TranslateUsingWarpAI => Self::TranslateUsingWarpAI, AcceptAIQuery(_) | RunAIQuery(_) => Self::AIQuery, } } } #[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub enum CloseTarget { App, Window, Tab, Pane, EditorTab, } #[derive(Clone, Copy, Serialize, Deserialize)] pub enum PtySpawnMode { /// The pty was spawned using the terminal server. TerminalServer, /// We tried to spawn the pty using the terminal server, but something went /// wrong so we fell back to spawning it directly. FallbackToDirect, /// The terminal server is not in use, and we spawned the pty directly /// (in tests, for example). Direct, } #[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub enum OpenedWarpAISource { GlobalEntryButton, HelpWithBlock, HelpWithTextSelection, FromAICommandSearch, WarmWelcome, } #[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub enum WarpAIRequestResult { Succeeded { latency_ms: i64, truncated: bool }, OutOfRequests, Failed, } #[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub enum WarpAIActionType { CopyTranscript, Restart, CopyAnswer, CopyCode, InsertIntoInput, } #[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub enum SaveAsWorkflowModalSource { Block, Input, WarpAIWorkflowCard, WarpAIPanel, } #[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub enum LaunchConfigUiLocation { CommandPalette, AppMenu, TabMenu, Uri, } #[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub enum AICommandSearchEntrypoint { ShortHandTrigger, Keybinding, } #[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub enum SecretInteraction { RevealSecret, HideSecret, } #[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub enum AnonymousUserSignupEntrypoint { HitDriveObjectLimit, LoginGatedFeature, SignUpButton, RenotificationBlock, SignUpAIPrompt, NextCommandSuggestionsUpgradeBanner, Unknown, } #[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub enum UndoCloseItemType { Window, Tab, Pane, } #[derive(Debug, Clone, Serialize, Deserialize)] pub enum PromptChoice { PS1, Default, Custom { builtin_chips: Vec }, } #[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub enum ToggleBlockFilterSource { /// This includes the keybinding and the command palette items. Binding, ContextMenu, } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct TierLimitHitEvent { pub team_uid: ServerId, pub feature: String, } #[derive(Clone, Debug, Copy, Serialize, Deserialize)] pub enum KnowledgePaneEntrypoint { /// Triggered by either the command palette or the mac menus #[serde(rename = "global")] Global, #[serde(rename = "settings")] Settings, #[serde(rename = "warp_drive")] WarpDrive, #[serde(rename = "ai_blocklist")] AIBlocklist, #[serde(rename = "slash_command")] SlashCommand, } #[derive(Clone, Debug, Copy, Serialize, Deserialize)] pub enum MCPServerCollectionPaneEntrypoint { /// Triggered by either the command palette or the mac menus #[serde(rename = "global")] Global, #[serde(rename = "settings")] Settings, #[serde(rename = "warp_drive")] WarpDrive, #[serde(rename = "slash_command")] SlashCommand, #[serde(rename = "mcp_settings_tab")] MCPSettingsTab, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum AgentModeEntrypointSelectionType { /// User entered Agent Mode by taking action on a blocklist text selection. Text, /// User entered Agent Mode by taking action on a block selection. Block, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum AgentModeEntrypoint { /// The stars icon button in the tab bar. #[serde(rename = "tab_bar")] TabBar, /// This corresponds to _both_ triggering from the command palette and via keybinding. /// /// Unfortunately due to the way the command palette automatically surfaces any editable /// keybinding as an action, we don't have enough information to discern if the binding was /// triggered by the palette or keyboard. #[serde(rename = "new_pane_binding")] NewPaneBinding, /// The stars button in the hoverable block "toolbelt". #[serde(rename = "block_toolbelt")] BlockToolbelt, /// The "Ask Agent Mode" option from AI command search. #[serde(rename = "ai_command_search")] AICommandSearch, /// Context menu item(s) that attach a blocklist selection as context to an Agent Mode query. #[serde(rename = "context_menu")] ContextMenu { selection_type: AgentModeEntrypointSelectionType, }, /// The Agent Mode chip in the prompt. #[serde(rename = "prompt_chip")] PromptChip, /// The Agent Management popup, where you can see all the most recent tasks for each terminal /// pane across all windows/tabs/panes. #[serde(rename = "agent_management_popup")] AgentManagementPopup, /// User manually switched between terminal and AI input modes in UDI interface #[serde(rename = "udi_terminal_input_switcher")] UDITerminalInputSwitcher, /// The agent management view, where you can see both local interactive and ambient agent tasks #[serde(rename = "agent_management_view")] AgentManagementView, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum AutonomySettingToggleSource { Speedbump, SettingsPage, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum ToggleCodeSuggestionsSettingSource { Speedbump, Settings, } #[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub enum InteractionSource { Button, Keybinding, } #[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub enum PromptSuggestionViewType { TerminalView, AgentView, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum AgentModeAttachContextMethod { #[serde(rename = "keyboard")] Keyboard, #[serde(rename = "mouse")] Mouse, } /// The entrypoint from which the rewind dialog was opened. #[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub enum AgentModeRewindEntrypoint { /// The rewind button in the AI block header. Button, /// The context menu item "Rewind to before here". ContextMenu, /// The /rewind slash command. SlashCommand, } /// Reasons why we fell back to a prompt suggestion from a suggested code diff. #[derive(Copy, Clone, Debug, Serialize, Deserialize)] pub enum PromptSuggestionFallbackReason { /// Code file had too many lines, hence we stopped triggering the suggested code diff. #[serde(rename = "file_too_many_lines")] FileTooManyLines, /// Code file had too many bytes, hence we stopped triggering the suggested code diff. #[serde(rename = "file_too_many_bytes")] FileTooManyBytes, /// Missing file, when looking up filepaths in local file system. #[serde(rename = "missing_file")] MissingFile, /// Failed to retrieve file from local file system. #[serde(rename = "failed_to_retrieve_file")] FailedToRetrieveFile, /// In an SSH/remote session. #[serde(rename = "ssh_remote_session")] SSHRemoteSession, /// No read files permission. #[serde(rename = "no_read_files_permission")] NoReadFilesPermission, /// AI query timeout. #[serde(rename = "ai_query_timeout")] AIQueryTimeout, /// Failed to send AI request. #[serde(rename = "failed_to_send_ai_request")] FailedToSendAIRequest, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum AgentModeSetupProjectScopedRulesActionType { #[serde(rename = "link_from_existing")] LinkFromExisting(String), #[serde(rename = "generate_warp_md")] GenerateWarpMd, #[serde(rename = "skip_rules")] SkipRules, #[serde(rename = "regenerate_warp_md")] RegenerateWarpMd, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum AgentModeSetupCodebaseContextActionType { #[serde(rename = "index_codebase")] IndexCodebase, #[serde(rename = "skip_indexing")] SkipIndexing, #[serde(rename = "view_index_status")] ViewIndexStatus, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum AgentModeSetupCreateEnvironmentActionType { #[serde(rename = "create_environment")] CreateEnvironment, #[serde(rename = "skip_environment")] SkipEnvironment, } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct CpuUsageStats { /// The number of logical CPUs on the system. pub num_cpus: usize, /// The maximum CPU usage over the measurement interval. /// /// This number is in the range [0, num_cpus]. The CPU utilization, as a /// percentage, can be determined via `max_usage / num_cpus * 100`. pub max_usage: f32, /// The average CPU usage over the measurement interval. /// /// This number is in the range [0, num_cpus]. The CPU utilization, as a /// percentage, can be determined via `avg_usage / num_cpus * 100`. pub avg_usage: f32, } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct MemoryUsageStats { pub total_application_usage_bytes: usize, pub total_blocks: usize, pub total_lines: usize, /// Statistics about blocks that have been seen in the past 5 minutes. pub active_block_stats: BlockMemoryUsageStats, /// Statistics about blocks that haven't been seen since [5m, 1h). pub inactive_5m_stats: BlockMemoryUsageStats, /// Statistics about blocks that haven't been seen since [1h, 24h). pub inactive_1h_stats: BlockMemoryUsageStats, /// Statistics about blocks that haven't been seen since [24h, ..). pub inactive_24h_stats: BlockMemoryUsageStats, } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct BlockMemoryUsageStats { pub num_blocks: usize, pub num_lines: usize, pub estimated_memory_usage_bytes: usize, } /// Entrypoints to toggle the input auto-detection setting for Agent Mode. #[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub enum AgentModeAutoDetectionSettingOrigin { /// The "speed bump" banner shown that's shown to the user when input is autodetected. #[serde(rename = "banner")] Banner, /// The AI settings page. #[serde(rename = "settings_page")] SettingsPage, } /// Payload for the [`AgentModePotentialAutodetectionFalsePositive`] event. #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(untagged)] pub enum AgentModeAutoDetectionFalsePositivePayload { /// Payload includes input text for dogfood channels. InternalDogfoodUsers { input_text: String }, /// Do not include the misclassified input text in stable channels due to privacy concerns. ExternalUsers, } /// How the user triggered the [`AgentModeCodeFilesNavigated`] event. #[derive(Clone, Copy, Debug, Serialize)] pub enum AgentModeCodeFileNavigationSource { /// User used the next/previous actions. NavigationCommand, /// User directly selected the file's tab. SelectedFileTab, } /// How the user triggered the [`AddTabWithShell`] event. #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize)] pub enum AddTabWithShellSource { CommandPalette, ShellSelectorMenu, } #[derive(Clone, Copy, Debug, Serialize)] #[serde(rename_all = "snake_case")] pub enum CodeContextDestination { Pty, AgentInput, RichInput, } #[derive(Clone, Debug, Serialize)] pub enum AgentModeCitation { WarpDriveObject { object_type: ObjectType, uid: ObjectUid, }, WarpDocs { page: String, }, WebPage { // Don't serialize the URL to avoid leaking sensitive information. #[serde(skip_serializing)] url: String, }, } #[derive(Clone, Copy, Debug, Serialize)] pub enum ImageProtocol { Kitty, ITerm, } #[derive(Clone, Copy, Debug, Serialize, Default)] #[serde(rename_all = "snake_case")] pub enum InputUXChangeOrigin { #[default] Settings, ADELaunchModal, } #[derive(Clone, Debug, Serialize)] pub enum AIAgentInput { UserQuery { query: String }, AutoCodeDiffQuery { query: String }, ResumeConversation, InitProjectRules { display_query: Option }, CreateEnvironment { display_query: Option }, TriggerSuggestPrompt { trigger: PassiveSuggestionTrigger }, ActionResult { action_id: AIAgentActionId }, CreateNewProject { query: String }, CloneRepository { url: String }, CodeReview, FetchReviewComments, SummarizeConversation, InvokeSkill { skill_name: String }, StartFromAmbientRunPrompt, MessagesReceivedFromAgents { message_count: usize }, EventsFromAgents { event_count: usize }, PassiveSuggestionResult, } impl From for AIAgentInput { fn from(input: FullAIAgentInput) -> Self { match input { FullAIAgentInput::UserQuery { query, .. } => Self::UserQuery { query }, FullAIAgentInput::AutoCodeDiffQuery { query, .. } => Self::AutoCodeDiffQuery { query }, FullAIAgentInput::ResumeConversation { .. } => Self::ResumeConversation, FullAIAgentInput::InitProjectRules { display_query, .. } => { Self::InitProjectRules { display_query } } FullAIAgentInput::CreateEnvironment { display_query, .. } => { Self::CreateEnvironment { display_query } } FullAIAgentInput::TriggerPassiveSuggestion { trigger, .. } => { Self::TriggerSuggestPrompt { trigger } } FullAIAgentInput::ActionResult { result, .. } => Self::ActionResult { action_id: result.id, }, FullAIAgentInput::CreateNewProject { query, .. } => Self::CreateNewProject { query }, FullAIAgentInput::CloneRepository { clone_repo_url, .. } => Self::CloneRepository { url: clone_repo_url.into_url(), }, FullAIAgentInput::CodeReview { .. } => Self::CodeReview, FullAIAgentInput::FetchReviewComments { .. } => Self::FetchReviewComments, FullAIAgentInput::SummarizeConversation { .. } => Self::SummarizeConversation, FullAIAgentInput::InvokeSkill { skill, .. } => Self::InvokeSkill { skill_name: skill.name.clone(), }, FullAIAgentInput::StartFromAmbientRunPrompt { .. } => Self::StartFromAmbientRunPrompt, FullAIAgentInput::MessagesReceivedFromAgents { messages } => { Self::MessagesReceivedFromAgents { message_count: messages.len(), } } FullAIAgentInput::EventsFromAgents { events } => Self::EventsFromAgents { event_count: events.len(), }, FullAIAgentInput::PassiveSuggestionResult { .. } => Self::PassiveSuggestionResult, } } } /// The origin of an agent view entry, for telemetry purposes. #[derive(Clone, Copy, Debug, Serialize)] #[serde(rename_all = "snake_case")] pub enum TelemetryAgentViewEntryOrigin { Input { was_prompt_autodetected: bool }, ConversationSelector, AgentModeHomepage, AgentViewBlock, AIDocument, AutoFollowUp, RestoreExistingConversation, SharedSessionSelection, AgentRequestedNewConversation, AcceptedPromptSuggestion, AcceptedUnitTestSuggestion, AcceptedPassiveCodeDiff, InlineCodeReview, AmbientAgent, Cli, ImageAdded, SlashCommand, CodeReviewContext, ContinueConversationButton, ViewPassiveCodeDiffDetails, ResumeConversationButton, CodexModal, LongRunningCommand, HistoryMenu, InlineConversationMenu, PromptChip, OnboardingCallout, ConversationListView, Onboarding, Keybinding, SlashInit, CreateEnvironment, ProjectEntry, ClearBuffer, DefaultSessionMode, ChildAgent, LinearDeepLink, ThirdPartyCloudAgent, } impl From for TelemetryAgentViewEntryOrigin { fn from(origin: AgentViewEntryOrigin) -> Self { match origin { AgentViewEntryOrigin::Input { was_prompt_autodetected, } => Self::Input { was_prompt_autodetected, }, AgentViewEntryOrigin::ConversationSelector => Self::ConversationSelector, AgentViewEntryOrigin::AgentModeHomepage => Self::AgentModeHomepage, AgentViewEntryOrigin::AgentViewBlock => Self::AgentViewBlock, AgentViewEntryOrigin::AIDocument => Self::AIDocument, AgentViewEntryOrigin::AutoFollowUp => Self::AutoFollowUp, AgentViewEntryOrigin::RestoreExistingConversation => Self::RestoreExistingConversation, AgentViewEntryOrigin::SharedSessionSelection => Self::SharedSessionSelection, AgentViewEntryOrigin::AgentRequestedNewConversation => { Self::AgentRequestedNewConversation } AgentViewEntryOrigin::AcceptedPromptSuggestion => Self::AcceptedPromptSuggestion, AgentViewEntryOrigin::AcceptedUnitTestSuggestion => Self::AcceptedUnitTestSuggestion, AgentViewEntryOrigin::AcceptedPassiveCodeDiff => Self::AcceptedPassiveCodeDiff, AgentViewEntryOrigin::InlineCodeReview => Self::InlineCodeReview, AgentViewEntryOrigin::CloudAgent => Self::AmbientAgent, AgentViewEntryOrigin::ThirdPartyCloudAgent => Self::ThirdPartyCloudAgent, AgentViewEntryOrigin::Cli => Self::Cli, AgentViewEntryOrigin::ImageAdded => Self::ImageAdded, AgentViewEntryOrigin::SlashCommand { .. } => Self::SlashCommand, AgentViewEntryOrigin::CodeReviewContext => Self::CodeReviewContext, AgentViewEntryOrigin::LongRunningCommand => Self::LongRunningCommand, AgentViewEntryOrigin::ContinueConversationButton => Self::ContinueConversationButton, AgentViewEntryOrigin::ViewPassiveCodeDiffDetails => Self::ViewPassiveCodeDiffDetails, AgentViewEntryOrigin::ResumeConversationButton => Self::ResumeConversationButton, AgentViewEntryOrigin::CodexModal => Self::CodexModal, AgentViewEntryOrigin::InlineHistoryMenu => Self::HistoryMenu, AgentViewEntryOrigin::InlineConversationMenu => Self::InlineConversationMenu, AgentViewEntryOrigin::PromptChip => Self::PromptChip, AgentViewEntryOrigin::OnboardingCallout => Self::OnboardingCallout, AgentViewEntryOrigin::ConversationListView => Self::ConversationListView, AgentViewEntryOrigin::Onboarding => Self::Onboarding, AgentViewEntryOrigin::Keybinding => Self::Keybinding, AgentViewEntryOrigin::SlashInit => Self::SlashInit, AgentViewEntryOrigin::CreateEnvironment => Self::CreateEnvironment, AgentViewEntryOrigin::ProjectEntry => Self::ProjectEntry, AgentViewEntryOrigin::ClearBuffer => Self::ClearBuffer, AgentViewEntryOrigin::DefaultSessionMode => Self::DefaultSessionMode, AgentViewEntryOrigin::ChildAgent => Self::ChildAgent, AgentViewEntryOrigin::LinearDeepLink => Self::LinearDeepLink, } } } #[derive(Clone, Copy, Debug, Serialize)] pub enum SlashMenuSource { SlashButton, UserTyped, } #[derive(Clone, Copy, Debug, Serialize)] #[serde(rename_all = "snake_case")] pub enum LoginEventSource { OnboardingSlide, AuthModal, } /// Details about which type of slash command was accepted #[derive(Clone, Debug, Serialize)] pub enum SlashCommandAcceptedDetails { /// A built-in static command with its specific name (e.g., "/init", "/diff-review") StaticCommand { command_name: String }, /// A user-created saved prompt/workflow SavedPrompt, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum AutoReloadModalAction { #[serde(rename = "dismissed")] Dismissed, #[serde(rename = "enabled_auto_reload")] EnabledAutoReload, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum OutOfCreditsBannerAction { #[serde(rename = "dismissed")] Dismissed, #[serde(rename = "credits_purchased")] CreditsPurchased, } #[derive(Clone, Copy, Debug, Serialize)] #[serde(rename_all = "snake_case")] pub enum CLISubagentControlState { AgentInControl, UserInControl, AgentTaggedIn, AgentTaggedOut, } #[derive(Clone, EnumDiscriminants)] #[strum_discriminants(derive(EnumIter))] pub enum TelemetryEvent { AutosuggestionInserted { insertion_length: usize, buffer_length: usize, }, BlockCompleted { block_finished_to_precmd_delay_ms: u64, honor_ps1_enabled: bool, num_secrets_redacted: usize, /// The number of lines in the block's output grid when it was /// finished. num_output_lines: u64, /// The number of lines of output that were truncated while the block /// was active and receiving output. num_output_lines_truncated: u64, terminal_session_id: Option, is_udi_enabled: bool, /// Whether the command was executed while in an active agent view. is_in_agent_view: bool, }, /// This is identical to the `BlockCompleted` event, but includes extra fields for /// the command run / time it took the block to complete / exit code. /// That sort of telemetry should *NEVER* be sent in production, so /// DO NOT SEND THIS IN NON-DOGFOOD ENVIRONMENTS! BlockCompletedOnDogfoodOnly { block_finished_to_precmd_delay_ms: u64, honor_ps1_enabled: bool, num_secrets_redacted: usize, /// The number of lines in the block's output grid when it was /// finished. num_output_lines: u64, /// The number of lines of output that were truncated while the block /// was active and receiving output. num_output_lines_truncated: u64, command: String, duration: Duration, exit_code: ExitCode, terminal_session_id: Option, }, /// A new block of background output was started and added to the block list. BackgroundBlockStarted, /// User-perceptible latency (i.e. from hitting enter to first frame after command finishes) for /// a number of commands that perform minimal work we use as a baseline. BaselineCommandLatency(BlockLatencyInfo), SessionCreation, Login, OpenSuggestionsMenu(TelemetryInputSuggestionsMode), ConfirmSuggestion { mode: TelemetryInputSuggestionsMode, match_type: MatchType, }, OpenContextMenu { context_menu_info: ContextMenuInfo, }, /// Copy command, output or both for some number of blocks. ContextMenuCopy(BlockEntity, BlockSelectionCardinality), ContextMenuOpenShareModal(BlockSelectionCardinality), ContextMenuFindWithinBlocks(BlockSelectionCardinality), ContextMenuCopyPrompt { part: PromptPart, }, ContextMenuToggleGitPromptDirtyIndicator { enabled: bool, }, ContextMenuInsertSelectedText, ContextMenuCopySelectedText, /// The user opened the prompt editor modal. OpenPromptEditor { entrypoint: PromptEditorOpenSource, }, /// The user's prompt was edited via the prompt editor modal. PromptEdited { prompt: PromptChoice, entrypoint: String, }, ReinputCommands(BlockSelectionCardinality), JumpToPreviousCommand, CopyBlockSharingLink(ShareBlockType), GenerateBlockSharingLink { share_type: ShareBlockType, display_setting: DisplaySetting, show_prompt: bool, redact_secrets: bool, }, BlockSelection(BlockSelectionDetails), BootstrappingSlow(BootstrappingInfo), BootstrappingSlowContents(SlowBootstrapInfo), /// Logged when a pending session is abandoned before it hits Bootstrapped. SessionAbandonedBeforeBootstrap { pending_shell: Option, has_pending_ssh_session: bool, was_ever_visible: bool, duration_since_start: Duration, }, BootstrappingSucceeded(BootstrappingInfo), /// The user accepted a completion suggestion when it was the only one in the suggestions menu. /// This event is named with 'Tab' to maintain backwards compatibility; the completion /// suggestions menu may be triggered with a keybinding other than tab. TabSingleResultAutocompletion, EditorUnhandledModifierKey(String), CopyInviteLink, OpenThemeChooser, ThemeSelection { theme: String, entrypoint: String, }, AppIconSelection { icon: String, }, CursorDisplayType { cursor: String, }, OpenThemeCreatorModal, CreateCustomTheme, DeleteCustomTheme, SplitPane, UnableToAutoUpdateToNewVersion, /// An update was successfully installed, and we're attempting to relaunch the app. AutoupdateRelaunchAttempt { new_version: String, }, SkipOnboardingSurvey, ToggleRestoreSession(bool), DatabaseStartUpError(String), DatabaseReadError(String), DatabaseWriteError(String), AppStartup(AppStartupInfo), /// The native app was opened while logged out. Since Warp requires login, /// this usually means a new user. LoggedOutStartup, /// The download source, if it can be determined. Will only be sent when /// the app is launched while logged out. DownloadSource(DownloadSource), /// We attempted to bootstrap an SSH session via the SSH wrapper. The /// argument is the name of the remote shell. SSHBootstrapAttempt(String), SSHControlMasterError, KeybindingChanged { action: String, keystroke: Keystroke, }, KeybindingResetToDefault { action: String, }, KeybindingRemoved { action: String, }, FeaturesPageAction { action: String, value: String, }, WorkflowExecuted(WorkflowTelemetryMetadata), WorkflowSelected(WorkflowTelemetryMetadata), OpenWorkflowSearch, OpenQuakeModeWindow, OpenWelcomeTips, CompleteWelcomeTipFeature { total_completed_count: usize, tip_name: WelcomeTipFeature, }, DismissWelcomeTips, ShowNotificationsDiscoveryBanner, NotificationsDiscoveryBannerAction(NotificationsDiscoveryBannerAction), ShowNotificationsErrorBanner, NotificationsErrorBannerAction(NotificationsErrorBannerAction), NotificationPermissionsRequested { source: NotificationsTurnedOnSource, trigger: Option, }, NotificationsRequestPermissionsOutcome { outcome: RequestPermissionsOutcome, }, // NotificationSent events are emitted at the app level. Thus, they encompass // notifications that are successfully sent _and_ those that fail at the platform level. NotificationSent { trigger: NotificationsTrigger, /// Identifies which agent variant produced the desktop notification, if any. agent_variant: Option, }, NotificationFailedToSend { error: NotificationSendError, }, NotificationClicked, ToggleFindOption { option: FindOption, enabled: bool, }, SignUpButtonClicked, LoginButtonClicked { source: LoginEventSource, }, LoginLaterButtonClicked { source: LoginEventSource, }, LoginLaterConfirmationButtonClicked { source: LoginEventSource, }, OpenNewSessionFromFilePath, OpenTeamFromURI, ShowedSuggestedAgentModeWorkflowChip { logging_id: SuggestedLoggingId, }, ShowedSuggestedAgentModeWorkflowModal { logging_id: SuggestedLoggingId, }, SelectNavigationPaletteItem, SelectCommandPaletteOption(String), PaletteSearchOpened { mode: PaletteMode, source: PaletteSource, }, PaletteSearchResultAccepted { result_type: &'static str, filter: Option, buffer_length: usize, }, PaletteSearchExited { filter: Option, buffer_length: usize, }, AuthCommonQuestionClicked { question: &'static str, }, AuthToggleFAQ { open: bool, }, OpenAuthPrivacySettings { source: LoginEventSource, }, TabRenamed(TabRenameEvent), MoveActiveTab { direction: TabMovement, }, MoveTab { direction: TabMovement, }, DragAndDropTab, TabOperations { action: TabTelemetryAction, }, EditedInputBeforePrecmd, TriedToExecuteBeforePrecmd, ThinStrokesSettingChanged { new_value: ThinStrokes, }, BookmarkBlockToggled { enable_bookmark: bool, }, JumpToBookmark, JumpToBottomofBlockButtonClicked, ToggleJumpToBottomofBlockButton { enabled: bool, }, ToggleShowBlockDividers { enabled: bool, }, OpenLink { link: GridHighlightedLink, open_with: LinkOpenMethod, }, OpenChangelogLink { url: String, }, ShowInFileExplorer, CommandXRayTriggered { trigger: CommandXRayTrigger, }, OpenLaunchConfigSaveModal, SaveLaunchConfig { state: SaveState, }, OpenLaunchConfigFile, OpenLaunchConfig { ui_location: LaunchConfigUiLocation, open_in_active_window: bool, }, TeamCreated, TeamJoined, TeamLeft, ToggleSettingsSync { is_settings_sync_enabled: bool, }, TeamLinkCopied, RemovedUserFromTeam, DeletedWorkflow, DeletedNotebook, ToggleApprovalsModal, ChangedInviteViewOption(TeamsInviteOption), SendEmailInvites, CommandCorrection { event: CommandCorrectionEvent, }, SetLineHeight { new_value: f32, }, ResourceCenterOpened, ResourceCenterTipsCompleted, ResourceCenterTipsSkipped, KeybindingsPageOpened, CommandSearchOpened { has_initial_query: bool, }, CommandSearchExited { query_filter: Option, buffer_length: usize, }, CommandSearchResultAccepted { result_index: usize, result_type: CommandSearchResultType, query_filter: Option, buffer_length: usize, was_immediately_executed: bool, }, CommandSearchFilterChanged { new_filter: Option, }, CommandSearchAsyncQueryCompleted { filters: HashSet, error_payload: Option, }, GlobalSearchOpened, GlobalSearchQueryStarted, AICommandSearchOpened { entrypoint: AICommandSearchEntrypoint, }, OpenNotebook(NotebookTelemetryMetadata), EditNotebook { metadata: NotebookTelemetryMetadata, meaningful_change: bool, }, NotebookAction(NotebookActionEvent), OpenedAltScreenFind, UserInitiatedClose { initiated_on: CloseTarget, }, QuitModalShown { running_processes: u32, shared_sessions: u32, modal_for: CloseTarget, }, QuitModalCancel { nav_palette: bool, modal_for: CloseTarget, }, QuitModalDisabled, UserInitiatedLogOut, LogOutModalShown, LogOutModalCancel { nav_palette: bool, }, SetOpacity { // Represented in percentages from 1-100. opacity: u8, }, SetBlurRadius { // The radius value from 1-18. blur_radius: u8, }, ToggleDimInactivePanes { enabled: bool, }, InputModeChanged { old_mode: InputMode, new_mode: InputMode, }, PtySpawned { mode: PtySpawnMode, }, InitialWorkingDirectoryConfigurationChanged { advanced_mode_enabled: bool, }, /// Opened legacy Warp AI. OpenedWarpAI { source: OpenedWarpAISource, }, /// Issued legacy Warp AI request. WarpAIRequestIssued { result: WarpAIRequestResult, }, WarpAIAction { action_type: WarpAIActionType, }, /// This is purely for static prompts! Do not send user-written prompts with this event. UsedWarpAIPreparedPrompt { prompt: &'static str, }, ToggleFocusPaneOnHover { enabled: bool, }, WarpAICharacterLimitExceeded, OpenInputContextMenu, InputCutSelectedText, InputCopySelectedText, InputSelectAll, InputPaste, InputCommandSearch, InputAICommandSearch, InputAskWarpAI, SaveAsWorkflowModal { source: SaveAsWorkflowModalSource, }, ExperimentTriggered { experiment: &'static str, layer: &'static str, group_assignment: &'static str, }, ToggleSyncAllPanesInAllTabs { enabled: bool, }, ToggleSyncAllPanesInTab { enabled: bool, }, ToggleSameLinePrompt { enabled: bool, }, ToggleNewWindowsAtCustomSize { enabled: bool, }, SetNewWindowsAtCustomSize, DisableInputSync, ToggleTabIndicators { enabled: bool, }, TogglePreserveActiveTabColor { enabled: bool, }, ShowSubshellBanner, DeclineSubshellBootstrap { remember: bool, }, TriggerSubshellBootstrap { triggered_by_rc_file_snippet: bool, }, AddDenylistedSubshellCommand, RemoveDenylistedSubshellCommand, AddAddedSubshellCommand, RemoveAddedSubshellCommand, ReceivedSubshellRcFileDcs, AddDenylistedSshTmuxWrapperHost, RemoveDenylistedSshTmuxWrapperHost, /// User Setting for enabling SSH Tmux Wrapper changed. ToggleSshTmuxWrapper { enabled: bool, }, ToggleSshWarpification { enabled: bool, }, /// User changed the SSH extension install mode. SetSshExtensionInstallMode { mode: &'static str, }, /// User toggled the "Don't ask me this again" checkbox on the SSH /// remote-server choice block. SshRemoteServerChoiceDoNotAskAgainToggled { checked: bool, }, /// An ssh interactive session was detected. SshInteractiveSessionDetected(SshInteractiveSessionDetected), SshTmuxWarpifyBannerDisplayed, /// A SSH Warpify Block was accepted SshTmuxWarpifyBlockAccepted, /// A SSH Warpify Block was dismissed SshTmuxWarpifyBlockDismissed, WarpifyFooterShown { is_ssh: bool, }, AgentToolbarDismissed, WarpifyFooterAcceptedWarpify { is_ssh: bool, }, /// How long until the warpify process succeeded SshTmuxWarpificationSuccess { tmux_installation: Option, duration_ms: u64, }, /// An SSH Error block was displayed to the user. SshTmuxWarpificationErrorBlock { error: WarpificationUnavailableReason, tmux_installation: Option, }, /// A SSH Install Tmux Block was displayed. SshInstallTmuxBlockDisplayed, /// A SSH Install Tmux Block was accepted. SshInstallTmuxBlockAccepted, /// A SSH Install Tmux Block was dismissed. SshInstallTmuxBlockDismissed, ShowAliasExpansionBanner, EnableAliasExpansionFromBanner, DismissAliasExpansionBanner, ShowVimKeybindingsBanner, EnableVimKeybindingsFromBanner, DismissVimKeybindingsBanner, InitiateReauth, InitiateAnonymousUserSignup { entrypoint: AnonymousUserSignupEntrypoint, }, AnonymousUserExpirationLockout, AnonymousUserLinkedFromBrowser, AnonymousUserAttemptLoginGatedFeature { feature: LoginGatedFeature, }, AnonymousUserHitCloudObjectLimit, NeedsReauth, WarpDriveOpened { source: WarpDriveSource, is_code_mode_v2: bool, }, // Toggled the legacy Warp AI side panel. ToggleWarpAI { opened: bool, }, ToggleSecretRedaction { enabled: bool, }, CustomSecretRegexAdded, ToggleObfuscateSecret { interaction: SecretInteraction, }, CopySecret, AutoGenerateMetadataSuccess, AutoGenerateMetadataError { error_payload: Value, }, UpdateSortingChoice { sorting_choice: DriveSortOrder, }, UndoClose { item_type: UndoCloseItemType, }, /// This event is used to measure PTY throughput. /// NOTE: this event is only meant to be used for WarpDev. PtyThroughput { /// The maximum PTY throughput in bytes/sec, aggregated over a 10 minute period. max_bytes_per_second: usize, }, DuplicateObject(TelemetryCloudObjectType), ExportObject(TelemetryCloudObjectType), DriveSharingOnboardingBlockShown, CommandFileRun, PageUpDownInEditorPressed { // Key pressed when nothing is in the editor (no-op) is_empty_editor: bool, // Is PageDown. Otherwise is PageUp is_down: bool, }, /// Emitted on start share attempt, not on success. StartedSharingCurrentSession { includes_scrollback: bool, source: SharedSessionActionSource, }, StoppedSharingCurrentSession { source: SharedSessionActionSource, reason: SessionEndedReason, }, JoinedSharedSession { session_id: SharedSessionId, source_type: SessionSourceType, }, SharedSessionModalUpgradePressed, /// Emitted when a shared session sharer cancels granting a role /// (currently only applies when granting executor mode). SharerCancelledGrantRole { role: Role, }, /// Emitted when a shared session sharer checks "dont show again" /// in confirmation modal when granting a role. SharerGrantModalDontShowAgain, JumpToSharedSessionParticipant { jumped_to: ParticipantId, }, CopiedSharedSessionLink { source: SharedSessionActionSource, }, WebSessionOpenedOnDesktop { source: SharedSessionActionSource, }, WebCloudObjectOpenedOnDesktop { object_metadata: CloudObjectTelemetryMetadata, }, UnsupportedShell { shell: String, }, LogOut, SettingsImportInitiated, InviteTeammates { num_teammates: usize, team_uid: ServerId, }, CopyObjectToClipboard(TelemetryCloudObjectType), OpenAndWarpifyDockerSubshell { /// Some variant if we support this shell type, and None otherwise. shell_type: Option, }, /// Represents an update to a block filter query that goes from empty to non-empty. UpdateBlockFilterQuery, UpdateBlockFilterQueryContextLines { num_context_lines: u16, }, ToggleBlockFilterQuery { enabled: bool, source: ToggleBlockFilterSource, }, ToggleBlockFilterCaseSensitivity { enabled: bool, }, ToggleBlockFilterRegex { enabled: bool, }, ToggleBlockFilterInvert { enabled: bool, }, BlockFilterToolbeltButtonClicked, ToggleSnackbarInActivePane { show_snackbar: bool, }, PaneDragInitiated, PaneDropped { drop_location: PaneDragDropLocation, }, ObjectLinkCopied { link: String, }, FileTreeToggled { source: FileTreeSource, is_code_mode_v2: bool, /// The CLI agent type if opened from a CLI agent footer (e.g., Claude Code). cli_agent: Option, }, /// User attached a file or directory as context from the file tree FileTreeItemAttachedAsContext { is_directory: bool, }, /// User added selected code as context from the code editor. CodeSelectionAddedAsContext { destination: CodeContextDestination, }, /// User created a new file from the file tree FileTreeItemCreated, /// Conversation list view was opened ConversationListViewOpened, /// User opened a conversation from the conversation list ConversationListItemOpened { /// Whether the conversation is an ambient agent task (vs a local conversation) is_ambient_agent: bool, }, /// User deleted a conversation from the conversation list ConversationListItemDeleted, /// User copied a conversation link from the conversation list ConversationListLinkCopied { /// Whether the conversation is an ambient agent task (vs a local conversation) is_ambient_agent: bool, }, /// Created a blocklist AI block. AgentModeCreatedAIBlock { /// The client-generated exchange ID for the AI exchange (input + output turn) rendered in this AI block. client_exchange_id: String, /// The server-generated output ID for the output in this block. /// /// This is only populated if the some part of the response was succesfully received. server_output_id: Option, was_autodetected_ai_query: bool, /// Time from sending request to receiving the first token in the output. time_to_first_token_ms: Option, /// Time from sending request to receiving the last token in the output. time_to_last_token_ms: Option, /// `true` if the output resulted in a user-facing error. was_user_facing_error: bool, /// `true` if the the AI block was cancelled before receiving any output or while streaming /// output. cancelled: bool, /// The ID of the conversation this block belongs to. conversation_id: AIConversationId, /// Whether or not Universal Developer Input mode is enabled is_udi_enabled: bool, }, /// Rated a blocklist AI response via thumbs up/down. AgentModeRatedResponse { /// The server-generated ID for the output corresponding to this rating. server_output_id: Option, /// The ID of the conversation to which the rated output belongs. conversation_id: AIConversationId, rating: AIBlockResponseRating, }, /// The user tried to send an Agent Mode query but they have already reached their AI request /// limit. Note that this limit is for all AI requests, not Agent Mode alone. AgentModeUserAttemptedQueryAtRequestLimit { /// The AI request limit for the user's current plan. limit: usize, }, AgentModeClickedEntrypoint { entrypoint: AgentModeEntrypoint, }, /// User clicked the continue conversation button from a block footer. AgentModeContinueConversationButtonClicked { conversation_id: AIConversationId, }, /// User opened the rewind confirmation dialog. AgentModeRewindDialogOpened { entrypoint: AgentModeRewindEntrypoint, }, /// User executed a conversation rewind. AgentModeRewindExecuted { /// The number of AI blocks that were reverted. num_blocks_reverted: usize, }, /// Emitted when a user explicitly attaches a block as context to an Agent Mode query. /// /// This is only emitted for the initial attachment -- its intended to express user's intent to /// attach context. /// /// For example, this is emitted when a user selects a block to attach as context and has no /// prior blocks selected. If a user has already selected a block as context and is merely /// changing or adding to the existing selection, this is not emitted. /// /// Also note this is not emitted if the user clicks an entrypoint that automatically attaches /// context (like clicking the block toolbelt stars button, for instance). AgentModeAttachedBlockContext { method: AgentModeAttachContextMethod, }, /// Emitted when the user toggles the "Input Auto-detection" setting in the AI settings page or /// in the auto-detection "speed bump" banner. AgentModeToggleAutoDetectionSetting { is_autodetection_enabled: bool, origin: AgentModeAutoDetectionSettingOrigin, }, /// Emitted when the input type is changed from one type to new_input_type. AgentModeChangedInputType { input: Option, buffer_length: usize, is_manually_changed: bool, new_input_type: InputType, active_block_id: BlockId, /// Whether or not Universal Developer Input mode is enabled is_udi_enabled: bool, }, /// Emitted when the user manually toggles the terminal input from AI mode to shell mode when /// the current input text has been auto-detected as AI input -- this is likely a natural /// language auto-detection false-positive. AgentModePotentialAutoDetectionFalsePositive(AgentModeAutoDetectionFalsePositivePayload), /// This is a telemetry event used to help track performance of Agent Predict in Warp, /// by keeping track of the context given and the predictions generated. AgentModePrediction { was_suggestion_accepted: bool, request_duration_ms: i64, is_from_ai: bool, does_actual_command_match_prediction: bool, does_actual_command_match_history_prediction: bool, history_prediction_likelihood: f64, total_history_count: usize, // The below fields are only collected if telemetry is enabled. actual_next_command_run: Option, history_based_autosuggestion_state: Option, generate_ai_input_suggestions_request: Option, generate_ai_input_suggestions_response: Option, }, /// Keeps track of number of times the user is presented with a Prompt Suggestions banner. PromptSuggestionShown { id: String, request_duration_ms: u64, block_id: Option, view: PromptSuggestionViewType, /// Server-assigned request token from the `/passive-suggestion` /// request that generated this suggestion. Used to join client-side /// telemetry with server-side logs. `None` on the legacy code path. server_request_token: Option, }, /// Keeps track of number of times the user is presented with a Suggested Code Diff banner. SuggestedCodeDiffBannerShown { prompt_suggestion_id: String, /// Exchange ID of the conversation that produced this diff. /// `None` on the MAA passive-suggestion code path, which does not /// create an exchange. code_exchange_id: Option, block_id: Option, request_duration_ms: u64, /// Server-assigned request token from the `/passive-suggestion` /// request. Used to join client-side telemetry with server-side logs. /// `None` on the legacy code path. server_request_token: Option, }, /// Keeps track of number of times the user falls back to a prompt suggestion from a suggested code diff banner. SuggestedCodeDiffFailed { prompt_suggestion_id: String, reason: PromptSuggestionFallbackReason, }, /// Keeps track of number of times the user accepts & runs a query from the Prompt Suggestions banner. PromptSuggestionAccepted { id: String, view: PromptSuggestionViewType, interaction_source: InteractionSource, }, /// Keeps track of number of times the user is presented with a Static Prompt Suggestions banner. StaticPromptSuggestionsBannerShown { id: String, block_id: String, static_prompt_suggestion_name: String, // The below fields are only collected if telemetry is enabled. query: Option, block_command: Option, request_duration_ms: u64, view: PromptSuggestionViewType, }, /// Keeps track of number of times the user accepts a Static Prompt Suggestion. StaticPromptSuggestionAccepted { id: String, view: PromptSuggestionViewType, interaction_source: InteractionSource, }, /// Keeps track of number of times the user uses a zero state prompt suggestion & the type of suggestion used. ZeroStatePromptSuggestionUsed { suggestion_type: ZeroStatePromptSuggestionType, triggered_from: ZeroStatePromptSuggestionTriggeredFrom, }, UnitTestSuggestionShown { identifiers: AIIdentifiers, }, UnitTestSuggestionAccepted { identifiers: AIIdentifiers, query: Option, interaction_source: InteractionSource, }, /// Keeps track of when the user cancels a suggested prompt. UnitTestSuggestionCancelled { identifiers: AIIdentifiers, interaction_source: InteractionSource, }, /// Emitted when a user makes their first edit to any file in a code diff suggestion from Agent /// Mode. AgentModeCodeSuggestionEditedByUser { /// Server-generated unique ID associated with the AI API output that generated the /// suggestion. Used to join client-side telemetry with server-side logs. output_id: ServerOutputId, }, /// Emitted when a user switches between files while viewing a code diff suggestion from Agent /// Mode. AgentModeCodeFilesNavigated { output_id: ServerOutputId, source: AgentModeCodeFileNavigationSource, }, AgentModeCodeDiffHunksNavigated { output_id: ServerOutputId, }, /// Emitted when the user toggles the "Intelligent autosuggestions" setting in the AI settings page. ToggleIntelligentAutosuggestionsSetting { is_intelligent_autosuggestions_enabled: bool, }, /// Emitted when the user toggles global AI. ToggleGlobalAI { is_ai_enabled: bool, }, /// Emitted when the user toggles codebase context. ToggleCodebaseContext { is_codebase_context_enabled: bool, }, ToggleAutoIndexing { is_autoindexing_enabled: bool, }, ActiveIndexedReposChanged { updated_number_of_codebase_indices: usize, hit_max_indices: bool, }, /// Emitted when the user toggles active AI. ToggleActiveAI { is_active_ai_enabled: bool, }, /// Emitted when the user toggles the "Prompt Suggestions" setting in the AI settings page. TogglePromptSuggestionsSetting { is_prompt_suggestions_enabled: bool, }, /// Emitted when the user toggles the "Code Suggestions" setting. ToggleCodeSuggestionsSetting { source: ToggleCodeSuggestionsSettingSource, is_code_suggestions_enabled: bool, }, /// Emitted when the user toggles the "Natural Language Autosuggestions" setting in the AI settings page. ToggleNaturalLanguageAutosuggestionsSetting { is_natural_language_autosuggestions_enabled: bool, }, /// Emitted when the user toggles the "Shared Block Title Auto Generation" setting in the AI settings page. ToggleSharedBlockTitleGenerationSetting { is_shared_block_title_generation_enabled: bool, }, /// Emitted when the user toggles the "Git Operations Autogen" setting in the AI settings page. ToggleGitOperationsAutogenSetting { is_git_operations_autogen_enabled: bool, }, /// Emitted when the user toggles the "Voice Input" setting in the AI settings page. ToggleVoiceInputSetting { is_voice_input_enabled: bool, }, /// Emitted when the user toggles the "Show Agent Tips" setting in the AI settings page. ToggleShowAgentTips { is_enabled: bool, }, TierLimitHit(TierLimitHitEvent), SharedObjectLimitHitBannerViewPlansButtonClicked, ResourceUsageStats { cpu: CpuUsageStats, mem: MemoryUsageStats, }, MemoryUsageStats { total_application_usage_bytes: usize, total_blocks: usize, total_lines: usize, /// Statistics about blocks that have been seen in the past 5 minutes. active_block_stats: BlockMemoryUsageStats, /// Statistics about blocks that haven't been seen since [5m, 1h). inactive_5m_stats: BlockMemoryUsageStats, /// Statistics about blocks that haven't been seen since [1h, 24h). inactive_1h_stats: BlockMemoryUsageStats, /// Statistics about blocks that haven't been seen since [24h, ..). inactive_24h_stats: BlockMemoryUsageStats, }, MemoryUsageHigh { total_application_usage_bytes: u64, /// Platform-specific memory breakdown (JSON object with keys that /// vary by OS). See `memory_footprint::memory_breakdown()`. memory_breakdown: serde_json::Value, }, EnvVarCollectionInvoked(EnvVarTelemetryMetadata), EnvVarWorkflowParameterization(EnvVarTelemetryMetadata), /// The user imported settings from another terminal. CompletedSettingsImport { terminal_type: TerminalType, imported_settings: Vec, }, /// The user focused a terminal option to import settings from. SettingsImportConfigFocused(TerminalType), /// The user clicked the "Reset to defaults" button in the settings import onboarding block. SettingsImportResetButtonClicked, /// Completed parsing a terminal for its settings to import. SettingsImportConfigParsed { timing_data: Vec, terminal_type: TerminalType, settings_shown_to_user: Option>, }, /// When parsing iTerm for settings it contained multiple hotkey bindings. ITermMultipleHotkeys, UserMenuUpgradeClicked, ToggleWorkspaceDecorationVisibility { previous_value: WorkspaceDecorationVisibility, new_value: WorkspaceDecorationVisibility, }, UpdateAltScreenPaddingMode { new_mode: AltScreenPaddingMode, }, AddTabWithShell { source: AddTabWithShellSource, shell: String, }, AgentModeSurfacedCitations { citations: Vec, block_id: String, conversation_id: AIConversationId, server_output_id: Option, }, AgentModeOpenedCitation { citation: AgentModeCitation, block_id: String, conversation_id: AIConversationId, server_output_id: Option, }, OpenedSharingDialog(OpenedSharingDialogEvent), ToggleLigatureRendering { enabled: bool, }, WorkflowAliasAdded { workflow_id: Option, workflow_space: Option, }, WorkflowAliasRemoved { workflow_id: Option, workflow_space: Option, }, WorkflowAliasEnvVarsAttached { workflow_id: Option, workflow_space: Option, env_vars_id: Option, env_vars_space: Option, }, WorkflowAliasArgumentEdited { workflow_id: Option, workflow_space: Option, }, ToggledAgentModeAutoexecuteReadonlyCommandsSetting { src: AutonomySettingToggleSource, enabled: bool, }, ChangedAgentModeCodingPermissions { src: AutonomySettingToggleSource, new: AgentModeCodingPermissionsType, }, FullEmbedCodebaseContextSearchSuccess { action_id: AIAgentActionId, total_search_duration: Duration, out_of_sync_delay: Option, }, FullEmbedCodebaseContextSearchFailed { action_id: AIAgentActionId, error: String, }, RepoOutlineConstructionSuccess { total_parse_seconds: usize, file_count: usize, }, RepoOutlineConstructionFailed { error: String, }, AutoexecutedAgentModeRequestedCommand { reason: CommandExecutionPermissionAllowedReason, }, AgenticOnboardingBlockSelected { block_type: OnboardingChipType, }, KnowledgePaneOpened { entrypoint: KnowledgePaneEntrypoint, }, #[cfg(feature = "local_fs")] CodePaneOpened { source: CodeSource, layout: EditorLayout, preview: bool, }, #[cfg(feature = "local_fs")] CodePanelsFileOpened { entrypoint: CodePanelsFileOpenEntrypoint, target: FileTarget, }, #[cfg(feature = "local_fs")] PreviewPanePromoted, AISuggestedRuleAdded { rule_id: SuggestedLoggingId, }, AISuggestedRuleEdited { rule_id: SuggestedLoggingId, }, AISuggestedRuleContentChanged { rule_id: SuggestedLoggingId, is_saved: bool, }, AISuggestedAgentModeWorkflowAdded { logging_id: SuggestedLoggingId, }, AttachedImagesToAgentModeQuery { num_images: usize, /// Whether or not Universal Developer Input mode is enabled is_udi_enabled: bool, }, /// An error was encountered fetching available WSL distributions from the Registry. /// This typically means the user hasn't installed or enabled WSL. #[cfg(windows)] WSLRegistryError, #[cfg(windows)] AutoupdateUnableToCloseApplications, #[cfg(windows)] AutoupdateFileInUse, #[cfg(windows)] AutoupdateMutexTimeout, #[cfg(windows)] AutoupdateForcekillFailed, ExecutedWarpDrivePrompt { id: Option, selection_source: WorkflowSelectionSource, }, ImageReceived { image_protocol: ImageProtocol, }, /// A file from the result of an AI Agent Action exceeded the context limit. FileExceededContextLimit { identifiers: AIIdentifiers, }, AgentModeError { identifiers: AIIdentifiers, error: String, /// Some errors are retried internally without showing to the user. is_user_visible: bool, /// Whether a conversation resume will be attempted after this error. will_attempt_to_resume: bool, }, /// Emitted when a MultiAgent request that initially failed is successfully completed after retries. AgentModeRequestRetrySucceeded { identifiers: AIIdentifiers, /// The number of retry attempts that were made before success retry_count: usize, /// The original error that was retried original_error: String, }, GrepToolSucceeded, GrepToolFailed { queries: Option>, path: Option, shell_type: Option, working_directory: Option, absolute_path: Option, command: Option, output: Option, error: String, server_output_id: Option, }, FileGlobToolSucceeded, FileGlobToolFailed { server_output_id: Option, }, MCPServerCollectionPaneOpened { entrypoint: MCPServerCollectionPaneEntrypoint, }, MCPServerAdded { metadata: MCPServerTelemetryMetadata, }, MCPTemplateCreated { source: MCPTemplateCreationSource, variables: Vec, name: String, }, MCPTemplateInstalled { source: MCPTemplateInstallationSource, }, MCPTemplateShared, MCPServerSpawned { transport_type: MCPServerTelemetryTransportType, error: Option, server_model: MCPServerModel, }, MCPToolCallAccepted { server_output_id: Option, tool_call: String, error: Option, }, ShellTerminatedPrematurely { shell_type: Option, shell_path: Option, reason: String, reason_details: Option, antivirus_name: Option, long_os_version: Option, exit_reason: Option, }, SearchCodebaseRequested { action_id: AIAgentActionId, server_output_id: Option, is_cross_repo: bool, }, SearchCodebaseRepoUnavailable { action_id: AIAgentActionId, error: String, }, /// User changed the input UX mode (e.g. Universal Developer Input, UDI, mode or Classic) InputUXModeChanged { is_udi_enabled: bool, origin: InputUXChangeOrigin, }, /// User interacted with context chips (git branch, working directory, etc.) ContextChipInteracted { chip_type: String, /// "opened" action: String, /// Whether or not Universal Developer Input mode is enabled is_udi_enabled: bool, }, /// User used voice input functionality VoiceInputUsed { action: String, // "start", "stop", "cancel" /// Duration of voice session in milliseconds (for stop action) session_duration_ms: Option, /// Whether or not Universal Developer Input mode is enabled is_udi_enabled: bool, /// Current input mode when voice was used current_input_mode: InputType, }, /// User interacted with @-menu for context attachment AtMenuInteracted { /// Length of the query string query_length: Option, /// "opened", "item_selected", "cancelled" action: String, /// How many items were available in the menu item_count: Option, /// Whether or not Universal Developer Input mode is enabled is_udi_enabled: bool, /// Current input mode when @ menu was used current_input_mode: InputType, }, TabCloseButtonPositionUpdated { position: TabCloseButtonPosition, }, ExpandedCodeSuggestions { identifiers: AIIdentifiers, }, AIExecutionProfileCreated, AIExecutionProfileDeleted, AIExecutionProfileSettingUpdated { setting_type: String, setting_value: String, }, AIExecutionProfileAddedToAllowlist { list_type: String, value: String, }, AIExecutionProfileAddedToDenylist { list_type: String, value: String, }, AIExecutionProfileRemovedFromAllowlist { list_type: String, value: String, }, AIExecutionProfileRemovedFromDenylist { list_type: String, value: String, }, AIExecutionProfileModelSelected { model_type: String, model_value: String, }, /// The AI input was not sent because there was already an in-flight request. AIInputNotSent { entrypoint: Option, inputs: Vec, active_server_conversation_id: Option, active_client_conversation_id: Option, }, OpenSlashMenu { source: SlashMenuSource, /// Whether the inline slash commands UI is enabled. is_inline_ui_enabled: bool, /// Whether the menu was opened in the agent view vs terminal mode. is_in_agent_view: bool, }, SlashCommandAccepted { command_details: SlashCommandAcceptedDetails, /// Whether the command was accepted in the agent view vs terminal mode. is_in_agent_view: bool, }, AgentModeSetupBannerAccepted, AgentModeSetupBannerDismissed, AgentModeSetupProjectScopedRulesAction { action: AgentModeSetupProjectScopedRulesActionType, }, AgentModeSetupCodebaseContextAction { action: AgentModeSetupCodebaseContextActionType, }, AgentModeSetupCreateEnvironmentAction { action: AgentModeSetupCreateEnvironmentActionType, }, InputBufferSubmitted { input_type: input_classifier::InputType, is_locked: bool, was_lock_set_with_empty_buffer: bool, }, /// User submitted a prompt from the create project view - metadata (non-UGC) CreateProjectPromptSubmitted { /// Whether this was a custom prompt or a predefined suggestion is_custom_prompt: bool, /// For suggested prompts, this is always collected. For custom prompts, this is None. suggested_prompt: Option, /// Whether this was from the FTUX is_ftux: bool, }, /// User submitted a custom prompt from the create project view - content (UGC) CreateProjectPromptSubmittedContent { /// The custom prompt content - only collected when UGC is enabled custom_prompt: String, }, /// User submitted a repository URL from the clone repo view CloneRepoPromptSubmitted { is_ftux: bool, }, /// From the first-time user "get started" page, skip straight to terminal without /// creating/opening a project/repository. GetStartedSkipToTerminal, /// User selected an item from the "Recent" list on the new tab zero state RecentMenuItemSelected { // The kind of recent menu item selected kind: &'static str, }, /// User selected a folder to open as a repo from the "Open repository" button OpenRepoFolderSubmitted { is_ftux: bool, }, /// User closed the "Out of credits" banner (dismissed or purchased credits) OutOfCreditsBannerClosed { action: OutOfCreditsBannerAction, selected_credits: Option, auto_reload_checkbox_enabled: bool, banner_toggle_flag_enabled: bool, post_purchase_modal_flag_enabled: bool, }, /// User closed the auto-reload modal (either dismissed or enabled auto-reload) AutoReloadModalClosed { action: AutoReloadModalAction, selected_credits: Option, banner_toggle_flag_enabled: bool, post_purchase_modal_flag_enabled: bool, }, /// User toggled auto-reload in Billing & Usage settings AutoReloadToggledFromBillingSettings { enabled: bool, banner_toggle_flag_enabled: bool, post_purchase_modal_flag_enabled: bool, }, /// Emitted when the control state of the CLI subagent changes. CLISubagentControlStateChanged { conversation_id: Option, block_id: BlockId, control_state: CLISubagentControlState, }, /// Emitted when user toggles the visibility of agent responses. CLISubagentResponsesToggled { conversation_id: AIConversationId, block_id: BlockId, is_hidden: bool, }, /// Emitted when user dismisses the input in the CLI subagent. CLISubagentInputDismissed { conversation_id: AIConversationId, block_id: BlockId, }, /// Emitted when user approves a blocked action from the CLI subagent. CLISubagentActionExecuted { conversation_id: AIConversationId, block_id: BlockId, is_autoexecuted: bool, }, /// Emitted when user rejects a blocked action from the CLI subagent. CLISubagentActionRejected { conversation_id: AIConversationId, block_id: BlockId, user_took_over: bool, }, /// Emitted when the user toggles the Agent Management View. AgentManagementViewToggled { is_open: bool, }, /// Emitted when the user opens a session from the Agent Management View. AgentManagementViewOpenedSession, /// Emitted when the user copies a session link from the Agent Management View. AgentManagementViewCopiedSessionLink, /// Detected that Warp is running in an isolated sandbox. DetectedIsolationPlatform { platform: warp_isolation_platform::IsolationPlatformType, }, AgentTipShown { tip: String, }, AgentTipClicked { tip: String, click_target: String, }, /// Emitted when an agent-requested command causes the shell to exit. AgentExitedShellProcess { command: String, server_output_id: Option, }, /// Emitted when the user uses voice input from the CLI agent footer. CLIAgentToolbarVoiceInputUsed { /// The CLI agent being used. cli_agent: CLIAgentType, }, /// Emitted when the user attaches an image from the CLI agent footer. CLIAgentToolbarImageAttached { /// The CLI agent being used. cli_agent: CLIAgentType, }, /// Emitted when the CLI agent footer is shown. CLIAgentToolbarShown { /// The CLI agent being shown. cli_agent: CLIAgentType, }, /// Emitted when the user opens the CLI agent rich input editor. CLIAgentRichInputOpened { /// The CLI agent being used. cli_agent: CLIAgentType, /// How the editor was opened (Ctrl-G or footer button). entrypoint: CLIAgentInputEntrypoint, }, /// Emitted when the CLI agent rich input editor is closed. CLIAgentRichInputClosed { /// The CLI agent being used. cli_agent: CLIAgentType, /// Why the editor was closed. reason: CLIAgentRichInputCloseReason, }, /// Emitted when the user submits a prompt via the CLI agent rich input editor. CLIAgentRichInputSubmitted { /// The CLI agent being used. cli_agent: CLIAgentType, /// Length of the submitted prompt in characters. prompt_length: usize, }, /// Emitted when the user clicks a plugin chip (install, update, or instructions). CLIAgentPluginChipClicked { /// The CLI agent being used. cli_agent: CLIAgentType, /// The specific action taken. action: PluginChipTelemetryAction, }, /// Emitted when the user dismisses the plugin chip. CLIAgentPluginChipDismissed { /// The CLI agent being used. cli_agent: CLIAgentType, /// Whether this was the install or update chip. chip_kind: PluginChipTelemetryKind, }, /// Emitted when auto plugin install or update succeeds. CLIAgentPluginOperationSucceeded { /// The CLI agent being used. cli_agent: CLIAgentType, /// Whether this was an install or update operation. operation: PluginChipTelemetryKind, }, /// Emitted when auto plugin install or update fails. CLIAgentPluginOperationFailed { /// The CLI agent being used. cli_agent: CLIAgentType, /// Whether this was an install or update operation. operation: PluginChipTelemetryKind, }, /// Emitted when a CLI agent plugin is first recognized (SessionStart event received). CLIAgentPluginDetected { /// The CLI agent whose plugin was detected. cli_agent: CLIAgentType, }, /// Emitted when an agent notification is shown (toast or mailbox notification). AgentNotificationShown { /// Which agent variant produced the notification. agent_variant: NotificationAgentVariant, }, /// Emitted when the user toggles the CLI agent footer setting. ToggleCLIAgentToolbarSetting { /// Whether the setting is enabled or disabled. is_enabled: bool, }, /// Emitted when the user toggles the "Use Agent" footer setting. ToggleUseAgentToolbarSetting { /// Whether the setting is enabled or disabled. is_enabled: bool, }, /// Emitted when the user enters the agent view. AgentViewEntered { /// The origin/entrypoint for entering the agent view. origin: TelemetryAgentViewEntryOrigin, /// Whether a request was automatically triggered upon entry (e.g., prompt was provided). did_auto_trigger_request: bool, }, /// Emitted when the user exits the agent view. AgentViewExited { /// The origin/entrypoint that was used when entering the agent view. origin: TelemetryAgentViewEntryOrigin, /// Whether the conversation was empty (had no exchanges) when exiting. was_empty: bool, }, /// Emitted when the inline conversation menu is opened. InlineConversationMenuOpened { /// Whether the menu was opened in the agent view vs terminal mode. is_in_agent_view: bool, }, /// Emitted when an item is selected from the inline conversation menu. InlineConversationMenuItemSelected { /// Whether the item was selected in the agent view vs terminal mode. is_in_agent_view: bool, }, /// Emitted when the agent shortcuts view visibility is toggled. AgentShortcutsViewToggled { /// Whether the shortcuts view is now visible. is_visible: bool, }, /// Emitted when the Codex modal is opened. CodexModalOpened, /// Emitted when the user clicks "Use Codex" in the Codex modal. CodexModalUseCodexClicked, /// Emitted when the cloud agent capacity modal is opened. CloudAgentCapacityModalOpened, /// Emitted when the cloud agent capacity modal is dismissed. CloudAgentCapacityModalDismissed, /// Emitted when the user clicks the upgrade button in the cloud agent capacity modal. CloudAgentCapacityModalUpgradeClicked, /// Emitted when a RequestComputerUse action is approved (manually or auto-executed). ComputerUseApproved { conversation_id: AIConversationId, is_autoexecuted: bool, ambient_agent_task_id: Option, }, /// Emitted when a RequestComputerUse action is cancelled/rejected. ComputerUseCancelled { conversation_id: AIConversationId, ambient_agent_task_id: Option, }, /// Emitted when a warp://linear deeplink is opened. LinearIssueLinkOpened, /// Emitted when the free tier limit hit interstitial is displayed. FreeTierLimitHitInterstitialDisplayed, /// Emitted when the user clicks the "Upgrade" button in the free tier limit hit interstitial. FreeTierLimitHitInterstitialUpgradeButtonClicked, /// Emitted when the user clicks close on the free tier limit hit interstitial. FreeTierLimitHitInterstitialClosed, /// Emitted when the remote server binary check completes. RemoteServerBinaryCheck { found: bool, error: Option, remote_os: Option, remote_arch: Option, }, /// Emitted when the remote server binary installation completes. /// `error` is `None` on success, `Some(reason)` on failure. RemoteServerInstallation { error: Option, remote_os: Option, remote_arch: Option, }, /// Emitted when the remote server connection + initialization completes. /// `error` is `None` on success, `Some(reason)` on failure. RemoteServerInitialization { phase: remote_server::manager::RemoteServerInitPhase, error: Option, remote_os: Option, remote_arch: Option, }, /// Emitted when an established remote server connection drops. RemoteServerDisconnection { remote_os: Option, remote_arch: Option, }, /// Emitted when a client request to the remote server fails. RemoteServerClientRequestError { operation: remote_server::manager::RemoteServerOperation, error_type: remote_server::manager::RemoteServerErrorKind, remote_os: Option, remote_arch: Option, }, /// Emitted when a server message cannot be decoded (no parseable request_id). RemoteServerMessageDecodingError { remote_os: Option, remote_arch: Option, }, /// Emitted when the full remote server setup flow completes successfully. RemoteServerSetupDuration { duration_ms: u64, installed_binary: bool, remote_os: Option, remote_arch: Option, }, } impl TelemetryEventTrait for TelemetryEvent { fn name(&self) -> &'static str { self.name() } fn payload(&self) -> Option { self.payload() } fn description(&self) -> &'static str { let discriminant: TelemetryEventDiscriminants = self.into(); discriminant.description() } fn contains_ugc(&self) -> bool { self.contains_ugc() } fn enablement_state(&self) -> EnablementState { self.enablement_state() } fn event_descs() -> impl Iterator> { warp_core::telemetry::enum_events::() } } impl TelemetryEvent { pub fn name(&self) -> &'static str { let discriminant: TelemetryEventDiscriminants = self.into(); discriminant.name() } pub fn enablement_state(&self) -> EnablementState { let discriminant: TelemetryEventDiscriminants = self.into(); discriminant.enablement_state() } pub fn payload(&self) -> Option { match self { TelemetryEvent::ShowedSuggestedAgentModeWorkflowChip { logging_id } => Some(json!({ "logging_id": logging_id, })), TelemetryEvent::ShowedSuggestedAgentModeWorkflowModal { logging_id } => Some(json!({ "logging_id": logging_id, })), TelemetryEvent::AISuggestedAgentModeWorkflowAdded { logging_id } => Some(json!({ "logging_id": logging_id, })), TelemetryEvent::AutosuggestionInserted { insertion_length, buffer_length, } => { Some(json!({"insertion_length": insertion_length, "buffer_length": buffer_length})) } TelemetryEvent::AgentModeContinueConversationButtonClicked { conversation_id } => { Some(json!({"conversation_id": conversation_id})) } TelemetryEvent::AgentModeRewindDialogOpened { entrypoint } => { Some(json!({"entrypoint": entrypoint})) } TelemetryEvent::AgentModeRewindExecuted { num_blocks_reverted, } => Some(json!({"num_blocks_reverted": num_blocks_reverted})), TelemetryEvent::BootstrappingSlow(info) => Some(json!(info)), TelemetryEvent::BootstrappingSlowContents(info) => Some(json!(info)), TelemetryEvent::ToggleSettingsSync { is_settings_sync_enabled, } => Some(json!({ "is_settings_sync_enabled": is_settings_sync_enabled })), TelemetryEvent::SessionAbandonedBeforeBootstrap { pending_shell, has_pending_ssh_session, was_ever_visible, duration_since_start, } => Some(json!({ "pending_shell": pending_shell.map(|shell| shell.name()), "has_pending_ssh_session": has_pending_ssh_session, "was_ever_visible": was_ever_visible, "duration_since_start_secs": duration_since_start.as_secs_f32(), })), TelemetryEvent::BlockCompleted { block_finished_to_precmd_delay_ms, honor_ps1_enabled, num_secrets_redacted, num_output_lines, num_output_lines_truncated, terminal_session_id, is_udi_enabled, is_in_agent_view, } => Some(json!({ "block_finished_to_precmd_delay_ms": block_finished_to_precmd_delay_ms, "honor_ps1_enabled": honor_ps1_enabled, "num_secrets_redacted": num_secrets_redacted, "num_output_lines": num_output_lines, "num_output_lines_truncated": num_output_lines_truncated, "terminal_session_id": terminal_session_id, "is_udi_enabled": is_udi_enabled, "is_in_agent_view": is_in_agent_view, })), TelemetryEvent::ToggleFocusPaneOnHover { enabled } => Some(json!({ "enabled": enabled, })), TelemetryEvent::BlockCompletedOnDogfoodOnly { block_finished_to_precmd_delay_ms, honor_ps1_enabled, num_secrets_redacted, num_output_lines, num_output_lines_truncated, command, duration, exit_code, terminal_session_id, } => Some(json!({ "block_finished_to_precmd_delay_ms": block_finished_to_precmd_delay_ms, "honor_ps1_enabled": honor_ps1_enabled, "num_secrets_redacted": num_secrets_redacted, "num_output_lines": num_output_lines, "num_output_lines_truncated": num_output_lines_truncated, "command": command, "duration": duration, "exit_code": exit_code, "terminal_session_id": terminal_session_id, })), TelemetryEvent::BootstrappingSucceeded(info) => Some(json!(info)), TelemetryEvent::SSHBootstrapAttempt(remote_shell) => { Some(json!({ "shell": remote_shell.as_str() })) } TelemetryEvent::OpenContextMenu { context_menu_info } => Some( json!({ "type": context_menu_info.type_for_telemetry(), "open_method": context_menu_info.open_method_for_telemetry() }), ), TelemetryEvent::ContextMenuCopy(entity, cardinality) => { Some(json!({ "entity": entity.as_str(), "cardinality": cardinality })) } TelemetryEvent::ContextMenuFindWithinBlocks(cardinality) => { Some(json!({ "cardinality": cardinality })) } TelemetryEvent::ContextMenuOpenShareModal(cardinality) => { Some(json!({ "cardinality": cardinality })) } TelemetryEvent::ContextMenuCopyPrompt { part } => Some(json!({ "part": part })), TelemetryEvent::ReinputCommands(cardinality) => { Some(json!({ "cardinality": cardinality })) } TelemetryEvent::ContextMenuToggleGitPromptDirtyIndicator { enabled } => { Some(json!({ "enabled": enabled })) } TelemetryEvent::BlockSelection(details) => Some(json!(details)), TelemetryEvent::OpenSuggestionsMenu(mode) => Some(json!(mode)), TelemetryEvent::ConfirmSuggestion { mode, match_type } => { Some(json!({ "mode": mode, "match_type": match_type })) } TelemetryEvent::EditorUnhandledModifierKey(normalized_keystroke) => { Some(json!(normalized_keystroke.as_str())) } TelemetryEvent::ThemeSelection { theme, entrypoint } => { Some(json!({ "theme": theme, "entrypoint": entrypoint })) } TelemetryEvent::AppIconSelection { icon } => Some(json!({"icon": icon})), TelemetryEvent::CursorDisplayType { cursor: cursor_display_type, } => Some(json!({"cursor": cursor_display_type})), TelemetryEvent::ObjectLinkCopied { link } => Some(json!({"link": link})), TelemetryEvent::FileTreeToggled { source, is_code_mode_v2, cli_agent, } => Some( json!({"source": source, "is_code_mode_v2": is_code_mode_v2, "cli_agent": cli_agent}), ), TelemetryEvent::FileTreeItemAttachedAsContext { is_directory } => { Some(json!({"is_directory": is_directory})) } TelemetryEvent::ToggleRestoreSession(enabled) => Some(json!({ "enabled": enabled })), TelemetryEvent::DatabaseStartUpError(error) => Some(json!(error)), TelemetryEvent::DatabaseReadError(error) => Some(json!(error)), TelemetryEvent::DatabaseWriteError(error) => Some(json!(error)), TelemetryEvent::AppStartup(info) => Some(json!(info)), TelemetryEvent::DownloadSource(source) => Some(json!(source)), TelemetryEvent::BaselineCommandLatency(info) => Some(json!(info)), TelemetryEvent::KeybindingChanged { action, keystroke } => { Some(json!({ "action": action, "keystroke": keystroke.normalized() })) } TelemetryEvent::KeybindingResetToDefault { action } => { Some(json!({ "action": action })) } TelemetryEvent::KeybindingRemoved { action } => Some(json!({ "action": action })), TelemetryEvent::FeaturesPageAction { action, value } => { Some(json!({"action": action, "value": value})) } TelemetryEvent::WorkflowExecuted(metadata) => Some(json!(metadata)), TelemetryEvent::WorkflowSelected(metadata) => Some(json!(metadata)), TelemetryEvent::CompleteWelcomeTipFeature { total_completed_count, tip_name, } => Some( json!({ "total_completed_count": total_completed_count, "tip_name": tip_name }), ), TelemetryEvent::NotificationsDiscoveryBannerAction(action) => { Some(json!({ "action": action })) } TelemetryEvent::InputModeChanged { old_mode, new_mode } => { Some(json!({ "old_mode": old_mode, "new_mode": new_mode })) } TelemetryEvent::NotificationsErrorBannerAction(action) => { Some(json!({ "action": action })) } TelemetryEvent::NotificationPermissionsRequested { source, trigger } => { Some(json!({ "source": source, "trigger": trigger })) } TelemetryEvent::NotificationFailedToSend { error } => Some(json!({ "error": error })), TelemetryEvent::NotificationSent { trigger, agent_variant, } => Some(json!({ "trigger": trigger, "agent_variant": agent_variant, })), TelemetryEvent::NotificationsRequestPermissionsOutcome { outcome } => { Some(json!({ "outcome": outcome })) } TelemetryEvent::ToggleFindOption { option, enabled } => { Some(json!({ "option": option, "enabled": enabled })) } TelemetryEvent::SelectCommandPaletteOption(option) => Some(json!({ "option": option })), TelemetryEvent::PaletteSearchOpened { mode, source } => { Some(json!({ "mode": mode, "source": source })) } TelemetryEvent::PaletteSearchResultAccepted { result_type, filter: mode, buffer_length, } => Some( json!({ "result_type": result_type, "mode": mode, "buffer_length": buffer_length }), ), TelemetryEvent::PaletteSearchExited { filter: mode, buffer_length, } => Some(json!({ "mode": mode, "buffer_length": buffer_length })), TelemetryEvent::AuthCommonQuestionClicked { question } => Some(json!(question)), TelemetryEvent::AuthToggleFAQ { open } => { let payload = if *open { "open" } else { "close" }; Some(json!(payload)) } TelemetryEvent::TabRenamed(rename_event) => Some(json!(rename_event)), TelemetryEvent::MoveActiveTab { direction } => Some(json!({ "direction": direction })), TelemetryEvent::MoveTab { direction } => Some(json!({ "direction": direction })), TelemetryEvent::TabOperations { action } => Some(json!({ "action": action })), TelemetryEvent::ThinStrokesSettingChanged { new_value } => { Some(json!({ "new_value": new_value })) } TelemetryEvent::BookmarkBlockToggled { enable_bookmark } => { Some(json!({ "enable_bookmark": enable_bookmark })) } TelemetryEvent::OpenLink { link, open_with } => { Some(json!({"link_type": link, "open_with": open_with})) } TelemetryEvent::OpenChangelogLink { url } => Some(json!({ "url": url })), TelemetryEvent::CommandXRayTriggered { trigger } => Some(json!({ "trigger": trigger })), TelemetryEvent::SaveLaunchConfig { state } => Some(json!({ "state": state })), TelemetryEvent::SaveAsWorkflowModal { source } => Some(json!({ "source": source })), TelemetryEvent::CommandCorrection { event } => Some(json!({ "event": event })), TelemetryEvent::SetLineHeight { new_value } => Some(json!({ "new_value": new_value })), TelemetryEvent::CommandSearchOpened { has_initial_query } => { Some(json!({ "has_initial_query": has_initial_query })) } TelemetryEvent::CommandSearchExited { buffer_length, query_filter, } => Some(json!({ "buffer_length": buffer_length, "query_filter": query_filter })), TelemetryEvent::CommandSearchResultAccepted { result_index, result_type, query_filter, buffer_length, was_immediately_executed, } => Some(json!({ "result_index": result_index, "result_type": result_type, "query_filter": query_filter, "buffer_length": buffer_length, "was_immediately_executed": was_immediately_executed })), TelemetryEvent::CommandSearchFilterChanged { new_filter } => { Some(json!({ "new_filter": new_filter })) } TelemetryEvent::CommandSearchAsyncQueryCompleted { filters, error_payload, } => Some(json!({ "filter": filters, "error": error_payload })), TelemetryEvent::AICommandSearchOpened { entrypoint } => { Some(json!({ "entrypoint": entrypoint })) } TelemetryEvent::OpenNotebook(metadata) => Some(json!(metadata)), TelemetryEvent::EditNotebook { metadata, meaningful_change, } => Some(json!({ "notebook_id": metadata.notebook_id, "team_uid": metadata.team_uid, "meaningful_change": meaningful_change, })), TelemetryEvent::NotebookAction(event) => Some(json!(event)), TelemetryEvent::UserInitiatedClose { initiated_on } => { Some(json!({ "initiated_on": initiated_on })) } TelemetryEvent::QuitModalShown { running_processes, shared_sessions, modal_for, } => Some( json!({ "running_processes": running_processes, "shared_sessions": shared_sessions, "modal_for": modal_for }), ), TelemetryEvent::QuitModalCancel { nav_palette, modal_for, } => Some(json!({ "nav_palette": nav_palette, "modal_for": modal_for })), TelemetryEvent::LogOutModalCancel { nav_palette } => { Some(json!({ "nav_palette": nav_palette })) } TelemetryEvent::SetBlurRadius { blur_radius } => { Some(json!({ "blur_radius": blur_radius })) } TelemetryEvent::SetOpacity { opacity } => Some(json!({ "opacity": opacity })), TelemetryEvent::ToggleDimInactivePanes { enabled } => { Some(json!({ "enabled": enabled })) } TelemetryEvent::ToggleJumpToBottomofBlockButton { enabled } => { Some(json!({ "enabled": enabled })) } TelemetryEvent::PtySpawned { mode } => Some(json!({ "mode": mode })), TelemetryEvent::InitialWorkingDirectoryConfigurationChanged { advanced_mode_enabled, } => Some(json!({ "advanced_mode_enabled": advanced_mode_enabled })), TelemetryEvent::OpenedWarpAI { source } => Some(json!({ "source": source })), TelemetryEvent::WarpAIRequestIssued { result } => Some(json!({ "result": result })), TelemetryEvent::WarpAIAction { action_type } => { Some(json!({ "action_type": action_type })) } TelemetryEvent::MCPServerCollectionPaneOpened { entrypoint } => { Some(json!({ "entrypoint": entrypoint })) } TelemetryEvent::MCPServerAdded { metadata } => Some(json!({ "object_id": metadata.object_id, "name": metadata.name, "transport_type": metadata.transport_type, "mcp_server": metadata.mcp_server, })), TelemetryEvent::MCPTemplateCreated { source, variables, name, } => Some(json!({ "source": source, "variables": variables, "name": name, })), TelemetryEvent::MCPTemplateInstalled { source } => Some(json!({ "source": source, })), TelemetryEvent::MCPTemplateShared => None, TelemetryEvent::MCPServerSpawned { transport_type, server_model, error, } => Some( json!({"transport_type": transport_type, "server_model": server_model, "error": error}), ), TelemetryEvent::MCPToolCallAccepted { server_output_id, tool_call, error, } => Some(json!({ "server_output_id": server_output_id, "tool_call": tool_call, "error": error, })), TelemetryEvent::KnowledgePaneOpened { entrypoint } => { Some(json!({ "entrypoint": entrypoint })) } #[cfg(feature = "local_fs")] TelemetryEvent::CodePaneOpened { source, layout, preview, } => Some( json!({ "source": source.telemetry_source_name(), "layout": layout, "preview": preview }), ), #[cfg(feature = "local_fs")] TelemetryEvent::CodePanelsFileOpened { entrypoint, target } => { let (target, layout, editor) = match target { FileTarget::MarkdownViewer(layout) => { ("warp_markdown_viewer", Some(*layout), None) } FileTarget::CodeEditor(layout) => ("warp_code_editor", Some(*layout), None), FileTarget::EnvEditor => ("env_editor", None, None), FileTarget::SystemDefault => ("system_default", None, None), FileTarget::SystemGeneric => ("system_generic", None, None), FileTarget::ExternalEditor(editor) => ("external_editor", None, Some(*editor)), }; Some(json!({ "entrypoint": entrypoint, "target": target, "layout": layout, "editor": editor, })) } #[cfg(feature = "local_fs")] TelemetryEvent::PreviewPanePromoted => None, TelemetryEvent::CodeSelectionAddedAsContext { destination } => Some(json!({ "destination": destination, })), TelemetryEvent::AISuggestedRuleAdded { rule_id } => Some(json!({ "rule_id": rule_id })), TelemetryEvent::AISuggestedRuleEdited { rule_id } => { Some(json!({ "rule_id": rule_id })) } TelemetryEvent::AISuggestedRuleContentChanged { rule_id, is_saved } => { Some(json!({ "rule_id": rule_id, "is_saved": is_saved })) } TelemetryEvent::UsedWarpAIPreparedPrompt { prompt } => { Some(json!({ "prompt": prompt })) } TelemetryEvent::ExperimentTriggered { experiment, layer, group_assignment, } => Some( json!({ "experiment": experiment, "layer": layer, "group_assignment": group_assignment }), ), TelemetryEvent::ToggleSyncAllPanesInAllTabs { enabled } => { Some(json!({ "enabled": enabled })) } TelemetryEvent::ToggleSyncAllPanesInTab { enabled } => { Some(json!({ "enabled": enabled })) } TelemetryEvent::ToggleTabIndicators { enabled } => Some(json!({ "enabled": enabled })), TelemetryEvent::TogglePreserveActiveTabColor { enabled } => { Some(json!({ "enabled": enabled })) } TelemetryEvent::DeclineSubshellBootstrap { remember } => { Some(json!({ "remember": remember })) } TelemetryEvent::AgentToolbarDismissed => None, TelemetryEvent::WarpifyFooterShown { is_ssh } | TelemetryEvent::WarpifyFooterAcceptedWarpify { is_ssh } => { Some(json!({ "is_ssh": is_ssh })) } TelemetryEvent::ToggleSameLinePrompt { enabled } => Some(json!({ "enabled": enabled })), TelemetryEvent::TriggerSubshellBootstrap { triggered_by_rc_file_snippet, } => Some(json!({ "triggered_by_rc_file_snippet": triggered_by_rc_file_snippet })), TelemetryEvent::OpenLaunchConfig { ui_location, open_in_active_window, } => Some( json!({ "ui_location": ui_location, "open_in_active_window": open_in_active_window }), ), TelemetryEvent::ToggleWarpAI { opened } => Some(json!({ "opened": opened })), TelemetryEvent::ToggleSecretRedaction { enabled } => { Some(json!({ "enabled": enabled })) } TelemetryEvent::ToggleObfuscateSecret { interaction } => { Some(json!({ "interaction": interaction })) } TelemetryEvent::AutoGenerateMetadataError { error_payload } => { Some(json!({ "error": error_payload })) } TelemetryEvent::UpdateSortingChoice { sorting_choice } => { Some(json!({ "sorting_choice": sorting_choice })) } TelemetryEvent::UndoClose { item_type } => Some(json!({ "item_type": item_type })), TelemetryEvent::PromptEdited { prompt, entrypoint } => Some(json!({ "prompt": prompt, "entrypoint": entrypoint })), TelemetryEvent::OpenPromptEditor { entrypoint } => { Some(json!({ "entrypoint": entrypoint })) } TelemetryEvent::PtyThroughput { max_bytes_per_second, } => Some(json!({ "max_bytes_per_second": max_bytes_per_second, })), TelemetryEvent::DuplicateObject(object_type) => { Some(json!({ "object_type": object_type })) } TelemetryEvent::ExportObject(object_type) => { Some(json!({ "object_type": object_type })) } TelemetryEvent::GenerateBlockSharingLink { share_type, display_setting, show_prompt, redact_secrets, } => Some( json!({"share_type": share_type, "display_setting": display_setting, "show_prompt": show_prompt, "redact_secrets": redact_secrets}), ), TelemetryEvent::CopyBlockSharingLink(share_type) => { Some(json!({ "share_type": share_type })) } TelemetryEvent::PageUpDownInEditorPressed { is_empty_editor, is_down, } => Some(json!({"is_empty_editor": is_empty_editor, "is_down": is_down})), TelemetryEvent::StartedSharingCurrentSession { includes_scrollback, source, } => Some(json!({ "includes_scrollback": includes_scrollback, "source": source })), TelemetryEvent::StoppedSharingCurrentSession { source, reason } => { Some(json!({ "source": source, "reason": reason })) } TelemetryEvent::UnsupportedShell { shell } => Some(json!({ "shell": shell })), TelemetryEvent::CopyObjectToClipboard(object_type) => { Some(json!({ "object_type": object_type })) } TelemetryEvent::OpenAndWarpifyDockerSubshell { shell_type } => { Some(json!({ "shell_type": shell_type })) } TelemetryEvent::ToggleBlockFilterQuery { enabled, source } => { Some(json!({"enabled": enabled, "source": source})) } TelemetryEvent::ToggleBlockFilterRegex { enabled } => { Some(json!({ "enabled": enabled })) } TelemetryEvent::ToggleShowBlockDividers { enabled } => { Some(json!({ "enabled": enabled })) } TelemetryEvent::ToggleBlockFilterCaseSensitivity { enabled } => { Some(json!({ "enabled": enabled })) } TelemetryEvent::ToggleBlockFilterInvert { enabled } => { Some(json!({ "enabled": enabled })) } TelemetryEvent::UpdateBlockFilterQueryContextLines { num_context_lines } => { Some(json!({ "num_context_lines": num_context_lines })) } TelemetryEvent::ToggleNewWindowsAtCustomSize { enabled } => { Some(json!({"enabled": enabled})) } TelemetryEvent::ToggleSshTmuxWrapper { enabled } => Some(json!({"enabled": enabled})), TelemetryEvent::ToggleSshWarpification { enabled } => Some(json!({"enabled": enabled})), TelemetryEvent::SetSshExtensionInstallMode { mode } => Some(json!({"mode": mode})), TelemetryEvent::SshRemoteServerChoiceDoNotAskAgainToggled { checked } => { Some(json!({"checked": checked})) } TelemetryEvent::SshInteractiveSessionDetected(ssh_interactive_session_detected) => { Some(json!({"ssh_interactive_session": ssh_interactive_session_detected})) } TelemetryEvent::SshTmuxWarpificationSuccess { duration_ms, tmux_installation, } => Some(json!({ "duration_ms": duration_ms, "tmux_installation": *tmux_installation, })), TelemetryEvent::SshTmuxWarpificationErrorBlock { error, tmux_installation, } => Some(json!({ "error": error, "tmux_installation": *tmux_installation, })), TelemetryEvent::JoinedSharedSession { session_id, source_type, } => Some(json!({ "session_id": session_id, "source_type": source_type, })), TelemetryEvent::SharerCancelledGrantRole { role } => Some(json!({ "role": role })), TelemetryEvent::JumpToSharedSessionParticipant { jumped_to } => { Some(json!({ "jumped_to": jumped_to })) } TelemetryEvent::CopiedSharedSessionLink { source } => Some(json!({ "source": source })), TelemetryEvent::WebSessionOpenedOnDesktop { source } => { Some(json!({ "source": source})) } TelemetryEvent::WebCloudObjectOpenedOnDesktop { object_metadata } => Some(json!({ "object": object_metadata, })), TelemetryEvent::ToggleSnackbarInActivePane { show_snackbar } => { Some(json!({ "show_snackbar": show_snackbar })) } TelemetryEvent::PaneDropped { drop_location } => { Some(json!({ "location": drop_location })) } TelemetryEvent::InviteTeammates { num_teammates, team_uid, } => Some(json!({"num_teammates": num_teammates, "team_uid": team_uid})), TelemetryEvent::AgentModeCreatedAIBlock { client_exchange_id, server_output_id, was_autodetected_ai_query, time_to_first_token_ms, time_to_last_token_ms, was_user_facing_error, cancelled, conversation_id, is_udi_enabled, } => Some(json!({ "client_exchange_id": client_exchange_id, "server_output_id": server_output_id, "was_autodetected_ai_query": was_autodetected_ai_query, "time_to_first_token_ms": time_to_first_token_ms, "time_to_last_token_ms": time_to_last_token_ms, "was_user_facing_error": was_user_facing_error, "cancelled": cancelled, "conversation_id": conversation_id, "is_udi_enabled": is_udi_enabled, })), TelemetryEvent::TierLimitHit(event) => Some(json!(event)), TelemetryEvent::AgentModeUserAttemptedQueryAtRequestLimit { limit } => { Some(json!({"limit": limit})) } TelemetryEvent::AgentModeClickedEntrypoint { entrypoint } => { Some(json!({"entrypoint": entrypoint})) } TelemetryEvent::AgentModeAttachedBlockContext { method } => { Some(json!({"method": method})) } TelemetryEvent::AgentModeToggleAutoDetectionSetting { is_autodetection_enabled, origin, } => Some( json!({"is_autodetection_enabled": is_autodetection_enabled, "origin": origin }), ), TelemetryEvent::ToggleIntelligentAutosuggestionsSetting { is_intelligent_autosuggestions_enabled, } => Some( json!({"is_intelligent_autosuggestions_enabled": is_intelligent_autosuggestions_enabled}), ), // Using legacy name to avoid breaking telemetry. TelemetryEvent::TogglePromptSuggestionsSetting { is_prompt_suggestions_enabled, } => Some( json!({"is_agent_mode_query_suggestions_enabled": is_prompt_suggestions_enabled}), ), TelemetryEvent::ToggleCodeSuggestionsSetting { source, is_code_suggestions_enabled, } => Some( json!({"source": source, "is_code_suggestions_enabled": is_code_suggestions_enabled}), ), TelemetryEvent::ToggleNaturalLanguageAutosuggestionsSetting { is_natural_language_autosuggestions_enabled, } => Some( json!({"is_natural_language_autosuggestions_enabled": is_natural_language_autosuggestions_enabled}), ), TelemetryEvent::ToggleSharedBlockTitleGenerationSetting { is_shared_block_title_generation_enabled, } => Some( json!({"is_shared_block_title_generation_enabled": is_shared_block_title_generation_enabled}), ), TelemetryEvent::ToggleGitOperationsAutogenSetting { is_git_operations_autogen_enabled, } => Some( json!({"is_git_operations_autogen_enabled": is_git_operations_autogen_enabled}), ), TelemetryEvent::ToggleVoiceInputSetting { is_voice_input_enabled, } => Some(json!({"is_voice_input_enabled": is_voice_input_enabled})), TelemetryEvent::AgentModePotentialAutoDetectionFalsePositive( AgentModeAutoDetectionFalsePositivePayload::InternalDogfoodUsers { input_text }, ) => Some(json!({"input_text": input_text})), TelemetryEvent::AgentModeChangedInputType { input, buffer_length, is_manually_changed, new_input_type, active_block_id, is_udi_enabled, } => Some( json!({"input": input, "buffer_length": buffer_length, "is_manually_changed": is_manually_changed, "new_input_type": new_input_type, "active_block_id": active_block_id, "is_udi_enabled": is_udi_enabled}), ), TelemetryEvent::AgentModePrediction { was_suggestion_accepted, request_duration_ms, is_from_ai, does_actual_command_match_prediction, does_actual_command_match_history_prediction, history_prediction_likelihood, total_history_count, actual_next_command_run, history_based_autosuggestion_state, generate_ai_input_suggestions_request, generate_ai_input_suggestions_response, } => { let (history_command_prediction, history_command_prediction_likelihood) = if let Some(state) = history_based_autosuggestion_state { ( Some(state.history_command_prediction.clone()), Some(state.history_command_prediction_likelihood), ) } else { (None, None) }; Some(json!({ "was_suggestion_accepted": was_suggestion_accepted, "request_duration_ms": request_duration_ms, "is_from_ai": is_from_ai, "does_actual_command_match_prediction": does_actual_command_match_prediction, "does_actual_command_match_history_prediction": does_actual_command_match_history_prediction, "history_prediction_likelihood": history_prediction_likelihood, "total_history_count": total_history_count, "actual_next_command_run": actual_next_command_run, "generate_ai_input_suggestions_request": generate_ai_input_suggestions_request, "generate_ai_input_suggestions_response": generate_ai_input_suggestions_response, "history_command_prediction": history_command_prediction, "history_command_prediction_likelihood": history_command_prediction_likelihood, })) } TelemetryEvent::PromptSuggestionShown { id, request_duration_ms, block_id, view, server_request_token, } => Some(json!({ "id": id, "request_duration_ms": request_duration_ms, "block_id": block_id, "view": view, "server_request_token": server_request_token, })), TelemetryEvent::SuggestedCodeDiffBannerShown { prompt_suggestion_id, code_exchange_id, block_id, request_duration_ms, server_request_token, } => Some(json!({ "prompt_suggestion_id": prompt_suggestion_id, "code_exchange_id": code_exchange_id, "block_id": block_id, "request_duration_ms": request_duration_ms, "server_request_token": server_request_token, })), TelemetryEvent::SuggestedCodeDiffFailed { prompt_suggestion_id, reason, } => Some(json!({ "prompt_suggestion_id": prompt_suggestion_id, "reason": reason, })), TelemetryEvent::PromptSuggestionAccepted { id, view, interaction_source, } => Some(json!({ "id": id, "view": view, "interaction_source": interaction_source, })), TelemetryEvent::StaticPromptSuggestionsBannerShown { id, query, block_id, block_command, static_prompt_suggestion_name, request_duration_ms, view, } => Some(json!({ "id": id, "query": query, "block_id": block_id, "block_command": block_command, "static_prompt_suggestion_name": static_prompt_suggestion_name, "request_duration_ms": request_duration_ms, "view": view, })), TelemetryEvent::StaticPromptSuggestionAccepted { id, view, interaction_source, } => Some(json!({ "id": id, "view": view, "interaction_source": interaction_source, })), TelemetryEvent::ZeroStatePromptSuggestionUsed { suggestion_type, triggered_from, } => Some(json!({"type": suggestion_type, "triggered_from": triggered_from})), TelemetryEvent::UnitTestSuggestionShown { identifiers } => Some(json!({ "server_output_id": identifiers.server_output_id, "exchange_id": identifiers.client_exchange_id, "conversation_id": identifiers.server_conversation_id, })), TelemetryEvent::UnitTestSuggestionAccepted { identifiers, query, interaction_source, } => Some(json!({ "server_output_id": identifiers.server_output_id, "exchange_id": identifiers.client_exchange_id, "conversation_id": identifiers.server_conversation_id, "query": query, "interaction_source": interaction_source, })), TelemetryEvent::UnitTestSuggestionCancelled { identifiers, interaction_source, } => Some(json!({ "server_output_id": identifiers.server_output_id, "exchange_id": identifiers.client_exchange_id, "conversation_id": identifiers.server_conversation_id, "interaction_source": interaction_source, })), TelemetryEvent::AgentModeCodeSuggestionEditedByUser { output_id } => { Some(json!({"output_id": output_id})) } TelemetryEvent::AgentModeCodeFilesNavigated { output_id, source } => { Some(json!({"output_id": output_id, "source": source})) } TelemetryEvent::AgentModeCodeDiffHunksNavigated { output_id } => { Some(json!({"output_id": output_id})) } TelemetryEvent::ResourceUsageStats { cpu, mem } => Some(json!({ "cpu": cpu, "mem": { // Only report the total application usage; skip sending // the additional, more detailed usage information. "total_application_usage_bytes": mem.total_application_usage_bytes, }, })), TelemetryEvent::MemoryUsageStats { total_application_usage_bytes, total_blocks, total_lines, active_block_stats, inactive_5m_stats, inactive_1h_stats, inactive_24h_stats, } => Some(json!({ "total_application_usage_bytes": total_application_usage_bytes, "total_blocks": total_blocks, "total_lines": total_lines, "active_block_stats": active_block_stats, "inactive_5m_stats": inactive_5m_stats, "inactive_1h_stats": inactive_1h_stats, "inactive_24h_stats": inactive_24h_stats })), TelemetryEvent::MemoryUsageHigh { total_application_usage_bytes, memory_breakdown, } => Some(json!({ "total_application_usage_bytes": total_application_usage_bytes, "memory_breakdown": memory_breakdown, })), TelemetryEvent::EnvVarCollectionInvoked(metadata) => Some(json!(metadata)), TelemetryEvent::EnvVarWorkflowParameterization(metadata) => Some(json!(metadata)), TelemetryEvent::CompletedSettingsImport { terminal_type, imported_settings, } => Some( json!({ "terminal_type": terminal_type, "imported_settings": imported_settings}), ), TelemetryEvent::SettingsImportConfigParsed { timing_data, terminal_type, settings_shown_to_user, } => Some( json!({"timing_data": timing_data, "terminal_type": terminal_type, "settings_shown_to_user": settings_shown_to_user}), ), TelemetryEvent::SettingsImportConfigFocused(terminal_type_and_profile) => { Some(json!({"terminal_and_type_profile": terminal_type_and_profile})) } TelemetryEvent::InitiateAnonymousUserSignup { entrypoint } => { Some(json!({"entrypoint": entrypoint})) } TelemetryEvent::AnonymousUserAttemptLoginGatedFeature { feature } => { Some(json!({"feature": feature})) } TelemetryEvent::ToggleWorkspaceDecorationVisibility { previous_value, new_value, } => Some(json!({ "previous_value": previous_value, "new_value": new_value, })), TelemetryEvent::UpdateAltScreenPaddingMode { new_mode } => Some(json!({ "new_mode": new_mode, })), TelemetryEvent::AddTabWithShell { source, shell } => { Some(json!({ "source": source, "shell": shell })) } TelemetryEvent::AgentModeSurfacedCitations { citations, block_id, conversation_id, server_output_id, } => Some( json!({ "citations": citations, "block_id": block_id, "conversation_id": conversation_id, "server_output_id": server_output_id }), ), TelemetryEvent::AgentModeOpenedCitation { citation, block_id, conversation_id, server_output_id, } => Some( json!({ "citation": citation, "block_id": block_id, "conversation_id": conversation_id, "server_output_id": server_output_id }), ), TelemetryEvent::OpenedSharingDialog(event) => Some(json!(event)), TelemetryEvent::ToggleGlobalAI { is_ai_enabled } => { Some(json!({"is_ai_enabled": is_ai_enabled})) } TelemetryEvent::ToggleActiveAI { is_active_ai_enabled, } => Some(json!({"is_active_ai_enabled": is_active_ai_enabled})), TelemetryEvent::ToggleCodebaseContext { is_codebase_context_enabled, } => Some(json!( { "is_codebase_context_enabled": is_codebase_context_enabled })), TelemetryEvent::ToggleAutoIndexing { is_autoindexing_enabled, } => Some(json!({ "is_autoindexing_enabled": is_autoindexing_enabled })), TelemetryEvent::ActiveIndexedReposChanged { updated_number_of_codebase_indices, hit_max_indices, } => Some(json!({ "updated_number_of_codebase_indices": updated_number_of_codebase_indices, "hit_max_indices": hit_max_indices })), TelemetryEvent::ToggleLigatureRendering { enabled } => { Some(json!({"enabled": enabled})) } TelemetryEvent::WorkflowAliasAdded { workflow_id, workflow_space, } => Some(json!({ "workflow_id": workflow_id, "workflow_space": workflow_space, })), TelemetryEvent::WorkflowAliasRemoved { workflow_id, workflow_space, } => Some(json!({ "workflow_id": workflow_id, "workflow_space": workflow_space, })), TelemetryEvent::WorkflowAliasArgumentEdited { workflow_id, workflow_space, } => Some(json!({ "workflow_id": workflow_id, "workflow_space": workflow_space, })), TelemetryEvent::WorkflowAliasEnvVarsAttached { workflow_id, workflow_space, env_vars_id, env_vars_space, } => Some(json!({ "workflow_id": workflow_id, "workflow_space": workflow_space, "env_vars_id": env_vars_id, "env_vars_space": env_vars_space, })), TelemetryEvent::AutoupdateRelaunchAttempt { new_version } => Some(json!({ "new_version": new_version, })), TelemetryEvent::ToggledAgentModeAutoexecuteReadonlyCommandsSetting { src, enabled } => { Some(json!({ "source": src, "enabled": enabled, })) } TelemetryEvent::ChangedAgentModeCodingPermissions { src, new } => Some(json!({ "source": src, "new": new, })), TelemetryEvent::FullEmbedCodebaseContextSearchSuccess { action_id, total_search_duration, out_of_sync_delay, } => Some(json!({ "action_id": action_id, "total_search_duration": total_search_duration, "out_of_sync_delay": out_of_sync_delay })), TelemetryEvent::FullEmbedCodebaseContextSearchFailed { action_id, error } => { Some(json!({ "action_id": action_id, "error": error })) } TelemetryEvent::RepoOutlineConstructionSuccess { total_parse_seconds, file_count, } => Some(json!({ "total_parse_seconds": total_parse_seconds, "file_count": file_count, })), TelemetryEvent::RepoOutlineConstructionFailed { error } => Some(json!({ "error": error, })), TelemetryEvent::AutoexecutedAgentModeRequestedCommand { reason } => Some(json!({ "reason": reason, })), TelemetryEvent::AgenticOnboardingBlockSelected { block_type } => Some(json!({ "block_type": block_type, })), TelemetryEvent::AttachedImagesToAgentModeQuery { num_images, is_udi_enabled, } => Some(json!({ "num_images": num_images, "is_udi_enabled": is_udi_enabled, })), TelemetryEvent::AgentModeRatedResponse { server_output_id, conversation_id, rating, } => Some(json!({ "server_output_id": server_output_id, "conversation_id": conversation_id, "rating": rating, })), TelemetryEvent::ExecutedWarpDrivePrompt { id, selection_source, } => Some(json!({ "id": id, "selection_source": selection_source, })), TelemetryEvent::ImageReceived { image_protocol } => Some(json!({ "image_protocol": image_protocol, })), TelemetryEvent::FileExceededContextLimit { identifiers } => Some(json!({ "server_output_id": identifiers.server_output_id, "exchange_id": identifiers.client_exchange_id, "conversation_id": identifiers.server_conversation_id, })), TelemetryEvent::AgentModeError { identifiers, error, is_user_visible, will_attempt_to_resume, } => Some(json!({ "server_output_id": identifiers.server_output_id, "exchange_id": identifiers.client_exchange_id, "conversation_id": identifiers.server_conversation_id, "error": error, "is_user_visible": is_user_visible, "will_attempt_to_resume": will_attempt_to_resume, })), TelemetryEvent::AgentModeRequestRetrySucceeded { identifiers, retry_count, original_error, } => Some(json!({ "server_output_id": identifiers.server_output_id, "exchange_id": identifiers.client_exchange_id, "conversation_id": identifiers.server_conversation_id, "retry_count": retry_count, "original_error": original_error, })), TelemetryEvent::GrepToolFailed { queries, path, shell_type, working_directory, absolute_path, command, output, error, server_output_id, } => Some(json!({ "queries": queries, "path": path, "shell_type": shell_type, "working_directory": working_directory, "absolute_path": absolute_path, "command": command, "output": output, "error": error, "server_output_id": server_output_id, })), TelemetryEvent::FileGlobToolFailed { server_output_id } => Some(json!({ "server_output_id": server_output_id, })), TelemetryEvent::ShellTerminatedPrematurely { shell_type, shell_path, reason, reason_details, antivirus_name, long_os_version, exit_reason, } => Some(json!({ "shell_type": shell_type, "shell_path": shell_path, "reason": reason, "reason_details": reason_details, "antivirus_name": antivirus_name, "long_os_version": long_os_version, "exit_reason": exit_reason, })), TelemetryEvent::SearchCodebaseRequested { action_id, server_output_id, is_cross_repo, } => Some(json!({ "action_id": action_id, "server_output_id": server_output_id, "is_cross_repo": is_cross_repo, })), TelemetryEvent::SearchCodebaseRepoUnavailable { action_id, error } => Some(json!({ "action_id": action_id, "error": error, })), TelemetryEvent::InputUXModeChanged { is_udi_enabled, origin, } => Some(json!({ "is_udi_enabled": is_udi_enabled, "origin": origin, })), TelemetryEvent::ContextChipInteracted { chip_type, action, is_udi_enabled, } => Some(json!({ "chip_type": chip_type, "action": action, "is_udi_enabled": is_udi_enabled, })), TelemetryEvent::VoiceInputUsed { action, session_duration_ms, is_udi_enabled, current_input_mode, } => Some(json!({ "action": action, "session_duration_ms": session_duration_ms, "is_udi_enabled": is_udi_enabled, "current_input_mode": current_input_mode, })), TelemetryEvent::AtMenuInteracted { action, query_length, item_count, is_udi_enabled, current_input_mode, } => Some(json!({ "action": action, "query_length": query_length, "item_count": item_count, "is_udi_enabled": is_udi_enabled, "current_input_mode": current_input_mode, })), TelemetryEvent::TabCloseButtonPositionUpdated { position } => Some(json!({ "position": position, })), TelemetryEvent::ExpandedCodeSuggestions { identifiers } => Some(json!({ "server_output_id": identifiers.server_output_id, "exchange_id": identifiers.client_exchange_id, "conversation_id": identifiers.server_conversation_id, })), TelemetryEvent::BackgroundBlockStarted | TelemetryEvent::SessionCreation | TelemetryEvent::Login | TelemetryEvent::ContextMenuInsertSelectedText | TelemetryEvent::ContextMenuCopySelectedText | TelemetryEvent::JumpToPreviousCommand | TelemetryEvent::TabSingleResultAutocompletion | TelemetryEvent::CopyInviteLink | TelemetryEvent::OpenThemeChooser | TelemetryEvent::OpenThemeCreatorModal | TelemetryEvent::CreateCustomTheme | TelemetryEvent::DeleteCustomTheme | TelemetryEvent::SplitPane | TelemetryEvent::UnableToAutoUpdateToNewVersion | TelemetryEvent::SkipOnboardingSurvey | TelemetryEvent::LoggedOutStartup | TelemetryEvent::OpenWorkflowSearch | TelemetryEvent::OpenQuakeModeWindow | TelemetryEvent::OpenWelcomeTips | TelemetryEvent::DismissWelcomeTips | TelemetryEvent::ShowNotificationsDiscoveryBanner | TelemetryEvent::ShowNotificationsErrorBanner | TelemetryEvent::NotificationClicked | TelemetryEvent::SignUpButtonClicked | TelemetryEvent::OpenNewSessionFromFilePath | TelemetryEvent::OpenTeamFromURI | TelemetryEvent::SelectNavigationPaletteItem | TelemetryEvent::DragAndDropTab | TelemetryEvent::EditedInputBeforePrecmd | TelemetryEvent::TriedToExecuteBeforePrecmd | TelemetryEvent::JumpToBookmark | TelemetryEvent::JumpToBottomofBlockButtonClicked | TelemetryEvent::ShowInFileExplorer | TelemetryEvent::OpenLaunchConfigSaveModal | TelemetryEvent::OpenLaunchConfigFile | TelemetryEvent::TeamCreated | TelemetryEvent::TeamJoined | TelemetryEvent::TeamLeft | TelemetryEvent::TeamLinkCopied | TelemetryEvent::RemovedUserFromTeam | TelemetryEvent::DeletedWorkflow | TelemetryEvent::DeletedNotebook | TelemetryEvent::ToggleApprovalsModal | TelemetryEvent::ChangedInviteViewOption(_) | TelemetryEvent::SendEmailInvites | TelemetryEvent::ResourceCenterOpened | TelemetryEvent::ResourceCenterTipsCompleted | TelemetryEvent::ResourceCenterTipsSkipped | TelemetryEvent::KeybindingsPageOpened | TelemetryEvent::OpenedAltScreenFind | TelemetryEvent::QuitModalDisabled | TelemetryEvent::UserInitiatedLogOut | TelemetryEvent::LogOutModalShown | TelemetryEvent::WarpAICharacterLimitExceeded | TelemetryEvent::OpenInputContextMenu | TelemetryEvent::InputCutSelectedText | TelemetryEvent::InputCopySelectedText | TelemetryEvent::InputSelectAll | TelemetryEvent::InputPaste | TelemetryEvent::InputCommandSearch | TelemetryEvent::InputAICommandSearch | TelemetryEvent::InputAskWarpAI | TelemetryEvent::SetNewWindowsAtCustomSize | TelemetryEvent::DisableInputSync | TelemetryEvent::ShowSubshellBanner | TelemetryEvent::SshTmuxWarpifyBannerDisplayed | TelemetryEvent::AddDenylistedSubshellCommand | TelemetryEvent::RemoveDenylistedSubshellCommand | TelemetryEvent::AddAddedSubshellCommand | TelemetryEvent::RemoveAddedSubshellCommand | TelemetryEvent::ReceivedSubshellRcFileDcs | TelemetryEvent::AddDenylistedSshTmuxWrapperHost | TelemetryEvent::RemoveDenylistedSshTmuxWrapperHost | TelemetryEvent::SshTmuxWarpifyBlockAccepted | TelemetryEvent::SshTmuxWarpifyBlockDismissed | TelemetryEvent::SshInstallTmuxBlockDisplayed | TelemetryEvent::SshInstallTmuxBlockAccepted | TelemetryEvent::SshInstallTmuxBlockDismissed | TelemetryEvent::ShowAliasExpansionBanner | TelemetryEvent::EnableAliasExpansionFromBanner | TelemetryEvent::DismissAliasExpansionBanner | TelemetryEvent::ShowVimKeybindingsBanner | TelemetryEvent::EnableVimKeybindingsFromBanner | TelemetryEvent::DismissVimKeybindingsBanner | TelemetryEvent::InitiateReauth | TelemetryEvent::NeedsReauth | TelemetryEvent::AnonymousUserExpirationLockout | TelemetryEvent::AnonymousUserLinkedFromBrowser | TelemetryEvent::AnonymousUserHitCloudObjectLimit | TelemetryEvent::CustomSecretRegexAdded | TelemetryEvent::CopySecret | TelemetryEvent::AutoGenerateMetadataSuccess | TelemetryEvent::CommandFileRun | TelemetryEvent::SharerGrantModalDontShowAgain | TelemetryEvent::LogOut | TelemetryEvent::UpdateBlockFilterQuery | TelemetryEvent::BlockFilterToolbeltButtonClicked | TelemetryEvent::PaneDragInitiated | TelemetryEvent::SharedObjectLimitHitBannerViewPlansButtonClicked | TelemetryEvent::SharedSessionModalUpgradePressed | TelemetryEvent::AgentModePotentialAutoDetectionFalsePositive( AgentModeAutoDetectionFalsePositivePayload::ExternalUsers, ) | TelemetryEvent::SettingsImportResetButtonClicked | TelemetryEvent::ITermMultipleHotkeys | TelemetryEvent::DriveSharingOnboardingBlockShown | TelemetryEvent::SSHControlMasterError | TelemetryEvent::SettingsImportInitiated | TelemetryEvent::GrepToolSucceeded | TelemetryEvent::FileGlobToolSucceeded | TelemetryEvent::UserMenuUpgradeClicked | TelemetryEvent::AIExecutionProfileCreated | TelemetryEvent::AIExecutionProfileDeleted | TelemetryEvent::FileTreeItemCreated | TelemetryEvent::ConversationListItemDeleted | TelemetryEvent::ConversationListViewOpened | TelemetryEvent::GlobalSearchOpened | TelemetryEvent::GlobalSearchQueryStarted | TelemetryEvent::GetStartedSkipToTerminal => None, TelemetryEvent::RemoteServerBinaryCheck { found, error, remote_os, remote_arch, } => Some(json!({ "found": found, "error": error, "remote_os": remote_os, "remote_arch": remote_arch, })), TelemetryEvent::RemoteServerInstallation { error, remote_os, remote_arch, } => Some(json!({ "error": error, "remote_os": remote_os, "remote_arch": remote_arch, })), TelemetryEvent::RemoteServerInitialization { phase, error, remote_os, remote_arch, } => Some(json!({ "phase": phase, "error": error, "remote_os": remote_os, "remote_arch": remote_arch, })), TelemetryEvent::RemoteServerDisconnection { remote_os, remote_arch, } => Some(json!({ "remote_os": remote_os, "remote_arch": remote_arch, })), TelemetryEvent::RemoteServerClientRequestError { operation, error_type, remote_os, remote_arch, } => Some(json!({ "operation": operation, "error_type": error_type, "remote_os": remote_os, "remote_arch": remote_arch, })), TelemetryEvent::RemoteServerMessageDecodingError { remote_os, remote_arch, } => Some(json!({ "remote_os": remote_os, "remote_arch": remote_arch, })), TelemetryEvent::RemoteServerSetupDuration { duration_ms, installed_binary, remote_os, remote_arch, } => Some(json!({ "duration_ms": duration_ms, "installed_binary": installed_binary, "remote_os": remote_os, "remote_arch": remote_arch, })), TelemetryEvent::ConversationListItemOpened { is_ambient_agent } => Some(json!({ "is_ambient_agent": is_ambient_agent, })), TelemetryEvent::ConversationListLinkCopied { is_ambient_agent } => Some(json!({ "is_ambient_agent": is_ambient_agent, })), TelemetryEvent::AIExecutionProfileSettingUpdated { setting_type, setting_value, } => Some(json!({ "setting_type": setting_type, "setting_value": setting_value, })), TelemetryEvent::AIExecutionProfileAddedToAllowlist { list_type, value } => { Some(json!({ "list_type": list_type, "value": value, })) } TelemetryEvent::AIExecutionProfileAddedToDenylist { list_type, value } => Some(json!({ "list_type": list_type, "value": value, })), TelemetryEvent::AIExecutionProfileRemovedFromAllowlist { list_type, value } => { Some(json!({ "list_type": list_type, "value": value, })) } TelemetryEvent::AIExecutionProfileRemovedFromDenylist { list_type, value } => { Some(json!({ "list_type": list_type, "value": value, })) } TelemetryEvent::AIExecutionProfileModelSelected { model_type, model_value, } => Some(json!({ "model_type": model_type, "model_value": model_value, })), TelemetryEvent::AIInputNotSent { entrypoint, inputs, active_server_conversation_id, active_client_conversation_id, } => Some(json!({ "entrypoint": entrypoint, "inputs": inputs, "active_server_conversation_id": active_server_conversation_id, "active_client_conversation_id": active_client_conversation_id, })), TelemetryEvent::OpenSlashMenu { source, is_inline_ui_enabled, is_in_agent_view, } => Some(json!({ "source": source, "is_inline_ui_enabled": is_inline_ui_enabled, "is_in_agent_view": is_in_agent_view, })), TelemetryEvent::SlashCommandAccepted { command_details, is_in_agent_view, } => Some(json!({ "command_details": command_details, "is_in_agent_view": is_in_agent_view, })), TelemetryEvent::AgentModeSetupBannerAccepted => None, TelemetryEvent::AgentModeSetupBannerDismissed => None, TelemetryEvent::AgentModeSetupProjectScopedRulesAction { action } => Some(json!({ "action": action, })), TelemetryEvent::AgentModeSetupCodebaseContextAction { action } => Some(json!({ "action": action, })), TelemetryEvent::AgentModeSetupCreateEnvironmentAction { action } => Some(json!({ "action": action, })), #[cfg(windows)] TelemetryEvent::WSLRegistryError | TelemetryEvent::AutoupdateUnableToCloseApplications | TelemetryEvent::AutoupdateFileInUse | TelemetryEvent::AutoupdateMutexTimeout | TelemetryEvent::AutoupdateForcekillFailed => None, TelemetryEvent::InputBufferSubmitted { input_type, is_locked, was_lock_set_with_empty_buffer, } => Some(json!({ "input_type": input_type, "is_locked": is_locked, "was_lock_set_with_empty_buffer": was_lock_set_with_empty_buffer, })), TelemetryEvent::CreateProjectPromptSubmitted { is_custom_prompt, suggested_prompt, is_ftux, } => Some(json!({ "is_custom_prompt": is_custom_prompt, "suggested_prompt": suggested_prompt, "is_ftux": is_ftux, })), TelemetryEvent::CreateProjectPromptSubmittedContent { custom_prompt } => Some(json!({ "custom_prompt": custom_prompt })), TelemetryEvent::CloneRepoPromptSubmitted { is_ftux } => Some(json!({ "is_ftux": is_ftux, })), TelemetryEvent::RecentMenuItemSelected { kind } => Some(json!({ "kind": kind, })), TelemetryEvent::OpenRepoFolderSubmitted { is_ftux } => Some(json!({ "is_ftux": is_ftux, })), TelemetryEvent::OutOfCreditsBannerClosed { action, selected_credits, auto_reload_checkbox_enabled, banner_toggle_flag_enabled, post_purchase_modal_flag_enabled, } => Some(json!({ "action": action, "selected_credits": selected_credits, "auto_reload_checkbox_enabled": auto_reload_checkbox_enabled, "banner_toggle_flag_enabled": banner_toggle_flag_enabled, "post_purchase_modal_flag_enabled": post_purchase_modal_flag_enabled, })), TelemetryEvent::AutoReloadModalClosed { action, selected_credits, banner_toggle_flag_enabled, post_purchase_modal_flag_enabled, } => Some(json!({ "action": action, "selected_credits": selected_credits, "banner_toggle_flag_enabled": banner_toggle_flag_enabled, "post_purchase_modal_flag_enabled": post_purchase_modal_flag_enabled, })), TelemetryEvent::AutoReloadToggledFromBillingSettings { enabled, banner_toggle_flag_enabled, post_purchase_modal_flag_enabled, } => Some(json!({ "enabled": enabled, "banner_toggle_flag_enabled": banner_toggle_flag_enabled, "post_purchase_modal_flag_enabled": post_purchase_modal_flag_enabled, })), TelemetryEvent::WarpDriveOpened { source, is_code_mode_v2, } => Some(json!({ "source": source, "is_code_mode_v2": is_code_mode_v2, })), TelemetryEvent::AgentTipShown { tip } => Some(json!({ "tip": tip, })), TelemetryEvent::AgentTipClicked { tip, click_target } => Some(json!({ "tip": tip, "click_target": click_target, })), TelemetryEvent::ToggleShowAgentTips { is_enabled } => Some(json!({ "is_enabled": is_enabled, })), TelemetryEvent::CLISubagentControlStateChanged { conversation_id, block_id, control_state, } => Some(json!({ "conversation_id": conversation_id, "block_id": block_id, "control_state": control_state, })), TelemetryEvent::CLISubagentResponsesToggled { conversation_id, block_id, is_hidden, } => Some(json!({ "conversation_id": conversation_id, "block_id": block_id, "is_hidden": is_hidden, })), TelemetryEvent::CLISubagentInputDismissed { conversation_id, block_id, } => Some(json!({ "conversation_id": conversation_id, "block_id": block_id, })), TelemetryEvent::CLISubagentActionExecuted { conversation_id, block_id, is_autoexecuted, } => Some(json!({ "conversation_id": conversation_id, "block_id": block_id, "is_autoexecuted": is_autoexecuted, })), TelemetryEvent::CLISubagentActionRejected { conversation_id, block_id, user_took_over, } => Some(json!({ "conversation_id": conversation_id, "block_id": block_id, "user_took_over": user_took_over, })), TelemetryEvent::AgentManagementViewToggled { is_open } => Some(json!({ "is_open": is_open, })), TelemetryEvent::AgentManagementViewOpenedSession => None, TelemetryEvent::AgentManagementViewCopiedSessionLink => None, TelemetryEvent::DetectedIsolationPlatform { platform } => Some(json!({ "platform": platform, })), TelemetryEvent::AgentExitedShellProcess { command, server_output_id, } => Some(json!({ "command": command, "server_output_id": server_output_id, })), TelemetryEvent::CLIAgentToolbarVoiceInputUsed { cli_agent } => Some(json!({ "agent_name": cli_agent, })), TelemetryEvent::CLIAgentToolbarImageAttached { cli_agent } => Some(json!({ "agent_name": cli_agent, })), TelemetryEvent::CLIAgentToolbarShown { cli_agent } => Some(json!({ "agent_name": cli_agent, })), TelemetryEvent::CLIAgentRichInputOpened { cli_agent, entrypoint, } => Some(json!({ "agent_name": cli_agent, "entrypoint": entrypoint, })), TelemetryEvent::CLIAgentRichInputClosed { cli_agent, reason } => Some(json!({ "agent_name": cli_agent, "reason": reason, })), TelemetryEvent::CLIAgentRichInputSubmitted { cli_agent, prompt_length, } => Some(json!({ "agent_name": cli_agent, "prompt_length": prompt_length, })), TelemetryEvent::CLIAgentPluginChipClicked { cli_agent, action } => Some(json!({ "agent_name": cli_agent, "action": action, })), TelemetryEvent::CLIAgentPluginChipDismissed { cli_agent, chip_kind, } => Some(json!({ "agent_name": cli_agent, "chip_kind": chip_kind, })), TelemetryEvent::CLIAgentPluginOperationSucceeded { cli_agent, operation, } => Some(json!({ "agent_name": cli_agent, "operation": operation, })), TelemetryEvent::CLIAgentPluginOperationFailed { cli_agent, operation, } => Some(json!({ "agent_name": cli_agent, "operation": operation, })), TelemetryEvent::CLIAgentPluginDetected { cli_agent } => Some(json!({ "agent_name": cli_agent, })), TelemetryEvent::AgentNotificationShown { agent_variant } => Some(json!({ "agent_variant": agent_variant, })), TelemetryEvent::ToggleCLIAgentToolbarSetting { is_enabled } => Some(json!({ "is_enabled": is_enabled, })), TelemetryEvent::ToggleUseAgentToolbarSetting { is_enabled } => Some(json!({ "is_enabled": is_enabled, })), TelemetryEvent::AgentViewEntered { origin, did_auto_trigger_request, } => Some(json!({ "origin": origin, "did_auto_trigger_request": did_auto_trigger_request, })), TelemetryEvent::AgentViewExited { origin, was_empty } => Some(json!({ "origin": origin, "was_empty": was_empty, })), TelemetryEvent::InlineConversationMenuOpened { is_in_agent_view } => Some(json!({ "is_in_agent_view": is_in_agent_view, })), TelemetryEvent::InlineConversationMenuItemSelected { is_in_agent_view } => { Some(json!({ "is_in_agent_view": is_in_agent_view, })) } TelemetryEvent::AgentShortcutsViewToggled { is_visible } => Some(json!({ "is_visible": is_visible, })), TelemetryEvent::CodexModalOpened => None, TelemetryEvent::CodexModalUseCodexClicked => None, TelemetryEvent::LinearIssueLinkOpened => None, TelemetryEvent::CloudAgentCapacityModalOpened => None, TelemetryEvent::CloudAgentCapacityModalDismissed => None, TelemetryEvent::CloudAgentCapacityModalUpgradeClicked => None, TelemetryEvent::ComputerUseApproved { conversation_id, is_autoexecuted, ambient_agent_task_id, } => Some(json!({ "conversation_id": conversation_id, "is_autoexecuted": is_autoexecuted, "ambient_agent_task_id": ambient_agent_task_id.map(|id| id.to_string()), })), TelemetryEvent::ComputerUseCancelled { conversation_id, ambient_agent_task_id, } => Some(json!({ "conversation_id": conversation_id, "ambient_agent_task_id": ambient_agent_task_id.map(|id| id.to_string()), })), TelemetryEvent::FreeTierLimitHitInterstitialDisplayed => None, TelemetryEvent::FreeTierLimitHitInterstitialUpgradeButtonClicked => None, TelemetryEvent::FreeTierLimitHitInterstitialClosed => None, TelemetryEvent::LoginButtonClicked { source } | TelemetryEvent::LoginLaterButtonClicked { source } | TelemetryEvent::LoginLaterConfirmationButtonClicked { source } | TelemetryEvent::OpenAuthPrivacySettings { source } => Some(json!({ "source": source, })), } } /// Returns whether the event contains user generated content, indicating it should /// be sent to a dedicated rudderstack source. pub fn contains_ugc(&self) -> bool { match self { TelemetryEvent::GrepToolFailed { .. } => true, TelemetryEvent::BootstrappingSlowContents { .. } => true, TelemetryEvent::AIInputNotSent { .. } => true, TelemetryEvent::AgentExitedShellProcess { .. } => true, TelemetryEvent::CreateProjectPromptSubmitted { .. } => false, TelemetryEvent::CreateProjectPromptSubmittedContent { .. } => true, TelemetryEvent::AgentModePrediction { actual_next_command_run, history_based_autosuggestion_state, generate_ai_input_suggestions_request, generate_ai_input_suggestions_response, .. } => { // These fields can contain UGC, so if any are set, assume this event contains UGC. actual_next_command_run.is_some() || history_based_autosuggestion_state.is_some() || generate_ai_input_suggestions_request.is_some() || generate_ai_input_suggestions_response.is_some() } TelemetryEvent::AgentModeChangedInputType { input, .. } => input.is_some(), TelemetryEvent::UnitTestSuggestionAccepted { query, .. } => query.is_some(), TelemetryEvent::AgentModePotentialAutoDetectionFalsePositive(payload) => { // For internal dogfood users, the payload contains UGC. matches!( payload, AgentModeAutoDetectionFalsePositivePayload::InternalDogfoodUsers { .. } ) } TelemetryEvent::ShowedSuggestedAgentModeWorkflowModal { .. } | TelemetryEvent::ShowedSuggestedAgentModeWorkflowChip { .. } | TelemetryEvent::AISuggestedAgentModeWorkflowAdded { .. } | TelemetryEvent::AutosuggestionInserted { .. } | TelemetryEvent::BlockCompleted { .. } | TelemetryEvent::BlockCompletedOnDogfoodOnly { .. } | TelemetryEvent::BackgroundBlockStarted | TelemetryEvent::BaselineCommandLatency(_) | TelemetryEvent::SessionCreation | TelemetryEvent::Login | TelemetryEvent::AgentModeContinueConversationButtonClicked { .. } | TelemetryEvent::AgentModeRewindDialogOpened { .. } | TelemetryEvent::AgentModeRewindExecuted { .. } | TelemetryEvent::OpenSuggestionsMenu(_) | TelemetryEvent::ConfirmSuggestion { .. } | TelemetryEvent::OpenContextMenu { .. } | TelemetryEvent::ContextMenuCopy(_, _) | TelemetryEvent::ContextMenuOpenShareModal(_) | TelemetryEvent::ContextMenuFindWithinBlocks(_) | TelemetryEvent::ContextMenuCopyPrompt { .. } | TelemetryEvent::ContextMenuToggleGitPromptDirtyIndicator { .. } | TelemetryEvent::ContextMenuInsertSelectedText | TelemetryEvent::ContextMenuCopySelectedText | TelemetryEvent::OpenPromptEditor { .. } | TelemetryEvent::PromptEdited { .. } | TelemetryEvent::ReinputCommands(_) | TelemetryEvent::JumpToPreviousCommand | TelemetryEvent::CopyBlockSharingLink(_) | TelemetryEvent::GenerateBlockSharingLink { .. } | TelemetryEvent::BlockSelection(_) | TelemetryEvent::BootstrappingSlow(_) | TelemetryEvent::SessionAbandonedBeforeBootstrap { .. } | TelemetryEvent::BootstrappingSucceeded(_) | TelemetryEvent::TabSingleResultAutocompletion | TelemetryEvent::EditorUnhandledModifierKey(_) | TelemetryEvent::CopyInviteLink | TelemetryEvent::OpenThemeChooser | TelemetryEvent::ThemeSelection { .. } | TelemetryEvent::AppIconSelection { .. } | TelemetryEvent::CursorDisplayType { .. } | TelemetryEvent::OpenThemeCreatorModal | TelemetryEvent::CreateCustomTheme | TelemetryEvent::DeleteCustomTheme | TelemetryEvent::SplitPane | TelemetryEvent::UnableToAutoUpdateToNewVersion | TelemetryEvent::AutoupdateRelaunchAttempt { .. } | TelemetryEvent::SkipOnboardingSurvey | TelemetryEvent::ToggleRestoreSession(_) | TelemetryEvent::DatabaseStartUpError(_) | TelemetryEvent::DatabaseReadError(_) | TelemetryEvent::DatabaseWriteError(_) | TelemetryEvent::AppStartup(_) | TelemetryEvent::LoggedOutStartup | TelemetryEvent::DownloadSource(_) | TelemetryEvent::SSHBootstrapAttempt(_) | TelemetryEvent::SSHControlMasterError | TelemetryEvent::KeybindingChanged { .. } | TelemetryEvent::KeybindingResetToDefault { .. } | TelemetryEvent::KeybindingRemoved { .. } | TelemetryEvent::FeaturesPageAction { .. } | TelemetryEvent::WorkflowExecuted(_) | TelemetryEvent::WorkflowSelected(_) | TelemetryEvent::OpenWorkflowSearch | TelemetryEvent::OpenQuakeModeWindow | TelemetryEvent::OpenWelcomeTips | TelemetryEvent::CompleteWelcomeTipFeature { .. } | TelemetryEvent::DismissWelcomeTips | TelemetryEvent::ShowNotificationsDiscoveryBanner | TelemetryEvent::NotificationsDiscoveryBannerAction(_) | TelemetryEvent::ShowNotificationsErrorBanner | TelemetryEvent::NotificationsErrorBannerAction(_) | TelemetryEvent::NotificationPermissionsRequested { .. } | TelemetryEvent::NotificationsRequestPermissionsOutcome { .. } | TelemetryEvent::NotificationSent { .. } | TelemetryEvent::NotificationFailedToSend { .. } | TelemetryEvent::NotificationClicked | TelemetryEvent::ToggleFindOption { .. } | TelemetryEvent::SignUpButtonClicked | TelemetryEvent::LoginButtonClicked { .. } | TelemetryEvent::LoginLaterButtonClicked { .. } | TelemetryEvent::LoginLaterConfirmationButtonClicked { .. } | TelemetryEvent::OpenNewSessionFromFilePath | TelemetryEvent::OpenTeamFromURI | TelemetryEvent::SelectNavigationPaletteItem | TelemetryEvent::SelectCommandPaletteOption(_) | TelemetryEvent::PaletteSearchOpened { .. } | TelemetryEvent::PaletteSearchResultAccepted { .. } | TelemetryEvent::PaletteSearchExited { .. } | TelemetryEvent::AuthCommonQuestionClicked { .. } | TelemetryEvent::AuthToggleFAQ { .. } | TelemetryEvent::OpenAuthPrivacySettings { .. } | TelemetryEvent::TabRenamed(_) | TelemetryEvent::MoveActiveTab { .. } | TelemetryEvent::MoveTab { .. } | TelemetryEvent::DragAndDropTab | TelemetryEvent::TabOperations { .. } | TelemetryEvent::EditedInputBeforePrecmd | TelemetryEvent::TriedToExecuteBeforePrecmd | TelemetryEvent::ThinStrokesSettingChanged { .. } | TelemetryEvent::BookmarkBlockToggled { .. } | TelemetryEvent::JumpToBookmark | TelemetryEvent::JumpToBottomofBlockButtonClicked | TelemetryEvent::ToggleJumpToBottomofBlockButton { .. } | TelemetryEvent::ToggleShowBlockDividers { .. } | TelemetryEvent::OpenLink { .. } | TelemetryEvent::OpenChangelogLink { .. } | TelemetryEvent::ShowInFileExplorer | TelemetryEvent::CommandXRayTriggered { .. } | TelemetryEvent::OpenLaunchConfigSaveModal | TelemetryEvent::SaveLaunchConfig { .. } | TelemetryEvent::OpenLaunchConfigFile | TelemetryEvent::OpenLaunchConfig { .. } | TelemetryEvent::TeamCreated | TelemetryEvent::TeamJoined | TelemetryEvent::TeamLeft | TelemetryEvent::ToggleSettingsSync { .. } | TelemetryEvent::TeamLinkCopied | TelemetryEvent::RemovedUserFromTeam | TelemetryEvent::DeletedWorkflow | TelemetryEvent::DeletedNotebook | TelemetryEvent::ToggleApprovalsModal | TelemetryEvent::ChangedInviteViewOption(_) | TelemetryEvent::SendEmailInvites | TelemetryEvent::CommandCorrection { .. } | TelemetryEvent::SetLineHeight { .. } | TelemetryEvent::ResourceCenterOpened | TelemetryEvent::ResourceCenterTipsCompleted | TelemetryEvent::ResourceCenterTipsSkipped | TelemetryEvent::KeybindingsPageOpened | TelemetryEvent::GlobalSearchOpened | TelemetryEvent::GlobalSearchQueryStarted | TelemetryEvent::CommandSearchOpened { .. } | TelemetryEvent::CommandSearchExited { .. } | TelemetryEvent::CommandSearchResultAccepted { .. } | TelemetryEvent::CommandSearchFilterChanged { .. } | TelemetryEvent::CommandSearchAsyncQueryCompleted { .. } | TelemetryEvent::AICommandSearchOpened { .. } | TelemetryEvent::OpenNotebook(_) | TelemetryEvent::EditNotebook { .. } | TelemetryEvent::NotebookAction(_) | TelemetryEvent::OpenedAltScreenFind | TelemetryEvent::UserInitiatedClose { .. } | TelemetryEvent::QuitModalShown { .. } | TelemetryEvent::QuitModalCancel { .. } | TelemetryEvent::QuitModalDisabled | TelemetryEvent::UserInitiatedLogOut | TelemetryEvent::LogOutModalShown | TelemetryEvent::LogOutModalCancel { .. } | TelemetryEvent::SetOpacity { .. } | TelemetryEvent::SetBlurRadius { .. } | TelemetryEvent::ToggleDimInactivePanes { .. } | TelemetryEvent::InputModeChanged { .. } | TelemetryEvent::PtySpawned { .. } | TelemetryEvent::InitialWorkingDirectoryConfigurationChanged { .. } | TelemetryEvent::OpenedWarpAI { .. } | TelemetryEvent::WarpAIRequestIssued { .. } | TelemetryEvent::WarpAIAction { .. } | TelemetryEvent::UsedWarpAIPreparedPrompt { .. } | TelemetryEvent::ToggleFocusPaneOnHover { .. } | TelemetryEvent::WarpAICharacterLimitExceeded | TelemetryEvent::OpenInputContextMenu | TelemetryEvent::InputCutSelectedText | TelemetryEvent::InputCopySelectedText | TelemetryEvent::InputSelectAll | TelemetryEvent::InputPaste | TelemetryEvent::InputCommandSearch | TelemetryEvent::InputAICommandSearch | TelemetryEvent::InputAskWarpAI | TelemetryEvent::SaveAsWorkflowModal { .. } | TelemetryEvent::ExperimentTriggered { .. } | TelemetryEvent::ToggleSyncAllPanesInAllTabs { .. } | TelemetryEvent::ToggleSyncAllPanesInTab { .. } | TelemetryEvent::ToggleSameLinePrompt { .. } | TelemetryEvent::ToggleNewWindowsAtCustomSize { .. } | TelemetryEvent::SetNewWindowsAtCustomSize | TelemetryEvent::DisableInputSync | TelemetryEvent::ToggleTabIndicators { .. } | TelemetryEvent::TogglePreserveActiveTabColor { .. } | TelemetryEvent::ShowSubshellBanner | TelemetryEvent::DeclineSubshellBootstrap { .. } | TelemetryEvent::TriggerSubshellBootstrap { .. } | TelemetryEvent::AddDenylistedSubshellCommand | TelemetryEvent::RemoveDenylistedSubshellCommand | TelemetryEvent::AddAddedSubshellCommand | TelemetryEvent::RemoveAddedSubshellCommand | TelemetryEvent::ReceivedSubshellRcFileDcs | TelemetryEvent::AddDenylistedSshTmuxWrapperHost | TelemetryEvent::RemoveDenylistedSshTmuxWrapperHost | TelemetryEvent::ToggleSshTmuxWrapper { .. } | TelemetryEvent::SshInteractiveSessionDetected(_) | TelemetryEvent::SshTmuxWarpifyBannerDisplayed | TelemetryEvent::SshTmuxWarpifyBlockAccepted | TelemetryEvent::SshTmuxWarpifyBlockDismissed | TelemetryEvent::WarpifyFooterShown { .. } | TelemetryEvent::AgentToolbarDismissed | TelemetryEvent::WarpifyFooterAcceptedWarpify { .. } | TelemetryEvent::SshTmuxWarpificationSuccess { .. } | TelemetryEvent::SshTmuxWarpificationErrorBlock { .. } | TelemetryEvent::SshInstallTmuxBlockDisplayed | TelemetryEvent::SshInstallTmuxBlockAccepted | TelemetryEvent::SshInstallTmuxBlockDismissed | TelemetryEvent::ShowAliasExpansionBanner | TelemetryEvent::EnableAliasExpansionFromBanner | TelemetryEvent::DismissAliasExpansionBanner | TelemetryEvent::ShowVimKeybindingsBanner | TelemetryEvent::EnableVimKeybindingsFromBanner | TelemetryEvent::DismissVimKeybindingsBanner | TelemetryEvent::InitiateReauth | TelemetryEvent::InitiateAnonymousUserSignup { .. } | TelemetryEvent::AnonymousUserExpirationLockout | TelemetryEvent::AnonymousUserLinkedFromBrowser | TelemetryEvent::AnonymousUserAttemptLoginGatedFeature { .. } | TelemetryEvent::AnonymousUserHitCloudObjectLimit | TelemetryEvent::NeedsReauth | TelemetryEvent::WarpDriveOpened { .. } | TelemetryEvent::ToggleWarpAI { .. } | TelemetryEvent::ToggleSecretRedaction { .. } | TelemetryEvent::CustomSecretRegexAdded | TelemetryEvent::ToggleObfuscateSecret { .. } | TelemetryEvent::CopySecret | TelemetryEvent::AutoGenerateMetadataSuccess | TelemetryEvent::AutoGenerateMetadataError { .. } | TelemetryEvent::UpdateSortingChoice { .. } | TelemetryEvent::UndoClose { .. } | TelemetryEvent::PtyThroughput { .. } | TelemetryEvent::DuplicateObject(_) | TelemetryEvent::ExportObject(_) | TelemetryEvent::DriveSharingOnboardingBlockShown | TelemetryEvent::CommandFileRun | TelemetryEvent::PageUpDownInEditorPressed { .. } | TelemetryEvent::StartedSharingCurrentSession { .. } | TelemetryEvent::StoppedSharingCurrentSession { .. } | TelemetryEvent::JoinedSharedSession { .. } | TelemetryEvent::SharedSessionModalUpgradePressed | TelemetryEvent::SharerCancelledGrantRole { .. } | TelemetryEvent::SharerGrantModalDontShowAgain | TelemetryEvent::JumpToSharedSessionParticipant { .. } | TelemetryEvent::CopiedSharedSessionLink { .. } | TelemetryEvent::WebSessionOpenedOnDesktop { .. } | TelemetryEvent::WebCloudObjectOpenedOnDesktop { .. } | TelemetryEvent::UnsupportedShell { .. } | TelemetryEvent::LogOut | TelemetryEvent::InviteTeammates { .. } | TelemetryEvent::CopyObjectToClipboard(_) | TelemetryEvent::OpenAndWarpifyDockerSubshell { .. } | TelemetryEvent::UpdateBlockFilterQuery | TelemetryEvent::UpdateBlockFilterQueryContextLines { .. } | TelemetryEvent::ToggleBlockFilterQuery { .. } | TelemetryEvent::ToggleBlockFilterCaseSensitivity { .. } | TelemetryEvent::ToggleBlockFilterRegex { .. } | TelemetryEvent::ToggleBlockFilterInvert { .. } | TelemetryEvent::BlockFilterToolbeltButtonClicked | TelemetryEvent::ToggleSnackbarInActivePane { .. } | TelemetryEvent::PaneDragInitiated | TelemetryEvent::PaneDropped { .. } | TelemetryEvent::ObjectLinkCopied { .. } | TelemetryEvent::FileTreeToggled { .. } | TelemetryEvent::AgentModeUserAttemptedQueryAtRequestLimit { .. } | TelemetryEvent::AgentModeClickedEntrypoint { .. } | TelemetryEvent::AgentModeAttachedBlockContext { .. } | TelemetryEvent::AgentModeToggleAutoDetectionSetting { .. } | TelemetryEvent::PromptSuggestionShown { .. } | TelemetryEvent::SuggestedCodeDiffBannerShown { .. } | TelemetryEvent::SuggestedCodeDiffFailed { .. } | TelemetryEvent::PromptSuggestionAccepted { .. } | TelemetryEvent::ZeroStatePromptSuggestionUsed { .. } | TelemetryEvent::UnitTestSuggestionShown { .. } | TelemetryEvent::UnitTestSuggestionCancelled { .. } | TelemetryEvent::AgentModeCodeSuggestionEditedByUser { .. } | TelemetryEvent::AgentModeCodeFilesNavigated { .. } | TelemetryEvent::AgentModeCodeDiffHunksNavigated { .. } | TelemetryEvent::ToggleIntelligentAutosuggestionsSetting { .. } | TelemetryEvent::ToggleGlobalAI { .. } | TelemetryEvent::ToggleCodebaseContext { .. } | TelemetryEvent::ToggleAutoIndexing { .. } | TelemetryEvent::ToggleActiveAI { .. } | TelemetryEvent::TogglePromptSuggestionsSetting { .. } | TelemetryEvent::ToggleCodeSuggestionsSetting { .. } | TelemetryEvent::ToggleVoiceInputSetting { .. } | TelemetryEvent::TierLimitHit(_) | TelemetryEvent::SharedObjectLimitHitBannerViewPlansButtonClicked | TelemetryEvent::ResourceUsageStats { .. } | TelemetryEvent::MemoryUsageStats { .. } | TelemetryEvent::MemoryUsageHigh { .. } | TelemetryEvent::EnvVarCollectionInvoked(_) | TelemetryEvent::EnvVarWorkflowParameterization(_) | TelemetryEvent::CompletedSettingsImport { .. } | TelemetryEvent::SettingsImportConfigFocused(_) | TelemetryEvent::SettingsImportResetButtonClicked | TelemetryEvent::SettingsImportConfigParsed { .. } | TelemetryEvent::ITermMultipleHotkeys | TelemetryEvent::ToggleWorkspaceDecorationVisibility { .. } | TelemetryEvent::UpdateAltScreenPaddingMode { .. } | TelemetryEvent::AddTabWithShell { .. } | TelemetryEvent::AgentModeSurfacedCitations { .. } | TelemetryEvent::AgentModeOpenedCitation { .. } | TelemetryEvent::OpenedSharingDialog(_) | TelemetryEvent::ToggleLigatureRendering { .. } | TelemetryEvent::WorkflowAliasAdded { .. } | TelemetryEvent::WorkflowAliasRemoved { .. } | TelemetryEvent::WorkflowAliasEnvVarsAttached { .. } | TelemetryEvent::WorkflowAliasArgumentEdited { .. } | TelemetryEvent::ToggledAgentModeAutoexecuteReadonlyCommandsSetting { .. } | TelemetryEvent::ChangedAgentModeCodingPermissions { .. } | TelemetryEvent::RepoOutlineConstructionSuccess { .. } | TelemetryEvent::RepoOutlineConstructionFailed { .. } | TelemetryEvent::AutoexecutedAgentModeRequestedCommand { .. } | TelemetryEvent::AgenticOnboardingBlockSelected { .. } | TelemetryEvent::KnowledgePaneOpened { .. } | TelemetryEvent::MCPServerCollectionPaneOpened { .. } | TelemetryEvent::MCPServerAdded { .. } | TelemetryEvent::MCPTemplateCreated { .. } | TelemetryEvent::MCPTemplateInstalled { .. } | TelemetryEvent::MCPTemplateShared | TelemetryEvent::MCPServerSpawned { .. } | TelemetryEvent::MCPToolCallAccepted { .. } | TelemetryEvent::ExecutedWarpDrivePrompt { .. } | TelemetryEvent::ToggleSshWarpification { .. } | TelemetryEvent::SetSshExtensionInstallMode { .. } | TelemetryEvent::SshRemoteServerChoiceDoNotAskAgainToggled { .. } | TelemetryEvent::SettingsImportInitiated | TelemetryEvent::AgentModeCreatedAIBlock { .. } | TelemetryEvent::AgentModeRatedResponse { .. } | TelemetryEvent::StaticPromptSuggestionsBannerShown { .. } | TelemetryEvent::StaticPromptSuggestionAccepted { .. } | TelemetryEvent::AISuggestedRuleAdded { .. } | TelemetryEvent::AISuggestedRuleEdited { .. } | TelemetryEvent::AISuggestedRuleContentChanged { .. } | TelemetryEvent::AttachedImagesToAgentModeQuery { .. } | TelemetryEvent::ImageReceived { .. } | TelemetryEvent::FileExceededContextLimit { .. } | TelemetryEvent::AgentModeError { .. } | TelemetryEvent::AgentModeRequestRetrySucceeded { .. } | TelemetryEvent::ToggleNaturalLanguageAutosuggestionsSetting { .. } | TelemetryEvent::ToggleSharedBlockTitleGenerationSetting { .. } | TelemetryEvent::ToggleGitOperationsAutogenSetting { .. } | TelemetryEvent::GrepToolSucceeded | TelemetryEvent::FileGlobToolSucceeded | TelemetryEvent::FileGlobToolFailed { .. } | TelemetryEvent::ShellTerminatedPrematurely { .. } | TelemetryEvent::FullEmbedCodebaseContextSearchFailed { .. } | TelemetryEvent::FullEmbedCodebaseContextSearchSuccess { .. } | TelemetryEvent::SearchCodebaseRequested { .. } | TelemetryEvent::SearchCodebaseRepoUnavailable { .. } | TelemetryEvent::InputUXModeChanged { .. } | TelemetryEvent::ContextChipInteracted { .. } | TelemetryEvent::VoiceInputUsed { .. } | TelemetryEvent::AtMenuInteracted { .. } | TelemetryEvent::UserMenuUpgradeClicked | TelemetryEvent::ActiveIndexedReposChanged { .. } | TelemetryEvent::TabCloseButtonPositionUpdated { .. } | TelemetryEvent::ExpandedCodeSuggestions { .. } | TelemetryEvent::AIExecutionProfileCreated | TelemetryEvent::AIExecutionProfileDeleted | TelemetryEvent::AIExecutionProfileSettingUpdated { .. } | TelemetryEvent::AIExecutionProfileAddedToAllowlist { .. } | TelemetryEvent::AIExecutionProfileAddedToDenylist { .. } | TelemetryEvent::AIExecutionProfileRemovedFromAllowlist { .. } | TelemetryEvent::AIExecutionProfileRemovedFromDenylist { .. } | TelemetryEvent::AIExecutionProfileModelSelected { .. } | TelemetryEvent::OpenSlashMenu { .. } | TelemetryEvent::SlashCommandAccepted { .. } | TelemetryEvent::AgentModeSetupBannerAccepted | TelemetryEvent::AgentModeSetupBannerDismissed | TelemetryEvent::AgentModeSetupProjectScopedRulesAction { .. } | TelemetryEvent::AgentModeSetupCodebaseContextAction { .. } | TelemetryEvent::AgentModeSetupCreateEnvironmentAction { .. } | TelemetryEvent::CloneRepoPromptSubmitted { .. } | TelemetryEvent::GetStartedSkipToTerminal | TelemetryEvent::FileTreeItemAttachedAsContext { .. } | TelemetryEvent::CodeSelectionAddedAsContext { .. } | TelemetryEvent::FileTreeItemCreated | TelemetryEvent::ConversationListViewOpened | TelemetryEvent::ConversationListItemOpened { .. } | TelemetryEvent::ConversationListItemDeleted | TelemetryEvent::ConversationListLinkCopied { .. } | TelemetryEvent::AgentViewEntered { .. } | TelemetryEvent::AgentViewExited { .. } | TelemetryEvent::InlineConversationMenuOpened { .. } | TelemetryEvent::InlineConversationMenuItemSelected { .. } | TelemetryEvent::AgentShortcutsViewToggled { .. } | TelemetryEvent::InputBufferSubmitted { .. } | TelemetryEvent::RecentMenuItemSelected { .. } | TelemetryEvent::OpenRepoFolderSubmitted { .. } | TelemetryEvent::OutOfCreditsBannerClosed { .. } | TelemetryEvent::AutoReloadModalClosed { .. } | TelemetryEvent::AutoReloadToggledFromBillingSettings { .. } | TelemetryEvent::CLISubagentControlStateChanged { .. } | TelemetryEvent::CLISubagentResponsesToggled { .. } | TelemetryEvent::CLISubagentInputDismissed { .. } | TelemetryEvent::CLISubagentActionExecuted { .. } | TelemetryEvent::CLISubagentActionRejected { .. } | TelemetryEvent::AgentManagementViewToggled { .. } | TelemetryEvent::AgentManagementViewOpenedSession | TelemetryEvent::AgentManagementViewCopiedSessionLink | TelemetryEvent::DetectedIsolationPlatform { .. } | TelemetryEvent::AgentTipShown { .. } | TelemetryEvent::AgentTipClicked { .. } | TelemetryEvent::ToggleShowAgentTips { .. } | TelemetryEvent::CLIAgentToolbarVoiceInputUsed { .. } | TelemetryEvent::CLIAgentToolbarImageAttached { .. } | TelemetryEvent::CLIAgentToolbarShown { .. } | TelemetryEvent::CLIAgentPluginChipClicked { .. } | TelemetryEvent::CLIAgentPluginChipDismissed { .. } | TelemetryEvent::CLIAgentPluginOperationSucceeded { .. } | TelemetryEvent::CLIAgentPluginOperationFailed { .. } | TelemetryEvent::CLIAgentPluginDetected { .. } | TelemetryEvent::AgentNotificationShown { .. } | TelemetryEvent::CLIAgentRichInputOpened { .. } | TelemetryEvent::CLIAgentRichInputClosed { .. } | TelemetryEvent::CLIAgentRichInputSubmitted { .. } | TelemetryEvent::ToggleCLIAgentToolbarSetting { .. } | TelemetryEvent::ToggleUseAgentToolbarSetting { .. } | TelemetryEvent::CodexModalOpened | TelemetryEvent::CodexModalUseCodexClicked | TelemetryEvent::LinearIssueLinkOpened | TelemetryEvent::CloudAgentCapacityModalOpened | TelemetryEvent::CloudAgentCapacityModalDismissed | TelemetryEvent::CloudAgentCapacityModalUpgradeClicked | TelemetryEvent::ComputerUseApproved { .. } | TelemetryEvent::ComputerUseCancelled { .. } | TelemetryEvent::FreeTierLimitHitInterstitialDisplayed | TelemetryEvent::FreeTierLimitHitInterstitialUpgradeButtonClicked | TelemetryEvent::FreeTierLimitHitInterstitialClosed | TelemetryEvent::RemoteServerBinaryCheck { .. } | TelemetryEvent::RemoteServerInstallation { .. } | TelemetryEvent::RemoteServerInitialization { .. } | TelemetryEvent::RemoteServerDisconnection { .. } | TelemetryEvent::RemoteServerClientRequestError { .. } | TelemetryEvent::RemoteServerMessageDecodingError { .. } | TelemetryEvent::RemoteServerSetupDuration { .. } => false, #[cfg(feature = "local_fs")] TelemetryEvent::CodePaneOpened { .. } | TelemetryEvent::CodePanelsFileOpened { .. } | TelemetryEvent::PreviewPanePromoted => false, #[cfg(windows)] TelemetryEvent::WSLRegistryError | TelemetryEvent::AutoupdateUnableToCloseApplications | TelemetryEvent::AutoupdateFileInUse | TelemetryEvent::AutoupdateMutexTimeout | TelemetryEvent::AutoupdateForcekillFailed => false, } } /// Prints a JSON containing all telemetry events enabled for the current build. /// The keys are the event name and the values are the event description. #[cfg(not(target_family = "wasm"))] pub fn print_telemetry_events_json() -> anyhow::Result<()> { // We initialize the feature flags so that we can determine which telemetry events to print. crate::init_feature_flags(); let events: serde_json::Map = warp_core::telemetry::all_events() .filter_map(|event| { if !event.enablement_state().is_enabled() { return None; } Some(( event.name().to_string(), Value::String(event.description().to_string()), )) }) .collect(); let json_pretty_print_string = serde_json::to_string_pretty(&events)?; println!("{json_pretty_print_string}"); Ok(()) } } impl TelemetryEventDesc for TelemetryEventDiscriminants { fn enablement_state(&self) -> EnablementState { // We disallow the wildcard statement to prevent us from accidentally ignoring any // variants added in the future. Going forward, we should associate all new telemetry events // with a feature flag when appropriate. #[deny(clippy::wildcard_enum_match_arm)] match self { Self::SearchCodebaseRequested { .. } | Self::SearchCodebaseRepoUnavailable { .. } => { EnablementState::Flag(FeatureFlag::CrossRepoContext) } Self::AISuggestedAgentModeWorkflowAdded | Self::ShowedSuggestedAgentModeWorkflowChip | Self::ShowedSuggestedAgentModeWorkflowModal => { EnablementState::Flag(FeatureFlag::SuggestedAgentModeWorkflows) } Self::RepoOutlineConstructionSuccess { .. } => { EnablementState::Flag(FeatureFlag::AgentModeAnalytics) } Self::RepoOutlineConstructionFailed { .. } => { EnablementState::Flag(FeatureFlag::AgentModeAnalytics) } Self::FullEmbedCodebaseContextSearchFailed { .. } | Self::FullEmbedCodebaseContextSearchSuccess { .. } => { EnablementState::Flag(FeatureFlag::FullSourceCodeEmbedding) } Self::ObjectLinkCopied => EnablementState::Always, Self::FileTreeToggled => EnablementState::Flag(FeatureFlag::FileTree), Self::FileTreeItemAttachedAsContext => EnablementState::Flag(FeatureFlag::FileTree), Self::CodeSelectionAddedAsContext => EnablementState::Flag(FeatureFlag::HoaCodeReview), Self::FileTreeItemCreated => EnablementState::Flag(FeatureFlag::FileTree), Self::ConversationListViewOpened | Self::ConversationListItemOpened | Self::ConversationListItemDeleted | Self::ConversationListLinkCopied => { EnablementState::Flag(FeatureFlag::AgentViewConversationListView) } Self::AgentViewEntered | Self::AgentViewExited | Self::InlineConversationMenuOpened | Self::InlineConversationMenuItemSelected | Self::AgentShortcutsViewToggled => EnablementState::Flag(FeatureFlag::AgentView), Self::CreateProjectPromptSubmitted => EnablementState::Flag(FeatureFlag::GetStartedTab), Self::CreateProjectPromptSubmittedContent => { EnablementState::Flag(FeatureFlag::GetStartedTab) } Self::CloneRepoPromptSubmitted => EnablementState::Flag(FeatureFlag::GetStartedTab), Self::GetStartedSkipToTerminal => EnablementState::Flag(FeatureFlag::GetStartedTab), Self::PtyThroughput => EnablementState::Flag(FeatureFlag::RecordPtyThroughput), Self::AgentModeCreatedAIBlock => EnablementState::Flag(FeatureFlag::AgentMode), Self::MCPServerCollectionPaneOpened { .. } | Self::MCPServerAdded { .. } | Self::MCPServerSpawned { .. } | Self::MCPToolCallAccepted { .. } => EnablementState::Flag(FeatureFlag::McpServer), Self::MCPTemplateCreated { .. } | Self::MCPTemplateInstalled { .. } | Self::MCPTemplateShared { .. } => EnablementState::Always, Self::KnowledgePaneOpened { .. } => EnablementState::Flag(FeatureFlag::AIRules), #[cfg(feature = "local_fs")] Self::CodePaneOpened { .. } => EnablementState::Always, #[cfg(feature = "local_fs")] Self::CodePanelsFileOpened { .. } => EnablementState::Always, #[cfg(feature = "local_fs")] Self::PreviewPanePromoted => EnablementState::Always, Self::AISuggestedRuleAdded { .. } => EnablementState::Flag(FeatureFlag::SuggestedRules), Self::AISuggestedRuleEdited { .. } => { EnablementState::Flag(FeatureFlag::SuggestedRules) } Self::AISuggestedRuleContentChanged { .. } => { EnablementState::Flag(FeatureFlag::SuggestedRules) } Self::ToggleFocusPaneOnHover { .. } => EnablementState::Always, Self::InitiateAnonymousUserSignup { .. } | Self::LoginLaterButtonClicked | Self::LoginLaterConfirmationButtonClicked | Self::AnonymousUserExpirationLockout | Self::AnonymousUserLinkedFromBrowser | Self::AnonymousUserAttemptLoginGatedFeature | Self::AnonymousUserHitCloudObjectLimit => EnablementState::Always, Self::AgentModeChangedInputType => EnablementState::Always, Self::StartedSharingCurrentSession | Self::StoppedSharingCurrentSession | Self::SharedSessionModalUpgradePressed => { EnablementState::Flag(FeatureFlag::CreatingSharedSessions) } Self::JoinedSharedSession => EnablementState::Flag(FeatureFlag::ViewingSharedSessions), Self::OpenNotebook | Self::EditNotebook | Self::NotebookAction => { EnablementState::Always } Self::ToggleSettingsSync { .. } => EnablementState::Always, Self::AgentTipShown | Self::AgentTipClicked | Self::ToggleShowAgentTips => { EnablementState::Flag(FeatureFlag::AgentTips) } Self::AutosuggestionInserted => EnablementState::Always, Self::BlockCompleted => EnablementState::Always, Self::BackgroundBlockStarted => EnablementState::Always, Self::BaselineCommandLatency => EnablementState::Always, Self::SessionCreation => EnablementState::Always, Self::Login => EnablementState::Always, Self::OpenSuggestionsMenu => EnablementState::Always, Self::ConfirmSuggestion => EnablementState::Always, Self::OpenContextMenu => EnablementState::Always, Self::ContextMenuCopy => EnablementState::Always, Self::ContextMenuOpenShareModal => EnablementState::Always, Self::ContextMenuFindWithinBlocks => EnablementState::Always, Self::ContextMenuCopyPrompt => EnablementState::Always, Self::ContextMenuToggleGitPromptDirtyIndicator => EnablementState::Always, Self::ContextMenuInsertSelectedText => EnablementState::Always, Self::ContextMenuCopySelectedText => EnablementState::Always, Self::OpenPromptEditor => EnablementState::Always, Self::PromptEdited => EnablementState::Always, Self::ReinputCommands => EnablementState::Always, Self::JumpToPreviousCommand => EnablementState::Always, Self::CopyBlockSharingLink => EnablementState::Always, Self::GenerateBlockSharingLink => EnablementState::Always, Self::BlockSelection => EnablementState::Always, Self::BootstrappingSlow => EnablementState::Always, Self::BootstrappingSlowContents => EnablementState::Always, Self::SessionAbandonedBeforeBootstrap => EnablementState::Always, Self::BootstrappingSucceeded => EnablementState::Always, Self::TabSingleResultAutocompletion => EnablementState::Always, Self::EditorUnhandledModifierKey => EnablementState::Always, Self::CopyInviteLink => EnablementState::Always, Self::OpenThemeChooser => EnablementState::Always, Self::ThemeSelection => EnablementState::Always, Self::AppIconSelection => EnablementState::Always, Self::CursorDisplayType => EnablementState::Always, Self::OpenThemeCreatorModal => EnablementState::Always, Self::CreateCustomTheme => EnablementState::Always, Self::DeleteCustomTheme => EnablementState::Always, Self::SplitPane => EnablementState::Always, Self::UnableToAutoUpdateToNewVersion | Self::AutoupdateRelaunchAttempt => { EnablementState::Always } Self::SkipOnboardingSurvey => EnablementState::Always, Self::ToggleRestoreSession => EnablementState::Always, Self::DatabaseStartUpError => EnablementState::Always, Self::DatabaseReadError => EnablementState::Always, Self::DatabaseWriteError => EnablementState::Always, Self::AppStartup => EnablementState::Always, Self::LoggedOutStartup => EnablementState::Always, Self::DownloadSource => EnablementState::Always, Self::SSHBootstrapAttempt => EnablementState::Always, Self::SSHControlMasterError => EnablementState::Always, Self::KeybindingChanged => EnablementState::Always, Self::KeybindingResetToDefault => EnablementState::Always, Self::KeybindingRemoved => EnablementState::Always, Self::FeaturesPageAction => EnablementState::Always, Self::WorkflowExecuted => EnablementState::Always, Self::WorkflowSelected => EnablementState::Always, Self::OpenWorkflowSearch => EnablementState::Always, Self::OpenQuakeModeWindow => EnablementState::Always, Self::OpenWelcomeTips => EnablementState::Always, Self::CompleteWelcomeTipFeature => EnablementState::Always, Self::DismissWelcomeTips => EnablementState::Always, Self::ShowNotificationsDiscoveryBanner => EnablementState::Always, Self::NotificationsDiscoveryBannerAction => EnablementState::Always, Self::ShowNotificationsErrorBanner => EnablementState::Always, Self::NotificationsErrorBannerAction => EnablementState::Always, Self::NotificationPermissionsRequested => EnablementState::Always, Self::NotificationsRequestPermissionsOutcome => EnablementState::Always, Self::NotificationSent => EnablementState::Always, Self::NotificationFailedToSend => EnablementState::Always, Self::NotificationClicked => EnablementState::Always, Self::ToggleFindOption => EnablementState::Always, Self::SignUpButtonClicked => EnablementState::Always, Self::LoginButtonClicked => EnablementState::Always, Self::OpenNewSessionFromFilePath => EnablementState::Always, Self::OpenTeamFromURI => EnablementState::Always, Self::SelectCommandPaletteOption => EnablementState::Always, Self::PaletteSearchOpened => EnablementState::Always, Self::PaletteSearchResultAccepted => EnablementState::Always, Self::PaletteSearchExited => EnablementState::Always, Self::SelectNavigationPaletteItem => EnablementState::Always, Self::AuthCommonQuestionClicked => EnablementState::Always, Self::AuthToggleFAQ => EnablementState::Always, Self::OpenAuthPrivacySettings => EnablementState::Always, Self::TabRenamed => EnablementState::Always, Self::MoveActiveTab => EnablementState::Always, Self::MoveTab => EnablementState::Always, Self::DragAndDropTab => EnablementState::Always, Self::TabOperations => EnablementState::Always, Self::EditedInputBeforePrecmd => EnablementState::Always, Self::TriedToExecuteBeforePrecmd => EnablementState::Always, Self::ThinStrokesSettingChanged => EnablementState::Always, Self::BookmarkBlockToggled => EnablementState::Always, Self::JumpToBookmark => EnablementState::Always, Self::JumpToBottomofBlockButtonClicked => EnablementState::Always, Self::ToggleJumpToBottomofBlockButton => EnablementState::Always, Self::OpenLink => EnablementState::Always, Self::OpenChangelogLink => EnablementState::Always, Self::ShowInFileExplorer => EnablementState::Always, Self::CommandXRayTriggered => EnablementState::Always, Self::OpenLaunchConfigSaveModal => EnablementState::Always, Self::SaveLaunchConfig => EnablementState::Always, Self::OpenLaunchConfigFile => EnablementState::Always, Self::OpenLaunchConfig => EnablementState::Always, Self::TeamCreated => EnablementState::Always, Self::TeamJoined => EnablementState::Always, Self::TeamLeft => EnablementState::Always, Self::TeamLinkCopied => EnablementState::Always, Self::RemovedUserFromTeam => EnablementState::Always, Self::DeletedWorkflow => EnablementState::Always, Self::DeletedNotebook => EnablementState::Always, Self::ToggleApprovalsModal => EnablementState::Always, Self::ChangedInviteViewOption => EnablementState::Always, Self::SendEmailInvites => EnablementState::Always, Self::CommandCorrection => EnablementState::Always, Self::SetLineHeight => EnablementState::Always, Self::ResourceCenterOpened => EnablementState::Always, Self::ResourceCenterTipsCompleted => EnablementState::Always, Self::ResourceCenterTipsSkipped => EnablementState::Always, Self::KeybindingsPageOpened => EnablementState::Always, Self::GlobalSearchOpened => EnablementState::Always, Self::GlobalSearchQueryStarted => EnablementState::Always, Self::CommandSearchOpened => EnablementState::Always, Self::CommandSearchExited => EnablementState::Always, Self::CommandSearchResultAccepted => EnablementState::Always, Self::CommandSearchFilterChanged => EnablementState::Always, Self::CommandSearchAsyncQueryCompleted => EnablementState::Always, Self::AICommandSearchOpened => EnablementState::Always, Self::OpenedAltScreenFind => EnablementState::Always, Self::UserInitiatedClose => EnablementState::Always, Self::QuitModalShown => EnablementState::Always, Self::QuitModalCancel => EnablementState::Always, Self::QuitModalDisabled => EnablementState::Always, Self::UserInitiatedLogOut => EnablementState::Always, Self::LogOutModalShown => EnablementState::Always, Self::LogOutModalCancel => EnablementState::Always, Self::SetOpacity => EnablementState::Always, Self::SetBlurRadius => EnablementState::Always, Self::ToggleDimInactivePanes => EnablementState::Always, Self::InputModeChanged => EnablementState::Always, Self::PtySpawned => EnablementState::Always, Self::InitialWorkingDirectoryConfigurationChanged => EnablementState::Always, Self::OpenedWarpAI => EnablementState::Always, Self::WarpAIRequestIssued => EnablementState::Always, Self::WarpAIAction => EnablementState::Always, Self::UsedWarpAIPreparedPrompt => EnablementState::Always, Self::WarpAICharacterLimitExceeded => EnablementState::Always, Self::OpenInputContextMenu => EnablementState::Always, Self::InputCutSelectedText => EnablementState::Always, Self::InputCopySelectedText => EnablementState::Always, Self::InputSelectAll => EnablementState::Always, Self::InputPaste => EnablementState::Always, Self::InputCommandSearch => EnablementState::Always, Self::InputAICommandSearch => EnablementState::Always, Self::InputAskWarpAI => EnablementState::Always, Self::SaveAsWorkflowModal => EnablementState::Always, Self::ExperimentTriggered => EnablementState::Always, Self::ToggleSyncAllPanesInAllTabs => EnablementState::Always, Self::ToggleSyncAllPanesInTab => EnablementState::Always, Self::ToggleSameLinePrompt => EnablementState::Always, Self::ToggleNewWindowsAtCustomSize => EnablementState::Always, Self::SetNewWindowsAtCustomSize => EnablementState::Always, Self::DisableInputSync => EnablementState::Always, Self::ToggleTabIndicators => EnablementState::Always, Self::TogglePreserveActiveTabColor => EnablementState::Always, Self::ShowSubshellBanner => EnablementState::Always, Self::SshTmuxWarpifyBannerDisplayed => EnablementState::Always, Self::DeclineSubshellBootstrap => EnablementState::Always, Self::TriggerSubshellBootstrap => EnablementState::Always, Self::AddDenylistedSubshellCommand => EnablementState::Always, Self::RemoveDenylistedSubshellCommand => EnablementState::Always, Self::ToggleSshTmuxWrapper => EnablementState::Always, Self::ToggleSshWarpification => EnablementState::Always, Self::SetSshExtensionInstallMode => EnablementState::Always, Self::SshRemoteServerChoiceDoNotAskAgainToggled => EnablementState::Always, Self::AddDenylistedSshTmuxWrapperHost => EnablementState::Always, Self::RemoveDenylistedSshTmuxWrapperHost => EnablementState::Always, Self::SshInteractiveSessionDetected => EnablementState::Always, Self::SshTmuxWarpifyBlockAccepted => EnablementState::Always, Self::SshTmuxWarpifyBlockDismissed => EnablementState::Always, Self::WarpifyFooterShown | Self::AgentToolbarDismissed | Self::WarpifyFooterAcceptedWarpify => EnablementState::Always, Self::SshTmuxWarpificationSuccess => EnablementState::Always, Self::SshTmuxWarpificationErrorBlock => EnablementState::Always, Self::SshInstallTmuxBlockDisplayed => EnablementState::Always, Self::SshInstallTmuxBlockAccepted => EnablementState::Always, Self::SshInstallTmuxBlockDismissed => EnablementState::Always, Self::AddAddedSubshellCommand => EnablementState::Always, Self::RemoveAddedSubshellCommand => EnablementState::Always, Self::ReceivedSubshellRcFileDcs => EnablementState::Always, Self::ShowAliasExpansionBanner => EnablementState::Always, Self::EnableAliasExpansionFromBanner => EnablementState::Always, Self::DismissAliasExpansionBanner => EnablementState::Always, Self::ShowVimKeybindingsBanner => EnablementState::Always, Self::EnableVimKeybindingsFromBanner => EnablementState::Always, Self::DismissVimKeybindingsBanner => EnablementState::Always, Self::InitiateReauth => EnablementState::Always, Self::NeedsReauth => EnablementState::Always, Self::WarpDriveOpened => EnablementState::Always, Self::ToggleWarpAI => EnablementState::Always, Self::ToggleSecretRedaction => EnablementState::Always, Self::CustomSecretRegexAdded => EnablementState::Always, Self::ToggleObfuscateSecret => EnablementState::Always, Self::CopySecret => EnablementState::Always, Self::AutoGenerateMetadataSuccess => EnablementState::Always, Self::AutoGenerateMetadataError => EnablementState::Always, Self::UpdateSortingChoice => EnablementState::Always, Self::UndoClose => EnablementState::Always, Self::DuplicateObject => EnablementState::Always, Self::ExportObject => EnablementState::Always, Self::CommandFileRun => EnablementState::Always, Self::PageUpDownInEditorPressed => EnablementState::Always, Self::UnsupportedShell => EnablementState::Always, Self::LogOut => EnablementState::Always, Self::SettingsImportInitiated => EnablementState::Always, Self::InviteTeammates => EnablementState::Always, Self::CopyObjectToClipboard => EnablementState::Always, Self::OpenAndWarpifyDockerSubshell => EnablementState::Always, Self::UpdateBlockFilterQuery => EnablementState::Always, Self::UpdateBlockFilterQueryContextLines => EnablementState::Always, Self::ToggleBlockFilterQuery => EnablementState::Always, Self::ToggleBlockFilterCaseSensitivity => EnablementState::Always, Self::ToggleBlockFilterRegex => EnablementState::Always, Self::ToggleBlockFilterInvert => EnablementState::Always, Self::BlockFilterToolbeltButtonClicked => EnablementState::Always, Self::ToggleSnackbarInActivePane => EnablementState::Always, Self::PaneDragInitiated => EnablementState::Always, Self::PaneDropped => EnablementState::Always, Self::TierLimitHit => EnablementState::Always, Self::SharerCancelledGrantRole => EnablementState::Always, Self::SharerGrantModalDontShowAgain => EnablementState::Always, Self::JumpToSharedSessionParticipant => EnablementState::Always, Self::CopiedSharedSessionLink => EnablementState::Always, Self::WebSessionOpenedOnDesktop => EnablementState::Always, Self::WebCloudObjectOpenedOnDesktop => EnablementState::Always, Self::ToggleShowBlockDividers => EnablementState::Flag(FeatureFlag::MinimalistUI), Self::DriveSharingOnboardingBlockShown => EnablementState::Always, Self::SharedObjectLimitHitBannerViewPlansButtonClicked => EnablementState::Always, Self::ResourceUsageStats => EnablementState::Always, Self::ToggleGlobalAI => EnablementState::Always, Self::ToggleActiveAI => EnablementState::Always, Self::AgenticOnboardingBlockSelected => EnablementState::Always, Self::MemoryUsageStats => EnablementState::ChannelSpecific { channels: vec![Channel::Local, Channel::Dev], }, Self::MemoryUsageHigh => EnablementState::Always, Self::AgentModeUserAttemptedQueryAtRequestLimit | Self::AgentModeClickedEntrypoint | Self::AgentModeAttachedBlockContext | Self::AgentModeToggleAutoDetectionSetting | Self::AgentModePotentialAutoDetectionFalsePositive => { EnablementState::Flag(FeatureFlag::AgentMode) } Self::EnvVarCollectionInvoked | Self::EnvVarWorkflowParameterization => { EnablementState::Always } Self::BlockCompletedOnDogfoodOnly => EnablementState::ChannelSpecific { channels: vec![Channel::Local, Channel::Dev], }, Self::CompletedSettingsImport | Self::SettingsImportConfigFocused | Self::SettingsImportConfigParsed | Self::SettingsImportResetButtonClicked | Self::ITermMultipleHotkeys => EnablementState::Flag(FeatureFlag::SettingsImport), Self::ToggleIntelligentAutosuggestionsSetting | Self::AgentModePrediction => { EnablementState::Always } Self::PromptSuggestionShown | Self::SuggestedCodeDiffBannerShown | Self::SuggestedCodeDiffFailed | Self::PromptSuggestionAccepted | Self::StaticPromptSuggestionsBannerShown | Self::StaticPromptSuggestionAccepted | Self::TogglePromptSuggestionsSetting | Self::ToggleCodeSuggestionsSetting | Self::UnitTestSuggestionShown { .. } | Self::UnitTestSuggestionAccepted { .. } | Self::UnitTestSuggestionCancelled { .. } => EnablementState::Always, Self::ToggleNaturalLanguageAutosuggestionsSetting => { EnablementState::Flag(FeatureFlag::PredictAMQueries) } Self::ToggleSharedBlockTitleGenerationSetting => { EnablementState::Flag(FeatureFlag::SharedBlockTitleGeneration) } Self::ToggleGitOperationsAutogenSetting => { EnablementState::Flag(FeatureFlag::GitOperationsInCodeReview) } Self::ZeroStatePromptSuggestionUsed => EnablementState::Always, Self::ToggleVoiceInputSetting => EnablementState::Always, Self::AgentModeCodeSuggestionEditedByUser | Self::AgentModeCodeFilesNavigated | Self::AgentModeCodeDiffHunksNavigated => EnablementState::Always, Self::ToggleWorkspaceDecorationVisibility => { EnablementState::Flag(FeatureFlag::FullScreenZenMode) } Self::UpdateAltScreenPaddingMode => { EnablementState::Flag(FeatureFlag::RemoveAltScreenPadding) } Self::AddTabWithShell => EnablementState::Flag(FeatureFlag::ShellSelector), Self::AgentModeSurfacedCitations | Self::AgentModeOpenedCitation => { EnablementState::Always } Self::OpenedSharingDialog => EnablementState::Always, Self::ToggleLigatureRendering => EnablementState::Flag(FeatureFlag::Ligatures), Self::WorkflowAliasAdded | Self::WorkflowAliasRemoved | Self::WorkflowAliasArgumentEdited | Self::WorkflowAliasEnvVarsAttached => { EnablementState::Flag(FeatureFlag::WorkflowAliases) } Self::ToggledAgentModeAutoexecuteReadonlyCommandsSetting | Self::ChangedAgentModeCodingPermissions | Self::AutoexecutedAgentModeRequestedCommand => EnablementState::Always, Self::AttachedImagesToAgentModeQuery => { EnablementState::Flag(FeatureFlag::ImageAsContext) } #[cfg(windows)] Self::WSLRegistryError | Self::AutoupdateUnableToCloseApplications | Self::AutoupdateFileInUse | Self::AutoupdateMutexTimeout | Self::AutoupdateForcekillFailed => EnablementState::Always, Self::ToggleCodebaseContext => EnablementState::Always, Self::ToggleAutoIndexing => EnablementState::Always, Self::AgentModeRatedResponse => { EnablementState::Flag(FeatureFlag::GlobalAIAnalyticsBanner) } Self::ExecutedWarpDrivePrompt => EnablementState::Flag(FeatureFlag::AgentModeWorkflows), Self::ImageReceived => EnablementState::Always, Self::FileExceededContextLimit => EnablementState::Always, Self::AgentModeError => EnablementState::Always, Self::AgentModeRequestRetrySucceeded => EnablementState::Always, Self::GrepToolSucceeded => EnablementState::Always, Self::GrepToolFailed => EnablementState::Always, Self::FileGlobToolSucceeded => EnablementState::Always, Self::FileGlobToolFailed { .. } => EnablementState::Always, Self::ShellTerminatedPrematurely { .. } => EnablementState::Always, Self::InputUXModeChanged { .. } => EnablementState::Always, Self::ContextChipInteracted { .. } => EnablementState::Always, Self::VoiceInputUsed { .. } => EnablementState::Always, Self::AtMenuInteracted { .. } => EnablementState::Always, Self::ActiveIndexedReposChanged { .. } => { EnablementState::Flag(FeatureFlag::FullSourceCodeEmbedding) } Self::UserMenuUpgradeClicked => EnablementState::Always, Self::TabCloseButtonPositionUpdated { .. } => EnablementState::Always, Self::ExpandedCodeSuggestions { .. } => EnablementState::Always, Self::AIExecutionProfileCreated | Self::AIExecutionProfileDeleted | Self::AIExecutionProfileSettingUpdated { .. } | Self::AIExecutionProfileAddedToAllowlist { .. } | Self::AIExecutionProfileAddedToDenylist { .. } | Self::AIExecutionProfileRemovedFromAllowlist { .. } | Self::AIExecutionProfileRemovedFromDenylist { .. } | Self::AIExecutionProfileModelSelected { .. } => { EnablementState::Flag(FeatureFlag::MultiProfile) } Self::AIInputNotSent { .. } => EnablementState::Always, Self::OpenSlashMenu { .. } => EnablementState::Always, Self::SlashCommandAccepted { .. } => EnablementState::Always, Self::AgentModeSetupBannerAccepted { .. } => EnablementState::Always, Self::AgentModeSetupBannerDismissed => EnablementState::Always, Self::AgentModeSetupProjectScopedRulesAction { .. } => EnablementState::Always, Self::AgentModeSetupCodebaseContextAction { .. } => EnablementState::Always, Self::AgentModeSetupCreateEnvironmentAction { .. } => EnablementState::Always, Self::InputBufferSubmitted => EnablementState::Flag(FeatureFlag::NldImprovements), Self::AgentModeContinueConversationButtonClicked { .. } => EnablementState::Always, Self::AgentModeRewindDialogOpened { .. } => { EnablementState::Flag(FeatureFlag::RevertToCheckpoints) } Self::AgentModeRewindExecuted { .. } => { EnablementState::Flag(FeatureFlag::RevertToCheckpoints) } Self::RecentMenuItemSelected => EnablementState::Always, Self::OpenRepoFolderSubmitted => EnablementState::Always, Self::OutOfCreditsBannerClosed => EnablementState::Always, Self::AutoReloadModalClosed => EnablementState::Always, Self::AutoReloadToggledFromBillingSettings => EnablementState::Always, Self::CLISubagentControlStateChanged { .. } | Self::CLISubagentResponsesToggled { .. } | Self::CLISubagentInputDismissed { .. } | Self::CLISubagentActionExecuted { .. } | Self::CLISubagentActionRejected { .. } => EnablementState::Always, Self::AgentManagementViewToggled { .. } | Self::AgentManagementViewOpenedSession | Self::AgentManagementViewCopiedSessionLink => { EnablementState::Flag(FeatureFlag::AgentManagementView) } Self::DetectedIsolationPlatform { .. } => EnablementState::Always, Self::AgentExitedShellProcess { .. } => EnablementState::Always, Self::CLIAgentToolbarVoiceInputUsed { .. } => EnablementState::Always, Self::CLIAgentToolbarImageAttached { .. } => EnablementState::Always, Self::CLIAgentToolbarShown { .. } => EnablementState::Always, Self::CLIAgentPluginChipClicked { .. } | Self::CLIAgentPluginChipDismissed { .. } | Self::CLIAgentPluginOperationSucceeded { .. } | Self::CLIAgentPluginOperationFailed { .. } => { EnablementState::Flag(FeatureFlag::HOANotifications) } Self::CLIAgentPluginDetected { .. } => EnablementState::Always, Self::AgentNotificationShown { .. } => { EnablementState::Flag(FeatureFlag::HOANotifications) } Self::CLIAgentRichInputOpened { .. } | Self::CLIAgentRichInputClosed { .. } | Self::CLIAgentRichInputSubmitted { .. } => { EnablementState::Flag(FeatureFlag::CLIAgentRichInput) } Self::ToggleCLIAgentToolbarSetting { .. } => EnablementState::Always, Self::ToggleUseAgentToolbarSetting { .. } => EnablementState::Always, Self::CodexModalOpened | Self::CodexModalUseCodexClicked => EnablementState::Always, Self::LinearIssueLinkOpened => EnablementState::Always, Self::CloudAgentCapacityModalOpened | Self::CloudAgentCapacityModalDismissed | Self::CloudAgentCapacityModalUpgradeClicked => { EnablementState::Flag(FeatureFlag::CloudMode) } Self::ComputerUseApproved | Self::ComputerUseCancelled => { EnablementState::Flag(FeatureFlag::AgentModeComputerUse) } Self::FreeTierLimitHitInterstitialDisplayed { .. } => EnablementState::Always, Self::FreeTierLimitHitInterstitialUpgradeButtonClicked { .. } => { EnablementState::Always } Self::FreeTierLimitHitInterstitialClosed { .. } => EnablementState::Always, Self::RemoteServerBinaryCheck | Self::RemoteServerInstallation | Self::RemoteServerInitialization | Self::RemoteServerDisconnection | Self::RemoteServerClientRequestError | Self::RemoteServerMessageDecodingError | Self::RemoteServerSetupDuration => { EnablementState::Flag(FeatureFlag::SshRemoteServer) } } } fn name(&self) -> &'static str { match self { Self::RepoOutlineConstructionSuccess => "Repo Outline Built Successfully", Self::RepoOutlineConstructionFailed => "Repo Outline Construction Failed", Self::AutosuggestionInserted => "Autosuggestion Inserted", // Although this event is sent when the block completes rather than // when it's created, we are still naming it "Block Creation" to // preserve our historical telemetry data. Self::BlockCompleted => "Block Creation", Self::BlockCompletedOnDogfoodOnly => "Block Completed (dogfood only)", Self::BackgroundBlockStarted => "Background Block Started", Self::SessionCreation => "Tab Creation", Self::Login => "Logged in to native app", Self::AgentModeContinueConversationButtonClicked => { "Clicked Continue Conversation Button" } Self::AgentModeRewindDialogOpened { .. } => "Opened Rewind Confirmation Dialog", Self::AgentModeRewindExecuted { .. } => "Executed Conversation Rewind", Self::ReinputCommands => "Context Menu: Reinput Commands", Self::ToggleSettingsSync => "Toggle Settings Sync", Self::ToggleFocusPaneOnHover => "Toggle Focus Pane On Hover", Self::LoginLaterButtonClicked => "Login Later Button Clicked", Self::LoginLaterConfirmationButtonClicked => "Login Later Confirmation Button Clicked", Self::JumpToPreviousCommand => "Jumped to Previous Command", Self::OpenContextMenu => "Open Context Menu", Self::ContextMenuFindWithinBlocks => "Context Menu: Find Within Blocks", Self::ContextMenuOpenShareModal => "Context Menu: Initiate Block Sharing", Self::ContextMenuCopy => "Context Menu Copy", Self::CopyBlockSharingLink => "Copy Block Sharing Link", Self::GenerateBlockSharingLink => "Generate Block Sharing Link", Self::BlockSelection => "Block Selection", Self::BootstrappingSlow => "Bootstrapping Slow", Self::BootstrappingSlowContents => "Bootstrap Slow Contents", Self::ObjectLinkCopied => "Object Link Copied", Self::FileTreeToggled => "File Tree Toggled", Self::FileTreeItemAttachedAsContext => "FileTree.AttachedAsContext", Self::CodeSelectionAddedAsContext => "CodeView.SelectionAddedAsContext", Self::FileTreeItemCreated => "FileTree.ItemCreated", Self::ConversationListViewOpened => "ConversationList.Opened", Self::ConversationListItemOpened => "ConversationList.ItemOpened", Self::ConversationListItemDeleted => "ConversationList.ItemDeleted", Self::ConversationListLinkCopied => "ConversationList.LinkCopied", Self::AgentViewEntered => "AgentView.Entered", Self::AgentViewExited => "AgentView.Exited", Self::InlineConversationMenuOpened => "AgentView.InlineConversationMenuOpened", Self::InlineConversationMenuItemSelected => { "AgentView.InlineConversationMenuItemSelected" } Self::AgentShortcutsViewToggled => "AgentView.ShortcutsViewToggled", Self::CreateProjectPromptSubmitted => "Create Project Prompt Submitted", Self::CreateProjectPromptSubmittedContent => "Create Project Prompt Submitted Content", Self::CloneRepoPromptSubmitted => "Clone Repo Prompt Submitted", Self::GetStartedSkipToTerminal => "Get Started Skip to Terminal", Self::InitiateAnonymousUserSignup => "Anonymous User Initiated Signup", Self::AnonymousUserExpirationLockout => "Anonymous User Expiration Lockout", Self::AnonymousUserLinkedFromBrowser => "Anonymous User Linked from Browser", Self::AnonymousUserAttemptLoginGatedFeature => { "Anonymous User Attempted Login-Gated Feature" } Self::MCPServerCollectionPaneOpened { .. } => "MCP Server Collection Pane Opened", Self::MCPServerAdded { .. } => "MCP Server Added", Self::MCPTemplateCreated { .. } => "MCP Template Created", Self::MCPTemplateInstalled { .. } => "MCP Template Installed", Self::MCPTemplateShared => "MCP Template Shared", Self::MCPServerSpawned { .. } => "MCP Server Spawned", Self::MCPToolCallAccepted { .. } => "MCP Tool Call Accepted", Self::KnowledgePaneOpened { .. } => "Knowledge Pane Opened", #[cfg(feature = "local_fs")] Self::CodePaneOpened { .. } => "Code Pane Opened", #[cfg(feature = "local_fs")] Self::CodePanelsFileOpened { .. } => "CodePanels.FileOpened", #[cfg(feature = "local_fs")] Self::PreviewPanePromoted => "Preview Pane Promoted", Self::AISuggestedRuleAdded { .. } => "AI Suggested Rule Added", Self::AISuggestedRuleEdited { .. } => "AI Suggested Rule Edited", Self::AISuggestedRuleContentChanged { .. } => "AI Suggested Rule Content Changed", Self::AnonymousUserHitCloudObjectLimit => "Anonymous User Hit Cloud Object Limit", Self::BootstrappingSucceeded => "Bootstrapping Succeeded", Self::SessionAbandonedBeforeBootstrap => "Session Abandoned Before Bootstrap", Self::TabSingleResultAutocompletion => "Tab Single Result Autocompletion", Self::OpenSuggestionsMenu => "Open Suggestions Menu", Self::ConfirmSuggestion => "Confirm Suggestion", Self::ContextMenuInsertSelectedText => "Context Menu Insert Selected Text into Input", Self::ContextMenuCopySelectedText => "Context Menu Copy Selected Text", Self::ContextMenuCopyPrompt => "Context Menu Copy Prompt", Self::ContextMenuToggleGitPromptDirtyIndicator => { "Context Menu Toggle Git Prompt Dirty Indicator" } Self::EditorUnhandledModifierKey => "Unhandled Editor Modifier Key", Self::CopyInviteLink => "Copy Invite Link", Self::OpenThemeChooser => "Open Theme Chooser", Self::ThemeSelection => "Select Theme", Self::AppIconSelection => "Select App Icon", Self::CursorDisplayType => "Select Cursor Type", Self::OpenThemeCreatorModal => "Open Theme Creator Modal", Self::CreateCustomTheme => "Create Custom Theme", Self::DeleteCustomTheme => "Delete Custom Theme", Self::UnableToAutoUpdateToNewVersion => "Unable to Update To New Version", Self::AutoupdateRelaunchAttempt => "Attempting to Relaunch for Update", Self::SplitPane => "Split Pane", Self::SkipOnboardingSurvey => "Skip Onboarding Survey", Self::ToggleRestoreSession => "Toggle Restore Session", Self::DatabaseStartUpError => "Database Startup Error", Self::DatabaseWriteError => "Database Write Error", Self::DatabaseReadError => "Database Read Error", Self::AppStartup => "App Startup", Self::LoggedOutStartup => "Logged-out App Startup", Self::DownloadSource => "App Download Source", Self::BaselineCommandLatency => "BaselineCommand Latency", Self::SSHBootstrapAttempt => "SSH Bootstrap Attempt", Self::SSHControlMasterError => "SSH ControlMaster Error", Self::SetNewWindowsAtCustomSize => "Set New Windows at Custom Size", Self::ToggleNewWindowsAtCustomSize => "Toggle New Windows at Custom Size", Self::KeybindingChanged => "Keybinding Changed", Self::KeybindingResetToDefault => "Keybinding Reset to Default", Self::KeybindingRemoved => "Keybinding Removed", Self::OpenWorkflowSearch => "Open Workflows Search", Self::WorkflowExecuted => "Workflow Executed", Self::WorkflowSelected => "Workflow Selected", Self::FeaturesPageAction => "Features Page Action", Self::OpenQuakeModeWindow => "Open Quake Mode Window", Self::OpenWelcomeTips => "Open Welcome Tips", Self::CompleteWelcomeTipFeature => "Complete Welcome Tip", Self::DismissWelcomeTips => "Dismiss Welcome Tips", Self::ShowNotificationsDiscoveryBanner => "ShowNotificationsDiscoveryBanner", Self::NotificationsDiscoveryBannerAction => "Notifications Discovery Banner Action", Self::ShowNotificationsErrorBanner => "ShowNotificationsErrorBanner", Self::NotificationsErrorBannerAction => "Notifications Error Banner Action", Self::NotificationPermissionsRequested => "Notification Permissions Requested", Self::NotificationSent => "Notification Sent", Self::NotificationFailedToSend => "Notification Failed to Send", Self::NotificationClicked => "Notification Clicked", Self::NotificationsRequestPermissionsOutcome => { "Notification Request Permissions Outcome" } Self::ToggleFindOption => "Find Option Toggled", Self::SignUpButtonClicked => "Sign Up Button Clicked in App", Self::LoginButtonClicked => "Log In Button Clicked in App", Self::OpenNewSessionFromFilePath => "New Session From Directory", Self::OpenTeamFromURI => "Open Team from URI", Self::SelectCommandPaletteOption => "Select Command Palette Option", Self::PaletteSearchOpened => "Open Palette", Self::PaletteSearchResultAccepted => "Command Palette Search Accepted", Self::PaletteSearchExited => "Command Palette Search Exited", Self::AuthCommonQuestionClicked => "Auth Common Question Clicked in App", Self::AuthToggleFAQ => "Auth: Toggle Common Questions", Self::OpenAuthPrivacySettings => "Auth: Open Privacy Settings Overlay", Self::TabRenamed => "Tab Renamed", Self::MoveActiveTab => "Move Active Tab", Self::MoveTab => "Move Tab", Self::DragAndDropTab => "Drag and Drop Tab", Self::TabOperations => "Tab Operations", Self::EditedInputBeforePrecmd => "Edited Input Before Precmd", Self::TriedToExecuteBeforePrecmd => "Tried to Execute Before Precmd", Self::ThinStrokesSettingChanged => "Thin Strokes Setting Changed", Self::BookmarkBlockToggled => "Toggled Bookmark Block", Self::JumpToBookmark => "Jumped to Bookmark Block", Self::JumpToBottomofBlockButtonClicked => "Jumped to Bottom of Block Button Clicked", Self::OpenLink => "Opened Link", Self::OpenChangelogLink => "Opened Changelog Link", Self::ShowInFileExplorer => "Showed File in File Explorer", Self::CommandXRayTriggered => "Triggered Command XRay", Self::OpenLaunchConfigSaveModal => "Open Save Config Modal", Self::SaveLaunchConfig => "Save Launch Config", Self::OpenLaunchConfigFile => "Open Launch Config File", Self::OpenLaunchConfig => "Open Launch Config", Self::LogOut => "Log Out", Self::SelectNavigationPaletteItem => "Select Navigation Palette Item", Self::CommandCorrection => "Command Correction Event", Self::SetLineHeight => "Set Line Height", Self::ResourceCenterOpened => "Resource Center Opened", Self::ResourceCenterTipsCompleted => "Resource Center Tips Completed", Self::ResourceCenterTipsSkipped => "Resource Center Tips Skipped", Self::KeybindingsPageOpened => "Resource Center Keybindings Page Opened", Self::GlobalSearchOpened => "Global Search Opened", Self::GlobalSearchQueryStarted => "Global Search Query Started", Self::CommandSearchOpened => "Command Search Opened", Self::CommandSearchExited => "Command Search Exited", Self::CommandSearchResultAccepted => "Command Search Result Accepted", Self::CommandSearchFilterChanged => "Command Search Filter Changed", Self::CommandSearchAsyncQueryCompleted => "Command Search Async Query Completed", Self::AICommandSearchOpened => "AI Command Search opened", Self::OpenNotebook => "Notebook Opened", Self::EditNotebook => "Notebook Edited", Self::NotebookAction => "Notebook Action", Self::OpenedAltScreenFind => "Opened alt screen find bar", Self::UserInitiatedClose => "User Initiated Closing Something", Self::QuitModalShown => "Quit Modal Shown", Self::QuitModalCancel => "Quit Modal Cancel Pressed", Self::QuitModalDisabled => "Quit Modal Disabled", Self::UserInitiatedLogOut => "User Initiated Log Out", Self::LogOutModalShown => "Log Out Modal Shown", Self::LogOutModalCancel => "Log Out Modal Cancel Pressed", Self::SetBlurRadius => "Set Window Blur Radius", Self::SetOpacity => "Set Window Opacity", Self::ToggleDimInactivePanes => "Toggle Dim Inactive Panes", Self::ToggleJumpToBottomofBlockButton => "Toggle Jump to Bottom of Block Button", Self::ToggleShowBlockDividers => "Toggle Show Block Dividers", Self::PtySpawned => "Pty Spawned", Self::InitialWorkingDirectoryConfigurationChanged => { "InitialWorkingDirectoryConfigurationChanged" } Self::InputModeChanged => "Input Mode Changed", Self::OpenedWarpAI => "Opened Warp AI", Self::WarpAIRequestIssued => "Warp AI Request Issued", Self::WarpAIAction => "Warp AI Action", Self::UsedWarpAIPreparedPrompt => "Used Warp AI Prepared Prompt", Self::WarpAICharacterLimitExceeded => "Warp AI Character Limit Exceeded", Self::OpenInputContextMenu => "OpenInputBoxContextMenu", Self::InputCutSelectedText => "InputBoxCutSelectedText", Self::InputCopySelectedText => "InputBoxCutSelectedText", Self::InputSelectAll => "InputBoxSelectAll", Self::InputPaste => "InputBoxPaste", Self::InputCommandSearch => "InputBoxCommandSearch", Self::InputAICommandSearch => "InputBoxAICommandSearch", Self::InputAskWarpAI => "InputBoxAskWarpAI", Self::SaveAsWorkflowModal => "Opened Save As Workflow Modal", Self::ExperimentTriggered => "experiments.client.enroll_client", Self::ToggleSyncAllPanesInAllTabs => "Toggle Sync Inputs Across All Panes in All Tabs", Self::ToggleSyncAllPanesInTab => "Toggle Sync Inputs Across All Panes in Current Tab", Self::ToggleSameLinePrompt => "Toggle Same Line Prompt", Self::DisableInputSync => "Disable Input Sync Inputs", Self::ToggleTabIndicators => "Toggle Tab Indicators", Self::TogglePreserveActiveTabColor => "Toggle Preserve Active Tab Color", Self::ShowSubshellBanner => "Show Subshell Banner", Self::SshTmuxWarpifyBannerDisplayed => "Show Warpify SSH Banner", Self::DeclineSubshellBootstrap => "Decline Subshell Bootstrap", Self::TriggerSubshellBootstrap => "Trigger Subshell Bootstrap", Self::AddDenylistedSubshellCommand => "Add Denylisted Subshell Command", Self::RemoveDenylistedSubshellCommand => "Remove Denylisted Subshell Command", Self::AddAddedSubshellCommand => "Add Added Subshell Command", Self::RemoveAddedSubshellCommand => "Remove Added Subshell Command", Self::ReceivedSubshellRcFileDcs => "Received Subshell RC File DCS", Self::ToggleSshTmuxWrapper => "Toggle SSH Tmux Wrapper", Self::ToggleSshWarpification => "Toggle SSH Warpification", Self::SetSshExtensionInstallMode => "Set SSH Extension Install Mode", Self::SshRemoteServerChoiceDoNotAskAgainToggled => { "SSH Remote Server Choice Do Not Ask Again Toggled" } Self::AddDenylistedSshTmuxWrapperHost => "Add Denylisted SSH Tmux Wrapper Host", Self::RemoveDenylistedSshTmuxWrapperHost => "Remove Denylisted SSH Tmux Wrapper Host", Self::SshInteractiveSessionDetected => "SSH Interactive Session Detected", Self::SshTmuxWarpifyBlockAccepted => "SSH Tmux Warpify Block Accepted", Self::SshTmuxWarpifyBlockDismissed => "SSH Tmux Warpify Block Dismissed", Self::WarpifyFooterShown => "Warpify Footer Shown", Self::AgentToolbarDismissed => "Agent Toolbar Dismissed", Self::WarpifyFooterAcceptedWarpify => "Warpify Footer Accepted Warpify", Self::SshTmuxWarpificationSuccess => "SSH Tmux Warpification Succeeded", Self::SshTmuxWarpificationErrorBlock => "SSH Tmux Warpification Error Block", Self::SshInstallTmuxBlockDisplayed => "SSH Install Tmux Block Displayed", Self::SshInstallTmuxBlockAccepted => "SSH Install Tmux Block Accepted", Self::SshInstallTmuxBlockDismissed => "SSH Install Tmux Block Dismissed", Self::ShowAliasExpansionBanner => "Show Alias Expansion Banner", Self::DismissAliasExpansionBanner => "Dismiss Alias Expansion Banner", Self::EnableAliasExpansionFromBanner => "Enable Alias Expansion From Banner", Self::InitiateReauth => "Initiate Reauth", Self::NeedsReauth => "Needs Reauth", Self::WarpDriveOpened => "Warp Drive Opened", Self::ToggleWarpAI => "Toggle Warp AI", Self::ToggleSecretRedaction => "Toggle Secret Redaction", Self::CustomSecretRegexAdded => "Custom Secret Regex Added", Self::ToggleObfuscateSecret => "Toggle Obfuscate Secret", Self::CopySecret => "Copy Obfuscated Secret", Self::AutoGenerateMetadataSuccess => "Generate Metadata For Workflow Success", Self::AutoGenerateMetadataError => "Generate Metadata For Workflow Error", Self::UpdateSortingChoice => "Updated Sorting Choice", Self::UndoClose => "Undo Close", Self::OpenPromptEditor => "Prompt Editor Opened", Self::PromptEdited => "Prompt Edited", Self::PtyThroughput => "PTY Throughput", Self::DuplicateObject => "Duplicate Object", Self::ExportObject => "Export Object", Self::CommandFileRun => "Command File Run", Self::PageUpDownInEditorPressed => "Page Up/Down In Editor Pressed", Self::StartedSharingCurrentSession => "Started Sharing Current Session", Self::StoppedSharingCurrentSession => "Stopped Sharing Current Session", Self::JoinedSharedSession => "Joined Shared Session", Self::SharedSessionModalUpgradePressed => "Shared Session Modal Upgrade Pressed", Self::SharerCancelledGrantRole => "Sharer Cancelled Grant Role", Self::SharerGrantModalDontShowAgain => "Don't Show Sharer Grant Modal Again", Self::JumpToSharedSessionParticipant { .. } => "Jumped to Shared Session Participant", Self::CopiedSharedSessionLink { .. } => "Copied Shared Session Link", Self::WebSessionOpenedOnDesktop { .. } => "Web session opened on desktop", Self::WebCloudObjectOpenedOnDesktop { .. } => "Warp Drive object opened on desktop", Self::DriveSharingOnboardingBlockShown => "Warp Drive Sharing onboarding block shown", Self::UnsupportedShell => "Unsupported Shell", Self::SettingsImportInitiated => "Settings Import Initiated", Self::InviteTeammates => "Invited Teammates", Self::CopyObjectToClipboard => "Copy Object To Clipboard", Self::OpenAndWarpifyDockerSubshell => "OpenAndWarpifyDockerSubshell", Self::UpdateBlockFilterQuery => "Update Block Filter Query", Self::ToggleBlockFilterQuery => "Toggle Block Filter Query", Self::ToggleBlockFilterCaseSensitivity => "Toggle Block Filter Case Sensitivity", Self::ToggleBlockFilterRegex => "Toggle Block Filter Regex", Self::ToggleBlockFilterInvert => "Toggle Block Filter Invert", Self::BlockFilterToolbeltButtonClicked => "Block Filter Toolbelt Button Clicked", Self::ShowVimKeybindingsBanner => "Vim Keybindings Banner Displayed", Self::EnableVimKeybindingsFromBanner => "Vim Keybindings Enabled from Banner", Self::DismissVimKeybindingsBanner => "Vim Keybindings Banner Dismissed", Self::UpdateBlockFilterQueryContextLines => { "Update Block Filter Query With Context Lines" } Self::ToggleSnackbarInActivePane => "Toggle Sticky Command Header in Active Pane", Self::PaneDragInitiated => "Pane Drag Inititiated", Self::PaneDropped => "Pane Drag Ended", Self::AgentModeCreatedAIBlock => "AgentMode.CreatedAIBlock", Self::TeamCreated => "Team Created", Self::TeamJoined => "Team Joined", Self::TeamLeft => "Team Left", Self::TeamLinkCopied => "Team Link Copied", Self::RemovedUserFromTeam => "Removed user from team", Self::DeletedWorkflow => "Deleted Workflow", Self::DeletedNotebook => "Deleted Notebook", Self::ToggleApprovalsModal => "Toggle Approvals Modal", Self::ChangedInviteViewOption => "Changed invite view option", Self::SendEmailInvites => "Sent email invites", Self::TierLimitHit => "Tier Limit Hit", Self::SharedObjectLimitHitBannerViewPlansButtonClicked => { "Shared Object Limit Hit Banner View Plans Button Clicked" } Self::AgentModeUserAttemptedQueryAtRequestLimit => "AgentMode.QueryAttemptAtLImit", Self::AgentModeClickedEntrypoint => "AgentMode.ClickedEntrypoint", Self::AgentModeAttachedBlockContext => "AgentMode.AttachedContext", Self::ResourceUsageStats => "perf_metrics.resource_usage", Self::MemoryUsageStats => "perf_metrics.memory_usage", Self::MemoryUsageHigh => "perf_metrics.memory_usage_high", Self::AgentModeToggleAutoDetectionSetting => "AgentMode.ToggleAutoDetectionSetting", Self::AgentModePotentialAutoDetectionFalsePositive => { "AgentMode.PotentialAutoDetectionFalsePositive" } Self::AgentModeChangedInputType => "AgentMode.ChangedInputType", Self::AgentModePrediction => "Agent Predict", // Agent Mode Query Suggestions is the legacy name for Prompt Suggestions - we avoid renaming // the event to avoid breaking historical telemetry data. Self::PromptSuggestionShown => "Agent Mode Query Suggestions Banner Shown", Self::SuggestedCodeDiffBannerShown => "Suggested Code Diff Banner Shown", Self::SuggestedCodeDiffFailed => "Suggested Code Diff Failed", Self::PromptSuggestionAccepted => "Agent Mode Query Suggestion Accepted", Self::StaticPromptSuggestionsBannerShown => "Static Prompt Suggestions Banner Shown", Self::StaticPromptSuggestionAccepted => "Static Prompt Suggestion Accepted", Self::ZeroStatePromptSuggestionUsed => "Zero State Prompt Suggestion Used", Self::TogglePromptSuggestionsSetting => "Toggle Agent Mode Query Suggestions Setting", Self::UnitTestSuggestionShown { .. } => "Suggested Prompt Shown", Self::UnitTestSuggestionAccepted { .. } => "Suggested Prompt Accepted", Self::UnitTestSuggestionCancelled { .. } => "Suggested Prompt Cancelled", Self::ToggleCodeSuggestionsSetting => "Toggle Code Suggestions Setting", Self::ToggleNaturalLanguageAutosuggestionsSetting => { "Toggle Natural Language Autosuggestions Setting" } Self::ToggleSharedBlockTitleGenerationSetting => "Toggle SharedBlock Title Generation", Self::ToggleGitOperationsAutogenSetting => "Toggle Git Operations Autogen Setting", Self::AgentModeCodeSuggestionEditedByUser => "AgentMode.Code.SuggestedCodeEditedByUser", Self::AgentModeCodeFilesNavigated => "AgentMode.Code.FilesNavigated", Self::AgentModeCodeDiffHunksNavigated => "AgentMode.Code.DiffHunksNavigated", Self::ToggleIntelligentAutosuggestionsSetting => { "Toggle Intelligent Autosuggestions Setting" } Self::ToggleVoiceInputSetting => "Toggle Voice Input Setting", Self::EnvVarCollectionInvoked => "Invoked Environment Variables", Self::EnvVarWorkflowParameterization => { "Parameterized Workflow With Environment Variables" } Self::CompletedSettingsImport => "Completed Settings Import", Self::SettingsImportConfigFocused => "Focused Config in Settings Import", Self::SettingsImportConfigParsed => "Parsed Config in Settings Import", Self::SettingsImportResetButtonClicked => { "Clicked Reset to Defaults Button in Settings Import" } Self::ITermMultipleHotkeys => "ITerm Profile has Multiple Hotkeys", Self::ToggleWorkspaceDecorationVisibility => "Toggled Tab Bar Visibility", Self::UpdateAltScreenPaddingMode => "Updated Alt Screen Padding Mode", Self::AddTabWithShell => "Add Tab With Shell", Self::AgentModeSurfacedCitations => "AgentMode.SurfacedCitations", Self::AgentModeOpenedCitation => "AgentMode.OpenedCitation", Self::OpenedSharingDialog => "Opened Sharing Dialog", Self::ToggleGlobalAI => "Toggle Global AI Enablement", Self::ToggleActiveAI => "Toggle Active AI Enablement", Self::ToggleLigatureRendering => "Toggle Ligature Rendering", Self::WorkflowAliasAdded => "Added Workflow Alias", Self::WorkflowAliasRemoved => "Removed Workflow Alias", Self::WorkflowAliasArgumentEdited => "Edited Workflow Alias Argument", Self::WorkflowAliasEnvVarsAttached => "Attached Workflow Alias Environment Variables", Self::ToggledAgentModeAutoexecuteReadonlyCommandsSetting => { "AIAutonomy.ToggledAutoexecuteReadonlyCommandsSetting" } Self::ChangedAgentModeCodingPermissions => { "AIAutonomy.ChangedAgentModeCodingPermissions" } Self::AutoexecutedAgentModeRequestedCommand => { "AIAutonomy.AutoexecutedRequestedCommand" } Self::AgenticOnboardingBlockSelected => "AgenticOnboarding.BlockSelected", Self::RemoteServerBinaryCheck => "RemoteServer.BinaryCheck", Self::RemoteServerInstallation => "RemoteServer.Installation", Self::RemoteServerInitialization => "RemoteServer.Initialization", Self::RemoteServerDisconnection => "RemoteServer.Disconnection", Self::RemoteServerClientRequestError => "RemoteServer.ClientRequestError", Self::RemoteServerMessageDecodingError => "RemoteServer.MessageDecodingError", Self::RemoteServerSetupDuration => "RemoteServer.SetupDuration", #[cfg(windows)] Self::WSLRegistryError => "WSL Distribution Registry Error", #[cfg(windows)] Self::AutoupdateUnableToCloseApplications => { "Windows Autoupdate: Setup Unable to Close Applications" } #[cfg(windows)] Self::AutoupdateFileInUse => "Windows Autoupdate: File In Use Error", #[cfg(windows)] Self::AutoupdateMutexTimeout => "Windows Autoupdate: Mutex Timeout", #[cfg(windows)] Self::AutoupdateForcekillFailed => "Windows Autoupdate: Forcekill Failed", Self::ToggleCodebaseContext => "Toggle Agent Mode Codebase Context", Self::ToggleAutoIndexing => "Toggle Codebase Context Autoindexing", Self::ActiveIndexedReposChanged => "Active Indexed Repos Changed", Self::AttachedImagesToAgentModeQuery => "AgentMode.AttachedImages", Self::AgentModeRatedResponse => "AgentMode.RatedResponse", Self::ExecutedWarpDrivePrompt => "AgentMode.ExecutedWarpDrivePrompt", Self::ImageReceived => "Image Received", Self::FileExceededContextLimit => "AgentMode.Code.FileExceededContextLimit", Self::AgentModeError => "AgentMode.Error", Self::AgentModeRequestRetrySucceeded => "AgentMode.RequestRetrySucceeded", Self::GrepToolSucceeded => "AgentMode.Grep.Succeeded", Self::GrepToolFailed => "AgentMode.Grep.Failed", Self::FileGlobToolSucceeded => "AgentMode.FileGlob.Succeeded", Self::FileGlobToolFailed { .. } => "AgentMode.FileGlob.Failed", Self::ShellTerminatedPrematurely { .. } => "Shell Terminated Prematurely", Self::FullEmbedCodebaseContextSearchSuccess { .. } => { "AgentMode.FullEmbedCodebaseContextSearch.Success" } Self::FullEmbedCodebaseContextSearchFailed { .. } => { "AgentMode.FullEmbedCodebaseContextSearch.Failed" } Self::ShowedSuggestedAgentModeWorkflowChip => "AgentMode.ShowedSuggestedWorkflowChip", Self::AISuggestedAgentModeWorkflowAdded => { "AgentMode.AISuggestedAgentModeWorkflowAdded" } Self::ShowedSuggestedAgentModeWorkflowModal => { "AgentMode.ShowedSuggestedAgentModeWorkflowModal" } Self::SearchCodebaseRequested { .. } => "AgentMode.SearchCodebase.Requested", Self::SearchCodebaseRepoUnavailable { .. } => { "AgentMode.SearchCodebase.RepoUnavailable" } Self::InputUXModeChanged { .. } => "Input.InputUXModeChanged", Self::ContextChipInteracted { .. } => "Input.ContextChipInteracted", Self::VoiceInputUsed { .. } => "Input.VoiceInputUsed", Self::AtMenuInteracted { .. } => "Input.AtMenuInteracted", Self::UserMenuUpgradeClicked => "User Menu Upgrade Clicked", Self::TabCloseButtonPositionUpdated { .. } => "Update Tab Close Button Position", Self::ExpandedCodeSuggestions { .. } => "Expanded Code Suggestion", Self::AIExecutionProfileCreated => "AI Execution Profile Created", Self::AIExecutionProfileDeleted => "AI Execution Profile Deleted", Self::AIExecutionProfileSettingUpdated { .. } => { "AI Execution Profile: Setting Updated" } Self::AIExecutionProfileAddedToAllowlist { .. } => { "AI Execution Profile: Added To Allowlist" } Self::AIExecutionProfileAddedToDenylist { .. } => { "AI Execution Profile: Added To Denylist" } Self::AIExecutionProfileRemovedFromAllowlist { .. } => { "AI Execution Profile: Removed From Allowlist" } Self::AIExecutionProfileRemovedFromDenylist { .. } => { "AI Execution Profile: Removed From Denylist" } Self::AIExecutionProfileModelSelected { .. } => "AI Execution Profile: Model Selected", Self::AIInputNotSent { .. } => "AI Input Not Sent", Self::OpenSlashMenu { .. } => "Open Slash Menu", Self::SlashCommandAccepted { .. } => "Slash Command Accepted", Self::AgentModeSetupBannerAccepted => "Agent Mode Setup Banner Accepted", Self::AgentModeSetupBannerDismissed => "Agent Mode Setup Banner Dismissed", Self::AgentModeSetupProjectScopedRulesAction { .. } => { "Agent Mode Setup Project Scoped Rules Action" } Self::AgentModeSetupCodebaseContextAction { .. } => { "Agent Mode.Setup Codebase Context Action" } Self::AgentModeSetupCreateEnvironmentAction { .. } => { "AgentMode.SetupCreateEnvironmentAction" } Self::InputBufferSubmitted => "AgentMode.NaturalLanguageDetection.InputBufferSubmitted", Self::RecentMenuItemSelected { .. } => "Recent Menu Item Selected", Self::OpenRepoFolderSubmitted { .. } => "Open Repo Folder Submitted", Self::OutOfCreditsBannerClosed => "revenue.OutOfCreditsBannerClosed", Self::AutoReloadModalClosed => "revenue.AutoReloadModalClosed", Self::AutoReloadToggledFromBillingSettings => { "revenue.AutoReloadToggledFromBillingSettings" } Self::CLISubagentControlStateChanged { .. } => "CLI Subagent Control State Changed", Self::CLISubagentResponsesToggled { .. } => "CLI Subagent Responses Toggled", Self::CLISubagentInputDismissed { .. } => "CLI Subagent Input Dismissed", Self::CLISubagentActionExecuted { .. } => "CLI Subagent Action Executed", Self::CLISubagentActionRejected { .. } => "CLI Subagent Action Rejected", Self::AgentManagementViewToggled { .. } => "Agent Management View Toggled", Self::AgentManagementViewOpenedSession => "Agent Management View Opened Session", Self::AgentManagementViewCopiedSessionLink => { "Agent Management View Copied Session Link" } Self::DetectedIsolationPlatform { .. } => "Isolation.DetectedIsolationPlatform", Self::AgentTipShown => "AgentTip Shown", Self::AgentTipClicked => "AgentTip Clicked", Self::ToggleShowAgentTips => "Toggle Show Agent Tips", Self::AgentExitedShellProcess => "AgentMode.ExitedShellProcess", Self::CLIAgentToolbarVoiceInputUsed { .. } => "CLIAgentFooter.VoiceInputUsed", Self::CLIAgentToolbarImageAttached { .. } => "CLIAgentFooter.ImageAttached", Self::CLIAgentToolbarShown { .. } => "CLIAgentFooter.Shown", Self::CLIAgentPluginChipClicked { .. } => "CLIAgentPlugin.ChipClicked", Self::CLIAgentPluginChipDismissed { .. } => "CLIAgentPlugin.ChipDismissed", Self::CLIAgentPluginOperationSucceeded { .. } => "CLIAgentPlugin.OperationSucceeded", Self::CLIAgentPluginOperationFailed { .. } => "CLIAgentPlugin.OperationFailed", Self::CLIAgentPluginDetected { .. } => "CLIAgentPlugin.Detected", Self::AgentNotificationShown { .. } => "AgentNotification.Shown", Self::CLIAgentRichInputOpened { .. } => "CLIAgentRichInput.Opened", Self::CLIAgentRichInputClosed { .. } => "CLIAgentRichInput.Closed", Self::CLIAgentRichInputSubmitted { .. } => "CLIAgentRichInput.Submitted", Self::ToggleCLIAgentToolbarSetting { .. } => "CLIAgentFooter.SettingToggled", Self::ToggleUseAgentToolbarSetting { .. } => "UseAgentToolbar.SettingToggled", Self::CodexModalOpened => "CodexModal.Opened", Self::CodexModalUseCodexClicked => "CodexModal.UseCodexClicked", Self::LinearIssueLinkOpened => "Linear.IssueLinkOpened", Self::CloudAgentCapacityModalOpened => "AmbientAgent.ConcurrencyModal.Opened", Self::CloudAgentCapacityModalDismissed => "AmbientAgent.ConcurrencyModal.Dismissed", Self::CloudAgentCapacityModalUpgradeClicked => { "AmbientAgent.ConcurrencyModal.UpgradeClicked" } Self::ComputerUseApproved => "ComputerUse.Approved", Self::ComputerUseCancelled => "ComputerUse.Cancelled", Self::FreeTierLimitHitInterstitialDisplayed { .. } => { "FreeTierLimitHitInterstitial.Displayed" } Self::FreeTierLimitHitInterstitialUpgradeButtonClicked { .. } => { "FreeTierLimitHitInterstitial.UpgradeButtonClicked" } Self::FreeTierLimitHitInterstitialClosed { .. } => { "FreeTierLimitHitInterstitial.Closed" } } } fn description(&self) -> &'static str { match self { Self::AISuggestedAgentModeWorkflowAdded => { "User created an AI suggested Agent Mode workflow" } Self::ShowedSuggestedAgentModeWorkflowModal => { "Showed the suggested Agent Mode workflow modal to the user" } Self::RepoOutlineConstructionSuccess => { "Repository outline built successfully for providing codebase context" } Self::RepoOutlineConstructionFailed => "Repository outline built failed", Self::AutosuggestionInserted => "Accepted autosuggestion", Self::BlockCompleted => "Created Block", Self::AgentModeContinueConversationButtonClicked => { "User clicked the Continue Conversation button in a block footer" } Self::AgentModeRewindDialogOpened { .. } => { "User opened the rewind confirmation dialog" } Self::AgentModeRewindExecuted { .. } => { "User executed a rewind to a previous conversation state" } Self::BlockCompletedOnDogfoodOnly => { "Completed a block, with extra information for dogfood only" } Self::InitiateAnonymousUserSignup => "An anonymous user initiated the sign up flow", Self::AnonymousUserExpirationLockout => { "An anonymous user opened Warp after their conversion deadline and was locked out" } Self::AnonymousUserLinkedFromBrowser => { "Received an auth payload from anonymous user after linking in browser" } Self::AnonymousUserAttemptLoginGatedFeature => { "Anonymous user attempted to access a login-gated feature" } Self::AnonymousUserHitCloudObjectLimit => { "Anonymous user attempted to create a cloud object past their personal object limit" } Self::BackgroundBlockStarted => { "Warp created a background-output Block (whenever a processes has been backgrounded and yields some output)" } Self::BaselineCommandLatency => "Command execution time", Self::SessionCreation => "Created a tab", Self::MCPServerCollectionPaneOpened { .. } => "MCP Server Collection Pane Opened", Self::MCPServerAdded { .. } => "MCP Server Added", Self::MCPTemplateCreated { .. } => "MCP Template Created", Self::MCPTemplateInstalled { .. } => "MCP Template Installed", Self::MCPTemplateShared => "MCP Template Shared", Self::MCPServerSpawned { .. } => "MCP Server Spawned", Self::MCPToolCallAccepted { .. } => "MCP Tool Call Accepted", Self::KnowledgePaneOpened { .. } => "Knowledge Pane Opened", #[cfg(feature = "local_fs")] Self::CodePaneOpened { .. } => "Opened the code editor pane from various sources", #[cfg(feature = "local_fs")] Self::CodePanelsFileOpened { .. } => { "Opened a file from code review, project explorer, or global search" } #[cfg(feature = "local_fs")] Self::PreviewPanePromoted => "Promoted a preview code tab to a normal tab", Self::AISuggestedRuleAdded { .. } => { "Clicked the Add Suggested Rule button in the AI blocklist" } Self::AISuggestedRuleEdited { .. } => { "Clicked the Edit Suggested Rule button in the AI blocklist" } Self::AISuggestedRuleContentChanged { .. } => { "Content changed by the user in the suggested rule dialog" } Self::ToggleSettingsSync => "Toggle Settings Sync", Self::Login => "Login is successful", Self::LoginLaterButtonClicked => "Clicked \"Login later\" button", Self::LoginLaterConfirmationButtonClicked => { "Clicked \"Yes, skip login\" confirmation button" } Self::OpenSuggestionsMenu => "Opened a suggestion menus, such as with up arrow or tab", Self::ConfirmSuggestion => "Accepted tab completion suggestion", Self::OpenContextMenu => { "Opened context menu (such as right clicking, clicking on ellipses in the top right of a Block, etc.)" } Self::ContextMenuCopy => "Clicked \"Copy\" in context menu", Self::ContextMenuOpenShareModal => "Opened \"Share\" modal via context menu", Self::ContextMenuFindWithinBlocks => "Clicked \"find within blocks\" in context menu", Self::ContextMenuCopyPrompt => "Clicked \"Copy Prompt\" in context menu", Self::ContextMenuToggleGitPromptDirtyIndicator => { "Toggled indicator of dirty git prompt" } Self::ContextMenuInsertSelectedText => "Clicked \"insert into input\" in context menu", Self::ContextMenuCopySelectedText => "Clicked \"Copy selected text\" in context menu", Self::OpenPromptEditor => "Opened the prompt editor", Self::PromptEdited => "Edited the prompt using the built-in prompt editor", Self::ReinputCommands => "Clicked \"reinput commands\" in context menu", Self::JumpToPreviousCommand => "Jumped to a previous command", Self::CopyBlockSharingLink => "Clicked \"Share block...\" in context menu", Self::GenerateBlockSharingLink => "Generated Block sharing link", Self::BlockSelection => "Selected Block", Self::BootstrappingSlow => "Slow bootstrap on session startup", Self::BootstrappingSlowContents => { "Contents of the bootstrap block if bootstrapping is slow" } Self::SessionAbandonedBeforeBootstrap => { "Abandoned session before the bootstrapping completes" } Self::BootstrappingSucceeded => "Successful bootstrap for session", Self::TabSingleResultAutocompletion => { "Accepted tab completion and inserted into Input Editor" } Self::EditorUnhandledModifierKey => { "Used modifier keybinding keystroke which is not currently supported" } Self::CopyInviteLink => "Clicked \"Copy Link\" on Referral Modal", Self::OpenThemeChooser => { "Opened theme chooser (list of different themes and visualizations of those themes)" } Self::ThemeSelection => "Selected theme", Self::AppIconSelection => "Selected app icon", Self::CursorDisplayType => "Selected cursor type", Self::OpenThemeCreatorModal => { "Opened theme creator modal (modal to create a new theme)" } Self::CreateCustomTheme => "Created a custom theme using the built-in theme creator", Self::DeleteCustomTheme => "Deleted a custom theme using the built-in theme creator", Self::SplitPane => "Split tab into multiple panes", Self::UnableToAutoUpdateToNewVersion => { "Update available but not authorized to install" } Self::AutoupdateRelaunchAttempt => { "Attempted to relaunch the app after installing an update" } Self::SkipOnboardingSurvey => "Skipped onboarding survey as a whole", Self::ToggleRestoreSession => { "Toggled session restoration (\"Restore windows, tabs, panes, on startup\")" } Self::DatabaseStartUpError => "Failed to initialize sqlite upon startup", Self::DatabaseReadError => { "Database read error when trying to get app state for session restoration" } Self::DatabaseWriteError => { "Database write error when trying to write app state for session restoration" } Self::AppStartup => "App is launched", Self::LoggedOutStartup => "Started Warp in the logged-out / signed-out state", Self::DownloadSource => { "Whether the Warp was installed from the home page or through homebrew" } Self::SSHBootstrapAttempt => "Attempted bootstrapping for an SSH session", Self::SSHControlMasterError => { "Encountered a ControlMaster error during an SSH session" } Self::KeybindingChanged => "Edited a custom keybinding", Self::KeybindingResetToDefault => "Reset a custom keybinding to its default", Self::KeybindingRemoved => "Removed / cleared a keybinding", Self::FeaturesPageAction => "Changed settings in Features Page", Self::WorkflowExecuted => "Executed workflow", Self::WorkflowSelected => "Selected workflow and populated into the Input Editor", Self::OpenWorkflowSearch => "Opened workflows search in command search pane", Self::OpenQuakeModeWindow => { "Toggled quake mode window when previously hidden or closed" } Self::OpenWelcomeTips => "Opened welcome tips in app", Self::CompleteWelcomeTipFeature => "Completed all welcome tips items", Self::DismissWelcomeTips => "Dismissed Welcome tips", Self::ShowNotificationsDiscoveryBanner => { "Showed notifications discovery banner in the block list" } Self::NotificationsDiscoveryBannerAction => { "Showed banner introducing the notifications feature" } Self::ShowNotificationsErrorBanner => "Showed error banner for notifications feature", Self::NotificationsErrorBannerAction => "Showed error banner for notifications feature", Self::NotificationPermissionsRequested => { "Requested permission for desktop notification permissions" } Self::NotificationsRequestPermissionsOutcome => { "Recorded outcome of attempting to request desktop notification permissions" } Self::NotificationSent => "Sent desktop notification", Self::NotificationFailedToSend => "Failed to send desktop notification", Self::NotificationClicked => "Clicked desktop notification sent from Warp", Self::ToggleShowAgentTips => "Toggled the Show Agent Tips setting in AI settings", Self::ToggleFindOption => "Changed settings in Find Toggle", Self::SignUpButtonClicked => "Clicked \"Sign Up\" button", Self::LoginButtonClicked => "Clicked on \"Log in\" button", Self::OpenNewSessionFromFilePath => { "Dragged a file, folder, etc. into Warp to start a session" } Self::OpenTeamFromURI => { "Showed settings view of their newly joined team within the app" } Self::SelectCommandPaletteOption => "Selected option from command palette (i.e. CMD-P)", Self::PaletteSearchOpened => "Opened the palette", Self::PaletteSearchResultAccepted => "Accepted a command palette search result", Self::PaletteSearchExited => "Exited command palette search without accepting a result", Self::SelectNavigationPaletteItem => { "Selected session from the Session Navigation Palette (search across panes, tabs, and windows)" } Self::AuthCommonQuestionClicked => "Clicked on \"Common Question\" when logging in", Self::AuthToggleFAQ => "Toggled FAQ Page when logging in", Self::OpenAuthPrivacySettings => "Privacy settings are open during sign-in", Self::TabRenamed => "Changed tab title", Self::MoveActiveTab => "Move active tab left or right", Self::MoveTab => "Move tab left or right", Self::DragAndDropTab => "Tab dragged and dropped", Self::TabOperations => { "Took operation on a tab: change color, close tab, close adjacent tabs, etc." } Self::EditedInputBeforePrecmd => "Input edited before precmd hook completes", Self::TriedToExecuteBeforePrecmd => { "Attempted to execute command before precmd, a shell stage that has metadata on a command such as ssh, prompt info, etc." } Self::ThinStrokesSettingChanged => { "Changed thin strokes setting in settings -> Appearance" } Self::BookmarkBlockToggled => "Bookmarked or unbookmarked Block", Self::JumpToBookmark => "Jumped to bookmarked Block", Self::JumpToBottomofBlockButtonClicked => { "Used the button to jump to the bottom of a Block" } Self::ToggleJumpToBottomofBlockButton => { "Enabled or disabled the Jump to Bottom of Block Button" } Self::ToggleShowBlockDividers => "Enabled or disabled the Show Block Dividers Button", Self::OpenLink => "Opened a highlighted link within input or output", Self::OpenChangelogLink => "Opened the changelog link within the App", Self::ShowInFileExplorer => "Opened a file in Finder by using \"Show in Finder\"", Self::CommandXRayTriggered => { "Triggered Command X-Ray (hovering over a command for explanation)" } Self::OpenLaunchConfigSaveModal => "Opened save launch configuration modal", Self::SaveLaunchConfig => { "Saved current launch configuration of windows, tabs, and panes" } Self::OpenLaunchConfigFile => { "Opened the launch config YAML file from modal once saved successfully" } Self::OpenLaunchConfig => "Opened launch config for a session", Self::TeamCreated => "Created a Warp Drive team", Self::TeamJoined => "Joined a Warp Drive team", Self::TeamLeft => "Left a Warp Drive team", Self::TeamLinkCopied => "Copied a Warp Drive team link", Self::RemovedUserFromTeam => "Remove user from Warp Drive team", Self::DeletedWorkflow => "Deleted workflow from Warp Drive team", Self::DeletedNotebook => "Deleted notebook from Warp Drive team", Self::ToggleApprovalsModal => "Opened or closed teams modal", Self::ChangedInviteViewOption => "Toggled between link and invite for invite", Self::SendEmailInvites => "Sent email invites for Warp Drive team", Self::CommandCorrection => "Accepted command correction", Self::SetLineHeight => "Set line height through Settings -> Appearance", Self::ResourceCenterOpened => "Opened Resource Center pane", Self::ResourceCenterTipsCompleted => "Completed resource center tips", Self::ResourceCenterTipsSkipped => "Skipped welcome tips for new users", Self::KeybindingsPageOpened => "Opened the keybinding page within the resource center", Self::CommandSearchOpened => "Opened command search (universal search panel to search)", Self::CommandSearchExited => { "Exited command search (universal search panel to search) without accepting a result" } Self::CommandSearchResultAccepted => "Accepted command search result", Self::CommandSearchFilterChanged => "Changed command search filter", Self::CommandSearchAsyncQueryCompleted => { "Finished searching for a command in the background" } Self::AICommandSearchOpened => { "Opened the modal for AI Command Search, where you can use natural language to search for commands" } Self::OpenNotebook => "Opened a notebook", Self::EditNotebook => "Edited a notebook", Self::NotebookAction => { "Took an action on a notebook: edit, delete, modified font size, etc." } Self::OpenedAltScreenFind => "Opened the Find bar in the Alt Screen", Self::UserInitiatedClose => "Attempted to either quit the app or close a window", Self::QuitModalShown => { "Showed an alert modal to warn the user about closing the app/window with a running process" } Self::QuitModalCancel => "`Cancel` button on the alert modal was pressed", Self::QuitModalDisabled => { "The quit modal dialog has been disabled and will not popup when a user closes Warp while a session is running" } Self::UserInitiatedLogOut => { "Confirms a user has explicitly logged out of the application" } Self::LogOutModalShown => "When the log out modal is displayed", Self::LogOutModalCancel => "Escaped the log out flow by canceling the log out modal", Self::SetOpacity => { "Changed the opacity (window transparency) from the `Settings -> Appearance` dialog" } Self::SetBlurRadius => { "Changed the blur radius from the `Settings -> Appearance` dialog" } Self::ToggleDimInactivePanes => { "Whether the dim inactive panes feature has been toggled" } Self::InputModeChanged => { "Changed the Input Editor Mode (Pinned to Bottom, Pinned to Top, Classic / Waterfall Mode)" } Self::PtySpawned => { "Tracks the manner by which we create a new shell process (new codepath vs. old codepath). Used to ensure nothing breaks as we change parts of our infrastructure." } Self::InitialWorkingDirectoryConfigurationChanged => { "Replaced the default working directory with a different path" } Self::OpenedWarpAI => "Activated Warp AI", Self::WarpAIRequestIssued => "Issued a question to Warp AI", Self::WarpAIAction => "Executed a Warp AI action: Restart, Copy, Insert into terminal", Self::UsedWarpAIPreparedPrompt => { "Used one of the Warp-provided prompts, like \"Show examples\"" } Self::WarpAICharacterLimitExceeded => { "Attempted to ask a question longer than 1k chars to Warp AI" } Self::OpenInputContextMenu => "Opened the Input Editor's context menu", Self::InputCutSelectedText => { "Cut the highlighted text via the Input Editor's context menu (right clicking the buffer)" } Self::InputCopySelectedText => "Copied selected text from Input Editor", Self::InputSelectAll => { "Selected all the text in the Input Editor via its context menu (right clicking the buffer)" } Self::InputPaste => { "Pasted text into the Input Editor's via its context menu (right clicking the buffer)" } Self::InputCommandSearch => { "Opened Command Search via the Input Editor's context menu (right clicking the buffer)" } Self::InputAICommandSearch => { "Opened AI Command Search via the Input Editor's context menu (right clicking the buffer)" } Self::InputAskWarpAI => "Clicked \"Ask Warp AI\" from the Input Editor's context menu", Self::SaveAsWorkflowModal => { "Opened the modal to create a new workflow using a Block's context--command, etc." } Self::ExperimentTriggered => "Client assigned to A/B test", Self::ToggleSyncAllPanesInAllTabs => { "Enable the synchronization of the Input Editor's buffer to all the panes in all the tabs" } Self::ToggleSyncAllPanesInTab => { "Enable the synchronization of the Input Editor's buffer to all the panes in the current tab" } Self::ToggleSameLinePrompt => "Toggled on/off same line prompt", Self::ToggleNewWindowsAtCustomSize => { "Whether the new windows at custom size feature has been toggled" } Self::ToggleFocusPaneOnHover => { "Toggled on/off focus pane on hover feature, which causes panes to automatically focus when hovering over them" } Self::SetNewWindowsAtCustomSize => { "Set new windows at custom size through Settings -> Appearance" } Self::DisableInputSync => { "Disabled / turn off the Input Synchronization (across editors)" } Self::ToggleTabIndicators => { "Enabled or disabled the tab indicators (failed command, etc.)" } Self::TogglePreserveActiveTabColor => { "Enabled or disabled preserving the active tab color" } Self::ShowSubshellBanner => { "Displayed the banner asking whether Warp should Warpify the current session via Warp's subshell wrapper" } Self::SshTmuxWarpifyBannerDisplayed => { "Displayed the banner asking whether Warp should Warpify the current SSH session via Warp's SSH Wrapper" } Self::DeclineSubshellBootstrap => { "Developer declined the Warp banner to Warpify the current session" } Self::TriggerSubshellBootstrap => { "Attempted to Warpify the current session via Warp's subshell wrapper" } Self::AddDenylistedSubshellCommand => { "Explicitly prevent a command from being Warpified via Warp's subshell wrapper" } Self::RemoveDenylistedSubshellCommand => { "Removed a command from the list of commands to IGNORE when trying to Warpify via Warp's subshell wrapper" } Self::AddAddedSubshellCommand => { "Added a command to be automatically Warpified via Warp's subshell wrapper" } Self::RemoveAddedSubshellCommand => { "Removed a command from the list of commands to automatically Warpify via Warp's subshell wrapper" } Self::ReceivedSubshellRcFileDcs => "Spawned a subshell to be automatically Warpified", Self::ToggleSshTmuxWrapper => { "Changed the setting for SSH sessions to prompt for Tmux Wrapper" } Self::ToggleSshWarpification => "Changed the setting for SSH sessions to be warified", Self::SetSshExtensionInstallMode => { "Changed the SSH extension install mode (always ask / always allow / always skip)" } Self::SshRemoteServerChoiceDoNotAskAgainToggled => { "Toggled the 'Don't ask me this again' checkbox on the SSH remote-server choice block" } Self::AddDenylistedSshTmuxWrapperHost => { "Added a SSH host to the denylist for prompting for Tmux Wrapper" } Self::RemoveDenylistedSshTmuxWrapperHost => { "Removed an SSH host from the denylist from prompting for Tmux Wrapper" } Self::AgentModeRatedResponse => "User rated an Agent Mode response", Self::SshInteractiveSessionDetected => "An interactive SSH session was detected", Self::SshTmuxWarpifyBlockAccepted => "User accepted an ssh tmux warpify block", Self::SshTmuxWarpifyBlockDismissed => "User dismissed an ssh tmux warpify block", Self::WarpifyFooterShown => { "Displayed the warpify footer for a detected subshell or SSH session" } Self::AgentToolbarDismissed => "User dismissed the use-agent toolbar", Self::WarpifyFooterAcceptedWarpify => "User clicked Warpify in the warpify footer", Self::SshTmuxWarpificationSuccess => "Ssh tmux warpification succeeded", Self::SshTmuxWarpificationErrorBlock => "Ssh tmux warpification errored out", Self::SshInstallTmuxBlockDisplayed => "Displayed an ssh install tmux block", Self::SshInstallTmuxBlockAccepted => "User accepted an ssh install tmux block", Self::SshInstallTmuxBlockDismissed => "User dismissed an ssh install tmux block", Self::ShowAliasExpansionBanner => { "Displayed the banner asking whether Warp should automatically expand aliases within the Input Editor" } Self::EnableAliasExpansionFromBanner => { "Enabled automatic alias expansion within the Input Editor from the banner" } Self::DismissAliasExpansionBanner => { "Dismissed the banner to enable automatic alias expansion within the Input Editor" } Self::ShowVimKeybindingsBanner => { "Displayed the banner asking whether Warp should enable Vim keybindings in the Input Editor" } Self::EnableVimKeybindingsFromBanner => { "Enabled Vim keybindings in the Input Editor from the banner" } Self::DismissVimKeybindingsBanner => { "Dismissed the banner to enable Vim keybindings in the Input Editor" } Self::InitiateReauth => "Started the flow to re-authenticate the client", Self::NeedsReauth => "User needs to re-authenticate", Self::WarpDriveOpened => "Opened Warp Drive panel", Self::ToggleWarpAI => { "Toggled Warp AI--an AI assistant to help you debug errors, look up forgotten commands and more" } Self::ToggleSecretRedaction => { "Toggled on/off the setting for Secret Redaction - attempts to redact secrets and sensitive information" } Self::CustomSecretRegexAdded => "Custom Secret Regex Added", Self::ToggleObfuscateSecret => "Revealed or hid a secret", Self::CopySecret => "Copied a secret's obfuscated contents to clipboard", Self::AutoGenerateMetadataSuccess => { "Successfully generated metadata for a workflow using Warp AI" } Self::AutoGenerateMetadataError => { "Failed to generate metadata for a workflow using Warp AI" } Self::UpdateSortingChoice => "Modified the sorting scheme for Warp Drive objects", Self::UndoClose => "Re-opened a closed tab or window (undo closing a tab or window)", Self::PtyThroughput => "A sample of the max PTY throughput in bytes/sec", Self::DuplicateObject => "Cloned a Warp Drive object", Self::ExportObject => "Exported a Warp Drive object", Self::CommandFileRun => { "Opened a .cmd or unix executable file and ran it directly in Warp" } Self::PageUpDownInEditorPressed => { "Pressed `PAGE-UP` or `PAGE-DOWN` within the Input Editor" } Self::StartedSharingCurrentSession => "Started sharing the current session", Self::StoppedSharingCurrentSession => "Halted sharing the current session", Self::JoinedSharedSession => { "When you join another instance of Warp using shared sessions" } Self::SharedSessionModalUpgradePressed => { "Pressed upgrade after reaching max session sharing limit" } Self::SharerCancelledGrantRole => { "When you cancel granting a role to a shared session participant" } Self::SharerGrantModalDontShowAgain => { "When you check don't show again on the confirmation modal for granting a role" } Self::JumpToSharedSessionParticipant => { "Clicked on a shared session participant avatar to jump to their location in the session" } Self::CopiedSharedSessionLink => "Copied a shared session link", Self::WebSessionOpenedOnDesktop => { "Shared session viewed on the web was opened on the desktop" } Self::WebCloudObjectOpenedOnDesktop => { "Warp Drive object on the web was opened on the desktop" } Self::DriveSharingOnboardingBlockShown => { "Showed onboarding block for Warp Drive sharing" } Self::UnsupportedShell => "Booted Warp with a shell that isn't supported", Self::LogOut => "Logged out of the Warp client", Self::SettingsImportInitiated => "Started the import settings flow for new users", Self::InviteTeammates => "Sent emails to invite teammates to join Warp Drive team", Self::CopyObjectToClipboard => "Copied an object to the user's keyboard", Self::OpenAndWarpifyDockerSubshell => { "Warpifying a docker subshell from using the docker extension" } Self::UpdateBlockFilterQuery => "When a new filter is applied to a block", Self::UpdateBlockFilterQueryContextLines => { "When the number of context lines for a block filter query is updated" } Self::ToggleBlockFilterQuery => "Toggled on/off a block filter query", Self::ToggleBlockFilterCaseSensitivity => { "Toggled on/off case sensitivity within the block filter editor" } Self::ToggleBlockFilterRegex => "Toggled on/off regex within the block filter editor", Self::ToggleBlockFilterInvert => "Toggled on/off invert within the block filter editor", Self::BlockFilterToolbeltButtonClicked => { "Clicked the block filter icon in the top-right of a block" } Self::ToggleSnackbarInActivePane => { "Expanded or collapsed the sticky command header in the active pane" } Self::PaneDragInitiated => "Initiated dragging a pane via the header", Self::PaneDropped => "Ended dragging a pane via the pane header", Self::AgentModeCreatedAIBlock => "Created an AI block in agent mode", Self::TierLimitHit => "User hit the tier limit for a feature", Self::SharedObjectLimitHitBannerViewPlansButtonClicked => { "Clicked the 'View Plans' button on the persistent drive banner" } Self::AgentModeUserAttemptedQueryAtRequestLimit => { "Tried to send an Agent Mode query but they already reached the query limit" } Self::AgentModeClickedEntrypoint => "Clicked on an Agent Mode entrypoint", Self::AgentModeAttachedBlockContext => { "Attached block as context to an Agent Mode query" } Self::ResourceUsageStats => "Periodic report on application resource usage statistics", Self::MemoryUsageStats => "Periodic report on application memory usage statistics", Self::MemoryUsageHigh => { "Total application memory usage exceeded a significant threshold" } Self::AgentModeToggleAutoDetectionSetting => { "Toggled the setting that enables or disables natural language auto-detection in the input. " } Self::AgentModePotentialAutoDetectionFalsePositive => { "Manually toggled input to shell mode after input was auto-detected as natural language." } Self::AgentModeChangedInputType => { "The input type was changed from shell -> AI or AI -> shell" } Self::AgentModePrediction => "Completed an Agent Predict prediction", Self::ToggleIntelligentAutosuggestionsSetting => { "Toggled on/off the intelligent autosuggestions setting" } Self::TogglePromptSuggestionsSetting => "Toggled on/off the prompt suggestions setting", Self::ToggleCodeSuggestionsSetting => "Toggled on/off the code suggestions setting", Self::ToggleNaturalLanguageAutosuggestionsSetting => { "Toggled on/off the natural language autosuggestions setting" } Self::ToggleSharedBlockTitleGenerationSetting => { "Toggled on/off the shared block title generation setting" } Self::ToggleGitOperationsAutogenSetting => { "Toggled on/off the git operations autogen setting" } Self::ToggleVoiceInputSetting => "Toggled on/off the voice input setting", Self::UnitTestSuggestionShown { .. } => "Suggested prompt shown", Self::UnitTestSuggestionAccepted { .. } => "Suggested prompt accepted", Self::UnitTestSuggestionCancelled { .. } => "Suggested prompt cancelled", Self::PromptSuggestionShown => "Prompt Suggestions banner shown", Self::SuggestedCodeDiffBannerShown => "Suggested Code Diff banner shown", Self::SuggestedCodeDiffFailed => "Suggested Code Diff Failed", Self::PromptSuggestionAccepted => "Prompt Suggestion accepted", Self::StaticPromptSuggestionsBannerShown => "Static Prompt Suggestions banner shown", Self::StaticPromptSuggestionAccepted => "Static Prompt Suggestion accepted", Self::ZeroStatePromptSuggestionUsed => "Used a zero state prompt suggestion", Self::AgentModeCodeSuggestionEditedByUser => { "Agent Mode Code suggestion edited by user" } Self::AgentModeCodeFilesNavigated => "Agent Mode Code files navigated", Self::AgentModeCodeDiffHunksNavigated => "Agent Mode Code diff hunks navigated", Self::EnvVarCollectionInvoked => "Invoked an environment variables object", Self::EnvVarWorkflowParameterization => { "Selected from environment variables dropdown to parameterize workflow" } Self::ObjectLinkCopied => "The web link to an object has been copied.", Self::FileTreeToggled => "Opened the file tree/project explorer", Self::GlobalSearchOpened => "Opened the global search view", Self::GlobalSearchQueryStarted => "Started a global search (warp_ripgrep) search", Self::FileTreeItemAttachedAsContext => { "Attached a file or directory as context from the file tree" } Self::CodeSelectionAddedAsContext => { "Added selected code as context from the code editor" } Self::FileTreeItemCreated => "Created a new file from the file tree", Self::ConversationListViewOpened => { "Opened the conversation list view in the left panel" } Self::ConversationListItemOpened => "Opened a conversation from the conversation list", Self::ConversationListItemDeleted => { "Deleted a conversation from the conversation list" } Self::ConversationListLinkCopied => { "Copied a conversation link from the conversation list" } Self::AgentViewEntered => "User entered the Agent View", Self::AgentViewExited => "User exited the Agent View", Self::InlineConversationMenuOpened => { "User opened the inline conversation menu in Agent View" } Self::InlineConversationMenuItemSelected => { "User selected an item from the inline conversation menu" } Self::AgentShortcutsViewToggled => "User toggled the shortcuts view in Agent View", Self::CreateProjectPromptSubmitted => { "User submitted a prompt from the create project view" } Self::CreateProjectPromptSubmittedContent => { "User submitted custom prompt content from the create project view" } Self::CloneRepoPromptSubmitted => { "User submitted a repository URL from the clone repo view" } Self::GetStartedSkipToTerminal => "User clicked skip to terminal from get started view", Self::CompletedSettingsImport => { "Imported a terminal's settings via the settings import onboarding block" } Self::SettingsImportConfigFocused => { "Selected a terminal in the settings import onboarding block" } Self::SettingsImportResetButtonClicked => { "Reset the imported settings in the settings import onboarding block" } Self::SettingsImportConfigParsed => { "Parsed a terminal's settings as part of settings import" } Self::ITermMultipleHotkeys => { "Attempted to import an iTerm profile that contained multiple hotkey window bindings" } Self::ToggleWorkspaceDecorationVisibility => "Toggled when to display the tab bar", Self::UpdateAltScreenPaddingMode => { "Updated the custom padding setting for the alt-screen" } Self::AddTabWithShell => "Added a tab with specific shell", Self::AgentModeSurfacedCitations => { "Agent mode used and cited external sources that were used in its response" } Self::AgentModeOpenedCitation => "Opened a citation that was surfaced in agent mode", Self::OpenedSharingDialog => { "Opened the sharing settings dialog for a session or Warp Drive object" } Self::ToggleGlobalAI => "Toggled global AI enablement.", Self::ToggleActiveAI => "Toggled active AI enablement.", Self::ToggleLigatureRendering => "Toggled ligature rendering", Self::WorkflowAliasAdded => "Added an alias to a Warp Drive workflow", Self::WorkflowAliasRemoved => "Removed an alias from a Warp Drive workflow", Self::WorkflowAliasArgumentEdited => { "Edited an argument in a Warp Drive workflow alias" } Self::WorkflowAliasEnvVarsAttached => { "Added or removed environment variables for a Warp Drive workflow alias" } Self::ToggledAgentModeAutoexecuteReadonlyCommandsSetting => { "Toggled setting to autoexecute readonly Agent Mode requested commands" } Self::ChangedAgentModeCodingPermissions => { "Changed Agent Mode permissions for coding tasks" } Self::AutoexecutedAgentModeRequestedCommand => { "Autoexecuted an Agent Mode requested command" } Self::AgenticOnboardingBlockSelected => { "Selected an agentic onboarding block to execute" } Self::AttachedImagesToAgentModeQuery => "Attached images to an Agent Mode query", #[cfg(windows)] Self::WSLRegistryError => { "Encountered an error while fetching WSL distributions from the registry" } #[cfg(windows)] Self::AutoupdateUnableToCloseApplications => { "The Windows auto-update installer was unable to automatically close all applications before installing the update" } #[cfg(windows)] Self::AutoupdateFileInUse => { "The Windows auto-update installer encountered a file-in-use error during installation" } #[cfg(windows)] Self::AutoupdateMutexTimeout => { "The Windows auto-update installer timed out waiting for Warp to release its mutex; a force-kill was attempted" } #[cfg(windows)] Self::AutoupdateForcekillFailed => { "The Windows auto-update installer failed to force-kill Warp after the mutex timeout" } Self::ToggleCodebaseContext => { "Toggled on/off the enablement of codebase context usage for Agent Mode." } Self::ToggleAutoIndexing => { "Toggled on/off the enablement of autoindexing for codebase context." } Self::ActiveIndexedReposChanged => { "Active indexed repositories changed, affecting codebase context." } Self::ExecutedWarpDrivePrompt => "Executed a saved prompt.", Self::ImageReceived => "Received an image through an image protocol over the pty", Self::FileExceededContextLimit => "File from AI exceeded context limit", Self::AgentModeError => "Received an error when getting Agent Mode response", Self::AgentModeRequestRetrySucceeded => { "Agent Mode request succeeded after retrying following an initial error" } Self::GrepToolSucceeded => "The grep tool completed successfully", Self::GrepToolFailed => "The grep tool failed to complete", Self::FileGlobToolSucceeded => "The file glob tool completed successfully", Self::FileGlobToolFailed { .. } => "The file glob tool failed to complete", Self::ShellTerminatedPrematurely { .. } => "The shell process terminated prematurely", Self::FullEmbedCodebaseContextSearchSuccess => { "Successfully searched full embed codebase context" } Self::FullEmbedCodebaseContextSearchFailed => { "Failed to search full embed codebase context" } Self::ShowedSuggestedAgentModeWorkflowChip => { "Showed the Suggested Agent Mode workflow chip to the user" } Self::SearchCodebaseRequested { .. } => "Ran the Search Codebase tool", Self::SearchCodebaseRepoUnavailable { .. } => { "Tried to use the Search Codebase tool on a repo that is unavailable" } Self::InputUXModeChanged { .. } => "Changed the input UX mode", Self::ContextChipInteracted { .. } => "Interacted with a context chip", Self::VoiceInputUsed { .. } => "Used voice input", Self::AtMenuInteracted { .. } => "Interacted with the @ menu", Self::UserMenuUpgradeClicked => "Clicked the 'Upgrade' menu item in the user menu", Self::TabCloseButtonPositionUpdated { .. } => "Updated the tab close button position", Self::ExpandedCodeSuggestions { .. } => "Expanded the passive code diff suggestion", Self::AIExecutionProfileCreated => "A new AI execution profile was created", Self::AIExecutionProfileDeleted => "An AI execution profile was deleted", Self::AIExecutionProfileSettingUpdated { .. } => { "An AI execution profile setting was updated" } Self::AIExecutionProfileAddedToAllowlist { .. } => { "An item was added to an AI execution profile allowlist" } Self::AIExecutionProfileAddedToDenylist { .. } => { "An item was added to an AI execution profile denylist" } Self::AIExecutionProfileRemovedFromAllowlist { .. } => { "An item was removed from an AI execution profile allowlist" } Self::AIExecutionProfileRemovedFromDenylist { .. } => { "An item was removed from an AI execution profile denylist" } Self::AIExecutionProfileModelSelected { .. } => { "An AI model was selected for an AI execution profile" } Self::AIInputNotSent { .. } => "The AI input was not sent", Self::OpenSlashMenu { .. } => "Opened the slash commands menu", Self::SlashCommandAccepted { .. } => "User accepted a slash command", Self::AgentModeSetupBannerAccepted { .. } => "Agent Mode setup banner accepted", Self::AgentModeSetupBannerDismissed => "Agent Mode setup banner dismissed", Self::AgentModeSetupProjectScopedRulesAction { .. } => { "User clicked a button in the Agent Mode setup project scoped rules step" } Self::AgentModeSetupCodebaseContextAction { .. } => { "User clicked a button in the Agent Mode setup codebase context step" } Self::AgentModeSetupCreateEnvironmentAction { .. } => { "User clicked a button in the Agent Mode setup create environment step" } Self::InputBufferSubmitted => "Input buffer submitted", Self::RecentMenuItemSelected { .. } => { "User selected an item from the recents list on the new tab zero state" } Self::OpenRepoFolderSubmitted { .. } => { "User selected a folder to open as a repo from the \"Open repository\" button" } Self::OutOfCreditsBannerClosed => { "User closed the 'Out of credits' banner (dismissed or purchased credits)" } Self::AutoReloadModalClosed => { "User closed the auto-reload modal (either dismissed or enabled auto-reload)" } Self::AutoReloadToggledFromBillingSettings => { "User toggled auto-reload in Billing & Usage settings" } Self::CLISubagentControlStateChanged { .. } => { "Control state changed in CLI subagent (agent in control, agent blocked, user in control, or agent tagged in)" } Self::CLISubagentResponsesToggled { .. } => { "User toggled the visibility of agent responses in CLI subagent" } Self::CLISubagentInputDismissed { .. } => { "User dismissed the input in the CLI subagent" } Self::CLISubagentActionExecuted { .. } => { "User approved a blocked action from the CLI subagent" } Self::CLISubagentActionRejected { .. } => { "User rejected a blocked action from the CLI subagent" } Self::AgentManagementViewToggled { .. } => { "User toggled the Agent Management View open or closed" } Self::AgentManagementViewOpenedSession => { "User opened a session from the Agent Management View" } Self::AgentManagementViewCopiedSessionLink => { "User copied a session link from the Agent Management View" } Self::DetectedIsolationPlatform { .. } => { "Detected that Warp is running in an isolated sandbox" } Self::AgentTipShown => "Selected an Agent Tip to show in the Agent Mode status bar", Self::AgentTipClicked => "User clicked a link or action in an Agent Tip", Self::AgentExitedShellProcess => { "An agent-requested command caused the shell process to exit" } Self::CLIAgentToolbarVoiceInputUsed { .. } => { "User used voice input from the CLI agent footer" } Self::CLIAgentToolbarImageAttached { .. } => { "User attached an image from the CLI agent footer" } Self::CLIAgentToolbarShown { .. } => "CLI agent footer was shown to the user", Self::CLIAgentPluginChipClicked { .. } => { "User clicked the plugin install or update chip" } Self::CLIAgentPluginChipDismissed { .. } => { "User dismissed the plugin install or update chip" } Self::CLIAgentPluginOperationSucceeded { .. } => { "Auto plugin install or update completed successfully" } Self::CLIAgentPluginOperationFailed { .. } => { "Auto plugin install or update failed" } Self::CLIAgentPluginDetected { .. } => { "A CLI agent plugin was detected via a SessionStart event" } Self::AgentNotificationShown { .. } => { "An agent notification was shown to the user (toast or mailbox)" } Self::CLIAgentRichInputOpened { .. } => "User opened CLI agent Rich Input", Self::CLIAgentRichInputClosed { .. } => "CLI agent Rich Input was closed", Self::CLIAgentRichInputSubmitted { .. } => { "User submitted a prompt via CLI agent Rich Input" } Self::ToggleCLIAgentToolbarSetting { .. } => { "User toggled the CLI agent footer setting" } Self::ToggleUseAgentToolbarSetting { .. } => { "User toggled the Use Agent footer setting" } Self::CodexModalOpened => "User opened the Codex modal", Self::CodexModalUseCodexClicked => "User clicked 'Use Codex' in the Codex modal", Self::LinearIssueLinkOpened => { "User opened a warp://linear deeplink to work on an issue" } Self::CloudAgentCapacityModalOpened => "User opened the cloud agent capacity modal", Self::CloudAgentCapacityModalDismissed => { "User dismissed the cloud agent capacity modal" } Self::CloudAgentCapacityModalUpgradeClicked => { "User clicked the upgrade button in the cloud agent capacity modal" } Self::ComputerUseApproved => { "A RequestComputerUse action was approved (manually or auto-executed)" } Self::ComputerUseCancelled => "A RequestComputerUse action was cancelled/rejected", Self::FreeTierLimitHitInterstitialDisplayed { .. } => { "The free tier limit hit interstitial was displayed" } Self::FreeTierLimitHitInterstitialUpgradeButtonClicked { .. } => { "User clicked the 'Upgrade' button in the free tier limit hit interstitial" } Self::FreeTierLimitHitInterstitialClosed { .. } => { "User closed the free tier limit hit interstitial" } Self::RemoteServerBinaryCheck => { "Remote server binary check completed (found, not found, or error)" } Self::RemoteServerInstallation => { "Remote server binary installation completed (success or failure)" } Self::RemoteServerInitialization => { "Remote server connection and initialization completed (success or failure)" } Self::RemoteServerDisconnection => { "An established remote server connection was dropped" } Self::RemoteServerClientRequestError => { "A client request to the remote server failed" } Self::RemoteServerMessageDecodingError => { "A server message could not be decoded (no parseable request_id)" } Self::RemoteServerSetupDuration => { "End-to-end duration of the remote server setup flow" } } } } warp_core::register_telemetry_event!(TelemetryEvent); #[cfg(test)] #[path = "events_test.rs"] mod tests;