first pass of merging in warp (doesn't build)

This commit is contained in:
Ryan Ward
2026-07-01 16:08:58 -05:00
parent 2f64909469
commit 4770ac06b5
3662 changed files with 414574 additions and 89772 deletions
-12
View File
@@ -16,8 +16,6 @@ impl Display for ServerExperiment {
Self::EnvVarsEarlyAccessExperiment => "ENV_VARS_EARLY_ACCESS_EXPERIMENT",
Self::AgentModeAnalyticsExperiment => "AGENT_MODE_ANALYTICS_EXPERIMENT",
Self::WindowsLaunchExperiment => "WINDOWS_LAUNCH_EXPERIMENT",
Self::TmuxSshWarpificationControl => "TMUX_SSH_WARPIFICATION_CONTROL",
Self::TmuxSshWarpificationExperiment => "TMUX_SSH_WARPIFICATION_EXPERIMENT",
Self::CodebaseContextControl => "CODEBASE_CONTEXT_CONTROL",
Self::CodebaseContextExperiment => "CODEBASE_CONTEXT_EXPERIMENT",
Self::SuggestedCodeDiffsControl => "SUGGESTED_CODE_DIFFS_CONTROL",
@@ -32,8 +30,6 @@ impl Display for ServerExperiment {
Self::PromptSuggestionsViaMaaOutOfBandExperiment => {
"PROMPT_SUGGESTIONS_VIA_MAA_OOB_EXPERIMENT"
}
Self::FreeUserNoAiControl => "FREE_USER_NO_AI_CONTROL",
Self::FreeUserNoAiExperiment => "FREE_USER_NO_AI_EXPERIMENT",
Self::OzMultiHarnessControl => "OZ_MULTI_HARNESS_CONTROL",
Self::OzMultiHarnessExperiment => "OZ_MULTI_HARNESS_EXPERIMENT",
#[cfg(test)]
@@ -52,8 +48,6 @@ impl ServerExperiment {
"ENV_VARS_EARLY_ACCESS_EXPERIMENT" => Ok(Self::EnvVarsEarlyAccessExperiment),
"AGENT_MODE_ANALYTICS_EXPERIMENT" => Ok(Self::AgentModeAnalyticsExperiment),
"WINDOWS_LAUNCH_EXPERIMENT" => Ok(Self::WindowsLaunchExperiment),
"TMUX_SSH_WARPIFICATION_CONTROL" => Ok(Self::TmuxSshWarpificationControl),
"TMUX_SSH_WARPIFICATION_EXPERIMENT" => Ok(Self::TmuxSshWarpificationExperiment),
"CODEBASE_CONTEXT_EXPERIMENT" => Ok(Self::CodebaseContextExperiment),
"CODEBASE_CONTEXT_CONTROL" => Ok(Self::CodebaseContextControl),
"SUGGESTED_CODE_DIFFS_CONTROL" => Ok(Self::SuggestedCodeDiffsControl),
@@ -65,8 +59,6 @@ impl ServerExperiment {
}
"PROMPT_SUGGESTIONS_VIA_MAA_CONTROL" => Ok(Self::PromptSuggestionsViaMaaControl),
"PROMPT_SUGGESTIONS_VIA_MAA_EXPERIMENT" => Ok(Self::PromptSuggestionsViaMaaExperiment),
"FREE_USER_NO_AI_CONTROL" => Ok(Self::FreeUserNoAiControl),
"FREE_USER_NO_AI_EXPERIMENT" => Ok(Self::FreeUserNoAiExperiment),
"OZ_MULTI_HARNESS_CONTROL" => Ok(Self::OzMultiHarnessControl),
"OZ_MULTI_HARNESS_EXPERIMENT" => Ok(Self::OzMultiHarnessExperiment),
s => Err(anyhow::anyhow!(
@@ -93,8 +85,6 @@ impl TryFrom<Experiment> for ServerExperiment {
Experiment::DisableAgentModeExperiment => Ok(Self::DisableAgentModeExperiment),
Experiment::EnvVarsEarlyAccessExperiment => Ok(Self::EnvVarsEarlyAccessExperiment),
Experiment::AgentModeAnalyticsExperiment => Ok(Self::AgentModeAnalyticsExperiment),
Experiment::TmuxSshWarpificationControl => Ok(Self::TmuxSshWarpificationControl),
Experiment::TmuxSshWarpificationExperiment => Ok(Self::TmuxSshWarpificationExperiment),
Experiment::WindowsLaunchExperiment => Ok(Self::WindowsLaunchExperiment),
Experiment::CodebaseContextControl => Ok(Self::CodebaseContextControl),
Experiment::CodebaseContextExperiment => Ok(Self::CodebaseContextExperiment),
@@ -104,8 +94,6 @@ impl TryFrom<Experiment> for ServerExperiment {
Experiment::PromptSuggestionsViaMaaOob => {
Ok(Self::PromptSuggestionsViaMaaOutOfBandExperiment)
}
Experiment::FreeUserNoAiControl => Ok(Self::FreeUserNoAiControl),
Experiment::FreeUserNoAiExperiment => Ok(Self::FreeUserNoAiExperiment),
Experiment::OzMultiHarnessControl => Ok(Self::OzMultiHarnessControl),
Experiment::OzMultiHarnessExperiment => Ok(Self::OzMultiHarnessExperiment),
// Experiments that we no longer support on the client.
+3 -36
View File
@@ -11,21 +11,19 @@
//! See [here](https://www.notion.so/warpdev/Server-side-experiments-dynamic-feature-enablement-c0fb9aed695d4178a19b8830e3269094)
//! for a full guide on the server-side experiment framework.
use crate::features::FeatureFlag;
use crate::workspaces::user_workspaces::UserWorkspaces;
use crate::workspaces::workspace::CustomerType;
use galaxyui::AppContext;
#[cfg(not(test))]
use galaxyui::SingletonEntity as _;
#[cfg(test)]
use galaxyui::SingletonEntity;
use crate::features::FeatureFlag;
mod convert;
mod model;
pub use model::{Event as ServerExperimentsEvent, ServerExperiments};
/// The known server-side experiments.
#[allow(clippy::enum_variant_names)]
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq)]
pub enum ServerExperiment {
SessionSharingExperiment,
@@ -34,8 +32,6 @@ pub enum ServerExperiment {
EnvVarsEarlyAccessExperiment,
AgentModeAnalyticsExperiment,
WindowsLaunchExperiment,
TmuxSshWarpificationControl,
TmuxSshWarpificationExperiment,
CodebaseContextExperiment,
CodebaseContextControl,
SuggestedCodeDiffsControl,
@@ -46,8 +42,6 @@ pub enum ServerExperiment {
PromptSuggestionsViaMaaControl,
PromptSuggestionsViaMaaExperiment,
PromptSuggestionsViaMaaOutOfBandExperiment,
FreeUserNoAiControl,
FreeUserNoAiExperiment,
OzMultiHarnessControl,
OzMultiHarnessExperiment,
/// A test-only experiment.
@@ -92,14 +86,6 @@ impl ServerExperiment {
// TODO(alokedesai): Clean this up now that we no longer gate access to the Windows
// build on an allowlist.
}
Self::TmuxSshWarpificationControl => FeatureFlag::SSHTmuxWrapper.set_enabled(false),
Self::TmuxSshWarpificationExperiment => {
// Only enable the TMUX-based experience if not on windows. ConPTY doesn't support
// DCS, which we need in order to use tmux control mode.
if cfg!(not(windows)) {
FeatureFlag::SSHTmuxWrapper.set_enabled(true)
}
}
Self::CodebaseContextExperiment => {
FeatureFlag::FullSourceCodeEmbedding.set_enabled(true);
FeatureFlag::CodebaseIndexPersistence.set_enabled(true);
@@ -137,12 +123,6 @@ impl ServerExperiment {
}
// The normal experiment arm is no longer used.
Self::PromptSuggestionsViaMaaExperiment => {}
Self::FreeUserNoAiControl => {
FeatureFlag::FreeUserNoAi.set_enabled(false);
}
Self::FreeUserNoAiExperiment => {
FeatureFlag::FreeUserNoAi.set_enabled(true);
}
Self::OzMultiHarnessControl => {
FeatureFlag::AgentHarness.set_enabled(false);
}
@@ -158,16 +138,3 @@ impl ServerExperiment {
}
}
}
/// Returns `true` when the user is in the `FreeUserNoAiExperiment` arm **and** is on the
/// free tier. This is the single source of truth for gating any client-side behaviour
/// that should be locked/disabled for users without AI credits.
pub fn is_free_user_no_ai_experiment_active(ctx: &AppContext) -> bool {
let in_experiment = FeatureFlag::FreeUserNoAi.is_enabled();
let is_free_tier = UserWorkspaces::handle(ctx)
.as_ref(ctx)
.current_team()
.map(|team| team.billing_metadata.customer_type == CustomerType::Free)
.unwrap_or(true); // no team = solo free user
in_experiment && is_free_tier
}
+6 -5
View File
@@ -2,13 +2,14 @@
use std::collections::HashSet;
use super::ServerExperiment;
use crate::{persistence::ModelEvent, report_if_error, GlobalResourceHandlesProvider};
use anyhow::Context;
use galaxyui::{Entity, ModelContext, SingletonEntity};
#[cfg(test)]
pub use tests::TestModel;
use warpui::{Entity, ModelContext, SingletonEntity};
use super::ServerExperiment;
use crate::persistence::ModelEvent;
use crate::{report_if_error, GlobalResourceHandlesProvider};
/// A global model for maintaining server-side experiment state.
pub struct ServerExperiments {
@@ -29,7 +30,7 @@ impl ServerExperiments {
/// Updates the model with the latest server-side state.
///
/// Assumes the set of proivded [`ServerExperiment`]s are unambiguous;
/// Assumes the set of provided [`ServerExperiment`]s are unambiguous;
/// that is, there are not two arms enabled for the same experiment group.
pub fn apply_latest_state(
&mut self,
+2 -1
View File
@@ -1,6 +1,7 @@
use warpui::{App, Entity, SingletonEntity};
use super::{ServerExperiment, ServerExperiments};
use crate::{GlobalResourceHandles, GlobalResourceHandlesProvider};
use galaxyui::{App, Entity, SingletonEntity};
/// A model for testing purposes only.
///