mirror of
https://github.com/warpdotdev/warp.git
synced 2026-05-06 15:22:21 +08:00
Add experiment setup for SSH (#9449)
## Description Enable SSH remote server on stable! This also setup the server experiment rollout so we could have a percentage of users with the setting default on and the rest with default off
This commit is contained in:
@@ -36,6 +36,8 @@ impl Display for ServerExperiment {
|
||||
Self::FreeUserNoAiExperiment => "FREE_USER_NO_AI_EXPERIMENT",
|
||||
Self::OzMultiHarnessControl => "OZ_MULTI_HARNESS_CONTROL",
|
||||
Self::OzMultiHarnessExperiment => "OZ_MULTI_HARNESS_EXPERIMENT",
|
||||
Self::SshRemoteServerControl => "SSH_REMOTE_SERVER_CONTROL",
|
||||
Self::SshRemoteServerExperiment => "SSH_REMOTE_SERVER_EXPERIMENT",
|
||||
#[cfg(test)]
|
||||
Self::TestExperiment => "TEST_EXPERIMENT",
|
||||
};
|
||||
@@ -69,6 +71,8 @@ impl ServerExperiment {
|
||||
"FREE_USER_NO_AI_EXPERIMENT" => Ok(Self::FreeUserNoAiExperiment),
|
||||
"OZ_MULTI_HARNESS_CONTROL" => Ok(Self::OzMultiHarnessControl),
|
||||
"OZ_MULTI_HARNESS_EXPERIMENT" => Ok(Self::OzMultiHarnessExperiment),
|
||||
"SSH_REMOTE_SERVER_CONTROL" => Ok(Self::SshRemoteServerControl),
|
||||
"SSH_REMOTE_SERVER_EXPERIMENT" => Ok(Self::SshRemoteServerExperiment),
|
||||
s => Err(anyhow::anyhow!(
|
||||
"String doesn't match any server experiment variant {s}"
|
||||
)),
|
||||
@@ -108,6 +112,8 @@ impl TryFrom<Experiment> for ServerExperiment {
|
||||
Experiment::FreeUserNoAiExperiment => Ok(Self::FreeUserNoAiExperiment),
|
||||
Experiment::OzMultiHarnessControl => Ok(Self::OzMultiHarnessControl),
|
||||
Experiment::OzMultiHarnessExperiment => Ok(Self::OzMultiHarnessExperiment),
|
||||
Experiment::SshRemoteServerControl => Ok(Self::SshRemoteServerControl),
|
||||
Experiment::SshRemoteServerExperiment => Ok(Self::SshRemoteServerExperiment),
|
||||
// Experiments that we no longer support on the client.
|
||||
e => Err(anyhow::anyhow!(
|
||||
"Server-side enabled experiment '{e:?}' is no longer supported by the client."
|
||||
|
||||
@@ -12,8 +12,10 @@
|
||||
//! for a full guide on the server-side experiment framework.
|
||||
|
||||
use crate::features::FeatureFlag;
|
||||
use crate::terminal::warpify::settings::{SshExtensionInstallMode, WarpifySettings};
|
||||
use crate::workspaces::user_workspaces::UserWorkspaces;
|
||||
use crate::workspaces::workspace::CustomerType;
|
||||
use settings::Setting;
|
||||
use warpui::AppContext;
|
||||
#[cfg(not(test))]
|
||||
use warpui::SingletonEntity as _;
|
||||
@@ -26,6 +28,7 @@ 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,
|
||||
@@ -50,6 +53,8 @@ pub enum ServerExperiment {
|
||||
FreeUserNoAiExperiment,
|
||||
OzMultiHarnessControl,
|
||||
OzMultiHarnessExperiment,
|
||||
SshRemoteServerControl,
|
||||
SshRemoteServerExperiment,
|
||||
/// A test-only experiment.
|
||||
/// Does not correspond to a real server-side experiment.
|
||||
#[cfg(test)]
|
||||
@@ -149,6 +154,44 @@ impl ServerExperiment {
|
||||
Self::OzMultiHarnessExperiment => {
|
||||
FeatureFlag::AgentHarness.set_enabled(true);
|
||||
}
|
||||
Self::SshRemoteServerControl => {
|
||||
FeatureFlag::SshRemoteServer.set_enabled(true);
|
||||
// Override the default install mode to NeverInstall for users
|
||||
// who haven't explicitly changed it. `load_value` sets the
|
||||
// in-memory value without persisting, so the override is
|
||||
// re-applied from the experiment cache on every launch and
|
||||
// disappears if the user leaves the experiment.
|
||||
WarpifySettings::handle(_ctx).update(_ctx, |settings, ctx| {
|
||||
if !settings
|
||||
.ssh_extension_install_mode
|
||||
.is_value_explicitly_set()
|
||||
{
|
||||
let _ = settings.ssh_extension_install_mode.load_value(
|
||||
SshExtensionInstallMode::NeverInstall,
|
||||
false,
|
||||
ctx,
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
Self::SshRemoteServerExperiment => {
|
||||
FeatureFlag::SshRemoteServer.set_enabled(true);
|
||||
// Restore the default install mode in case the user was
|
||||
// previously in the control arm (which overrides it to
|
||||
// NeverInstall).
|
||||
WarpifySettings::handle(_ctx).update(_ctx, |settings, ctx| {
|
||||
if !settings
|
||||
.ssh_extension_install_mode
|
||||
.is_value_explicitly_set()
|
||||
{
|
||||
let _ = settings.ssh_extension_install_mode.load_value(
|
||||
SshExtensionInstallMode::default(),
|
||||
false,
|
||||
ctx,
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
#[cfg(test)]
|
||||
Self::TestExperiment => {
|
||||
model::TestModel::handle(_ctx).update(_ctx, |model, _| {
|
||||
|
||||
@@ -2,20 +2,20 @@ use crate::auth::auth_state::AuthStateProvider;
|
||||
use crate::remote_server::auth_context::server_api_auth_context;
|
||||
use instant::Instant;
|
||||
use remote_server::auth::RemoteServerAuthContext;
|
||||
use settings::Setting;
|
||||
use std::path::PathBuf;
|
||||
use std::sync::Arc;
|
||||
use warp_core::SessionId;
|
||||
use warpui::{Entity, ModelContext, ModelHandle, SingletonEntity, WeakModelHandle};
|
||||
|
||||
use crate::terminal::warpify::settings::SshExtensionInstallMode;
|
||||
use settings::Setting;
|
||||
|
||||
use crate::terminal::warpify::settings::{SshExtensionInstallMode, WarpifySettings};
|
||||
|
||||
use crate::remote_server::manager::{RemoteServerManager, RemoteServerManagerEvent};
|
||||
use crate::remote_server::ssh_transport::SshTransport;
|
||||
use crate::server::server_api::ServerApiProvider;
|
||||
use crate::terminal::model::session::{IsLegacySSHSession, SessionInfo};
|
||||
use crate::terminal::model_events::{ModelEvent, ModelEventDispatcher};
|
||||
use crate::terminal::warpify::settings::WarpifySettings;
|
||||
use crate::{send_telemetry_from_ctx, TelemetryEvent};
|
||||
use remote_server::setup::RemotePlatform;
|
||||
|
||||
|
||||
@@ -67,6 +67,8 @@ pub enum Experiment {
|
||||
FreeUserInitialCreditsThreeHundred,
|
||||
OzMultiHarnessControl,
|
||||
OzMultiHarnessExperiment,
|
||||
SshRemoteServerControl,
|
||||
SshRemoteServerExperiment,
|
||||
#[cynic(fallback)]
|
||||
Other(String),
|
||||
}
|
||||
|
||||
@@ -920,6 +920,8 @@ pub const DOGFOOD_FLAGS: &[FeatureFlag] = &[
|
||||
FeatureFlag::VerticalTabsSummaryMode,
|
||||
FeatureFlag::CloudModeSetupV2,
|
||||
FeatureFlag::ConfigurableContextWindow,
|
||||
#[cfg(not(windows))]
|
||||
FeatureFlag::SshRemoteServer,
|
||||
];
|
||||
|
||||
/// Features enabled for feature preview build users (e.g.: Friends of Warp).
|
||||
@@ -930,9 +932,6 @@ pub const PREVIEW_FLAGS: &[FeatureFlag] = &[
|
||||
FeatureFlag::BlocklistMarkdownImages,
|
||||
FeatureFlag::MarkdownTables,
|
||||
FeatureFlag::OzIdentityFederation,
|
||||
// Remote server binary is not yet supported on Windows.
|
||||
#[cfg(not(windows))]
|
||||
FeatureFlag::SshRemoteServer,
|
||||
FeatureFlag::GitOperationsInCodeReview,
|
||||
];
|
||||
|
||||
@@ -946,6 +945,9 @@ pub const RELEASE_FLAGS: &[FeatureFlag] = &[
|
||||
// Marked text is currently only supported on MacOS.
|
||||
#[cfg(target_os = "macos")]
|
||||
FeatureFlag::ImeMarkedText,
|
||||
// Remote server binary is not yet supported on Windows.
|
||||
#[cfg(not(windows))]
|
||||
FeatureFlag::SshRemoteServer,
|
||||
];
|
||||
|
||||
/// Flags that we want to allow to switch at runtime (assuming RuntimeFeatureFlags is set)
|
||||
|
||||
@@ -1202,6 +1202,8 @@ enum Experiment {
|
||||
SESSION_SHARING_CONTROL
|
||||
SESSION_SHARING_EXPERIMENT
|
||||
SPLIT_CREDIT_COST_CONTROL
|
||||
SSH_REMOTE_SERVER_CONTROL
|
||||
SSH_REMOTE_SERVER_EXPERIMENT
|
||||
SPLIT_CREDIT_COST_EXPERIMENT
|
||||
SUGGESTED_CODE_DIFFS_CONTROL
|
||||
SUGGESTED_CODE_DIFFS_EXPERIMENT
|
||||
|
||||
Reference in New Issue
Block a user