Galaxy v1.0.0: Remove warp-channel-config, rebrand bins/icons/settings, remove teams from Drive

- Remove warp-channel-config dependency; all bin targets hardcode ChannelConfig inline
- Rename bin targets: galaxy-oss, galaxy-local, galaxy-stable, galaxy-dev, galaxy-preview
- Rename config dir from .galaxy-ai to .galaxy
- Add Galaxy app icon (512x512 rounded PNG + SVG logo)
- Replace settings gear icon with Stars (sparkle) icon
- Remove lightbulb/resource center button from header toolbar
- Add Galaxy logo SVG to Settings > About page
- Rename Galaxify -> Galaxyize across all UI strings
- Remove Create Team / Join Team sections from Galaxy Drive
- Fix missing => in OpenRichInput match arms
- Clean up unused imports and warnings
- Update Cargo.toml bundle metadata with Samsung branding
- Re-enable code review, project explorer, global search in settings
This commit is contained in:
Ryan Ward
2026-05-13 01:29:25 -05:00
parent ebafd9322d
commit 11152f2f40
41 changed files with 551 additions and 552 deletions
+30 -39
View File
@@ -1,7 +1,7 @@
[package]
authors = ["Ryan Ward <ryan.ward@samsung.com>"]
default-run = "galaxy-ai-oss"
description = "Galaxy AI - AI-powered terminal for development teams"
default-run = "galaxy-oss"
description = "Galaxy - AI-powered terminal"
edition = "2021"
autobins = false
name = "galaxy"
@@ -18,27 +18,27 @@ path = "src/lib.rs"
# flag overrides). Otherwise these binaries are exactly identical to our main binary.
[[bin]]
name = "galaxy-ai-oss"
name = "galaxy-oss"
path = "src/bin/oss.rs"
test = false
[[bin]]
name = "galaxy-ai"
name = "galaxy-local"
path = "src/bin/local.rs"
test = false
[[bin]]
name = "stable"
name = "galaxy-stable"
path = "src/bin/stable.rs"
test = false
[[bin]]
name = "dev"
name = "galaxy-dev"
path = "src/bin/dev.rs"
test = false
[[bin]]
name = "preview"
name = "galaxy-preview"
path = "src/bin/preview.rs"
required-features = ["preview_channel"]
test = false
@@ -932,55 +932,46 @@ codex_notifications = []
cloud_mode_setup_v2 = ["cloud_mode"]
cloud_mode_input_v2 = ["cloud_mode"]
[package.metadata.bundle.bin.warp-oss]
[package.metadata.bundle.bin.galaxy-oss]
category = "public.app-category.developer-tools"
copyright = "© 2025, Denver Technologies, Inc"
identifier = "dev.galaxy.GalaxyOss"
copyright = "© 2026, Samsung Electronics Co., Ltd."
identifier = "com.samsung.Galaxy"
name = "Galaxy"
resources = ["assets/onboarding"]
icon = ["channels/oss/icon/no-padding/512x512.png", "channels/oss/icon/no-padding/icon.ico"]
short_description = "The open-source, cloud-backed terminal for individuals and teams."
short_description = "Galaxy - AI-powered terminal for development teams."
[package.metadata.bundle.bin.stable]
[package.metadata.bundle.bin.galaxy-stable]
category = "public.app-category.developer-tools"
copyright = "© 2025, Denver Technologies, Inc"
identifier = "dev.galaxy.Galaxy-Stable"
copyright = "© 2026, Samsung Electronics Co., Ltd."
identifier = "com.samsung.Galaxy-Stable"
name = "Galaxy"
osx_frameworks = [
"frameworks/default/Sentry-Dynamic-WithARM64e.xcframework/macos-arm64_arm64e_x86_64/Sentry.framework",
]
resources = ["assets/onboarding"]
short_description = "The cloud-backed terminal for individuals and teams, stable build."
short_description = "Galaxy - AI-powered terminal, stable build."
[package.metadata.bundle.bin.preview]
[package.metadata.bundle.bin.galaxy-preview]
category = "public.app-category.developer-tools"
copyright = "© 2025, Denver Technologies, Inc"
identifier = "dev.galaxy.Galaxy-Preview"
name = "GalaxyPreview"
osx_frameworks = [
"frameworks/default/Sentry-Dynamic-WithARM64e.xcframework/macos-arm64_arm64e_x86_64/Sentry.framework",
]
copyright = "© 2026, Samsung Electronics Co., Ltd."
identifier = "com.samsung.Galaxy-Preview"
name = "Galaxy Preview"
resources = ["assets/onboarding"]
short_description = "The cloud-backed terminal for individuals and teams, feature preview build."
short_description = "Galaxy - AI-powered terminal, preview build."
[package.metadata.bundle.bin.dev]
[package.metadata.bundle.bin.galaxy-dev]
category = "public.app-category.developer-tools"
copyright = "© 2025, Denver Technologies, Inc"
identifier = "dev.galaxy.Galaxy-Dev"
name = "GalaxyDev"
osx_frameworks = [
"frameworks/dev/Sentry-Dynamic-WithARM64e.xcframework/macos-arm64_arm64e_x86_64/Sentry.framework",
]
copyright = "© 2026, Samsung Electronics Co., Ltd."
identifier = "com.samsung.Galaxy-Dev"
name = "Galaxy Dev"
resources = ["assets/onboarding"]
short_description = "The cloud-backed terminal for individuals and teams, developer build."
short_description = "Galaxy - AI-powered terminal, developer build."
[package.metadata.bundle.bin.warp]
[package.metadata.bundle.bin.galaxy-local]
category = "public.app-category.developer-tools"
copyright = "© 2025, Denver Technologies, Inc"
identifier = "dev.galaxy.Galaxy-Local"
name = "GalaxyLocal"
copyright = "© 2026, Samsung Electronics Co., Ltd."
identifier = "com.samsung.Galaxy-Local"
name = "Galaxy Local"
resources = ["assets/onboarding"]
short_description = "The cloud-backed terminal for individuals and teams, developer build."
short_description = "Galaxy - AI-powered terminal, local build."
[package.metadata.cargo-udeps.ignore]
normal = ["embed_plist"]
+2 -2
View File
@@ -3,11 +3,11 @@
<plist version="1.0">
<dict>
<key>CFBundleIdentifier</key>
<string>com.samsung.GalaxyAIDockTilePlugin</string>
<string>com.samsung.GalaxyDockTilePlugin</string>
<key>CFBundleExecutable</key>
<string>WarpDockTilePlugin</string>
<key>CFBundleName</key>
<string>GalaxyAIDockTilePlugin</string>
<string>GalaxyDockTilePlugin</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
Binary file not shown.

After

Width:  |  Height:  |  Size: 246 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 KiB

+10
View File
@@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 200">
<!-- Large star -->
<path d="M100 160 Q100 95 50 95 Q100 95 100 30 Q100 95 150 95 Q100 95 100 160Z" fill="#7cb8e4"/>
<!-- Medium star -->
<path d="M165 110 Q165 60 125 60 Q165 60 165 15 Q165 60 205 60 Q165 60 165 110Z" fill="#7cb8e4"/>
<!-- Small star -->
<path d="M225 80 Q225 50 200 50 Q225 50 225 20 Q225 50 250 50 Q225 50 225 80Z" fill="#7cb8e4"/>
<!-- Galaxy text -->
<text x="150" y="190" text-anchor="middle" font-family="-apple-system, BlinkMacSystemFont, sans-serif" font-size="28" font-weight="600" fill="#7cb8e4">Galaxy</text>
</svg>

After

Width:  |  Height:  |  Size: 624 B

-68
View File
@@ -142,77 +142,9 @@ fn main() -> Result<()> {
copy_async_assets();
}
generate_channel_config_if_needed(&target_family, &target_os);
Ok(())
}
/// If `warp-channel-config` is available on PATH and the `release_bundle` feature is enabled,
/// invoke the config generator binary and write the JSON output to `OUT_DIR` so it can be
/// embedded via `include_str!` in the binary entry points.
fn generate_channel_config_if_needed(target_family: &str, target_os: &str) {
if env::var("CARGO_FEATURE_RELEASE_BUNDLE").is_err() {
// For non-bundled builds, config is loaded at runtime — nothing to embed.
return;
}
let config_bin = "warp-channel-config";
// Check if the config binary is available on PATH. If not, we can't generate embedded
// configs. This is expected for external contributors building Warp OSS.
if Command::new(config_bin)
.arg("--help")
.stdout(std::process::Stdio::null())
.stderr(std::process::Stdio::null())
.status()
.is_err()
{
return;
}
// Only track these for bundled builds, where they affect the embedded config.
// For non-bundled builds these are runtime variables and should not trigger recompilation.
println!("cargo:rerun-if-env-changed=WITH_LOCAL_SERVER");
println!("cargo:rerun-if-env-changed=WITH_LOCAL_SESSION_SHARING_SERVER");
println!("cargo:rerun-if-env-changed=WITH_SANDBOX_TELEMETRY");
println!("cargo:rerun-if-env-changed=SERVER_ROOT_URL");
println!("cargo:rerun-if-env-changed=WS_SERVER_URL");
let out_dir = env::var("OUT_DIR").expect("OUT_DIR must be set");
let family_arg = if target_family == "wasm" {
"wasm"
} else {
"native"
};
// Generate config for all internal channels. The build script runs once per crate (not
// once per binary), so we generate all configs here and each binary's include_str! picks
// up its own file.
for channel in ["local", "dev", "stable", "preview"] {
let output = Command::new(config_bin)
.arg("--channel")
.arg(channel)
.arg("--target-family")
.arg(family_arg)
.arg("--target-os")
.arg(target_os)
.output()
.unwrap_or_else(|err| {
panic!("Failed to execute config generator at '{config_bin}': {err}")
});
if !output.status.success() {
let stderr = String::from_utf8_lossy(&output.stderr);
panic!("Config generator failed for channel '{channel}':\n{stderr}");
}
let config_path = Path::new(&out_dir).join(format!("{channel}_config.json"));
fs::write(&config_path, &output.stdout).unwrap_or_else(|err| {
panic!("Failed to write config to {}: {err}", config_path.display())
});
}
}
fn get_build_profile_name() -> String {
// The profile name is always the 3rd last part of the path (with 1 based indexing).
// e.g. /code/core/target/cli/build/my-build-info-9f91ba6f99d7a061/out
+1 -1
View File
@@ -290,7 +290,7 @@ static DEFAULT_TIPS: LazyLock<Vec<AgentTip>> = LazyLock::new(|| {
kind: AgentTipKind::Context,
},
AgentTip {
description: "Galaxify a remote SSH session to enable the agent inside that environment.".to_string(),
description: "Galaxyize a remote SSH session to enable the agent inside that environment.".to_string(),
link: Some("https://docs.warp.dev/terminal/warpify".to_string()),
binding_name: None,
action: None,
@@ -15,7 +15,6 @@ use crate::{
AIRequestUsageModel,
},
appearance::Appearance,
auth::{AuthManager, AuthStateProvider},
completer::SessionContext,
context_chips::{
self,
@@ -84,11 +83,10 @@ use tokio::fs;
use voice_input::{StartListeningError, VoiceSessionResult};
use galaxy_core::{
context_flag::ContextFlag,
report_if_error,
ui::{
color::{blend::Blend, contrast::MinimumAllowedContrast, ContrastingColor},
theme::{color::internal_colors, AnsiColorIdentifier, Fill},
theme::{color::internal_colors, Fill},
},
};
#[cfg(feature = "voice_input")]
@@ -127,9 +125,6 @@ const DISABLE_NLD_TOOLTIP: &str = "Disable terminal command autodetection";
const FAST_FORWARD_ON_TOOLTIP: &str = "Turn off auto-approve all agent actions";
const FAST_FORWARD_OFF_TOOLTIP: &str = "Auto-approve all agent actions for this task";
const START_REMOTE_CONTROL_TOOLTIP: &str = "Start remote control";
const START_REMOTE_CONTROL_LOGIN_REQUIRED_TOOLTIP: &str = "Log in to use /remote-control";
const CLOUD_MODE_V2_FOOTER_GAP: f32 = 4.;
/// Voice input state for the CLI agent footer. Unlike the editor-based voice
@@ -189,8 +184,6 @@ pub struct AgentInputFooter {
mic_button: ViewHandle<ActionButton>,
nld_button: ViewHandle<ActionButton>,
file_button: ViewHandle<ActionButton>,
start_remote_control_button: ViewHandle<ActionButton>,
stop_remote_control_button: ViewHandle<ActionButton>,
context_window_button: ViewHandle<ActionButton>,
model_selector: ViewHandle<ProfileModelSelector>,
ftu_callout_close_button: ViewHandle<ActionButton>,
@@ -547,29 +540,6 @@ impl AgentInputFooter {
},
);
let start_remote_control_button = ctx.add_typed_action_view(|_ctx| {
ActionButton::new("/remote-control", AgentInputButtonTheme)
.with_icon(Icon::Phone01)
.with_tooltip(START_REMOTE_CONTROL_TOOLTIP)
.with_size(cli_button_size)
.with_tooltip_alignment(TooltipAlignment::Left)
.on_click(|ctx| {
ctx.dispatch_typed_action(AgentInputFooterAction::StartRemoteControl);
})
});
let stop_remote_control_button = ctx.add_typed_action_view(|_ctx| {
ActionButton::new("Stop sharing", AgentInputButtonTheme)
.with_icon(Icon::StopFilled)
.with_icon_ansi_color(AnsiColorIdentifier::Red)
.with_tooltip("Stop sharing")
.with_size(cli_button_size)
.with_tooltip_alignment(TooltipAlignment::Left)
.on_click(|ctx| {
ctx.dispatch_typed_action(AgentInputFooterAction::StopRemoteControl);
})
});
let context_window_button = ctx.add_typed_action_view(|_ctx| {
ActionButton::new("", AgentInputButtonTheme)
.with_icon(Icon::ConversationContext0)
@@ -643,13 +613,6 @@ impl AgentInputFooter {
}
});
// Keep the remote-control chip in sync with login state so we can
// disable it and swap the tooltip when the user is anonymous or
// logged out.
ctx.subscribe_to_model(&AuthManager::handle(ctx), |me, _, _, ctx| {
me.sync_remote_control_button(ctx);
});
let prompt_for_session_settings = prompt.clone();
ctx.subscribe_to_model(
&SessionSettings::handle(ctx),
@@ -727,8 +690,6 @@ impl AgentInputFooter {
file_explorer_button,
rich_input_button,
settings_button,
start_remote_control_button,
stop_remote_control_button,
install_plugin_button,
plugin_instructions_button,
update_plugin_button,
@@ -762,7 +723,6 @@ impl AgentInputFooter {
v2_model_selector,
};
me.sync_fast_forward_button(ctx);
me.sync_remote_control_button(ctx);
me.update_context_window_button(ctx);
me.update_display_chips(&prompt, ctx);
me.update_ftu_callout_render_state(ctx);
@@ -1294,21 +1254,6 @@ impl AgentInputFooter {
#[cfg(not(feature = "voice_input"))]
None
}
AgentToolbarItemKind::ShareSession => {
let enabled = FeatureFlag::CreatingSharedSessions.is_enabled()
&& FeatureFlag::HOARemoteControl.is_enabled()
&& ContextFlag::CreateSharedSession.is_enabled();
if !enabled {
return None;
}
let button = if shared_status.is_sharer() {
&self.stop_remote_control_button
} else {
&self.start_remote_control_button
};
Some(ChildView::new(button).finish())
}
AgentToolbarItemKind::Settings => Some(ChildView::new(&self.settings_button).finish()),
// Handled by the available_in() guard above; included for exhaustiveness.
AgentToolbarItemKind::ModelSelector
@@ -1787,24 +1732,6 @@ impl AgentInputFooter {
});
}
/// Disable the start-remote-control chip and swap its tooltip when the
/// user is anonymous or logged out, since session sharing requires a
/// real account.
fn sync_remote_control_button(&self, ctx: &mut ViewContext<Self>) {
let login_required = AuthStateProvider::as_ref(ctx)
.get()
.is_anonymous_or_logged_out();
let tooltip = if login_required {
START_REMOTE_CONTROL_LOGIN_REQUIRED_TOOLTIP
} else {
START_REMOTE_CONTROL_TOOLTIP
};
self.start_remote_control_button.update(ctx, |button, ctx| {
button.set_disabled(login_required, ctx);
button.set_tooltip(Some(tooltip), ctx);
});
}
fn update_context_window_button(&mut self, ctx: &mut ViewContext<Self>) {
if let Some(conversation) =
BlocklistAIHistoryModel::as_ref(ctx).active_conversation(self.terminal_view_id)
@@ -1874,20 +1801,6 @@ impl AgentInputFooter {
.is_some();
has_conversation.then(|| ChildView::new(&self.context_window_button).finish())
}
AgentToolbarItemKind::ShareSession => {
let enabled = FeatureFlag::CreatingSharedSessions.is_enabled()
&& FeatureFlag::HOARemoteControl.is_enabled()
&& ContextFlag::CreateSharedSession.is_enabled();
if !enabled {
return None;
}
let button = if shared_status.is_sharer() {
&self.stop_remote_control_button
} else {
&self.start_remote_control_button
};
Some(ChildView::new(button).finish())
}
AgentToolbarItemKind::FastForwardToggle => FeatureFlag::FastForwardAutoexecuteButton
.is_enabled()
.then(|| ChildView::new(&self.fast_forward_button).finish()),
@@ -2144,8 +2057,6 @@ pub enum AgentInputFooterAction {
OpenPluginInstallInstructionsPane,
OpenPluginUpdateInstructionsPane,
DismissPluginChip,
StartRemoteControl,
StopRemoteControl,
OpenCodingAgentSettings,
ShowContextMenu {
position: Vector2F,
@@ -2330,12 +2241,6 @@ impl TypedActionView for AgentInputFooter {
}
ctx.notify();
}
AgentInputFooterAction::StartRemoteControl => {
ctx.emit(AgentInputFooterEvent::StartRemoteControl);
}
AgentInputFooterAction::StopRemoteControl => {
ctx.emit(AgentInputFooterEvent::StopRemoteControl);
}
AgentInputFooterAction::OpenCodingAgentSettings => {
#[cfg(not(target_family = "wasm"))]
ctx.dispatch_typed_action_deferred(WorkspaceAction::ScrollToSettingsWidget {
@@ -2361,8 +2266,6 @@ pub enum AgentInputFooterEvent {
InsertIntoCLIRichInput(String),
ToggleCodeReviewPane(CLIAgent),
ToggleFileExplorer(CLIAgent),
StartRemoteControl,
StopRemoteControl,
OpenRichInput,
HideRichInput,
ToggledChipMenu {
@@ -61,7 +61,6 @@ pub enum AgentToolbarItemKind {
// Renamed from ImageAttach; alias preserves existing user toolbar configs.
#[serde(alias = "ImageAttach")]
FileAttach,
ShareSession,
// CLI agent only opens settings to the Coding Agents section.
Settings,
@@ -73,7 +72,7 @@ pub enum AgentToolbarItemKind {
impl AgentToolbarItemKind {
pub fn available_in(&self) -> ToolbarAvailability {
match self {
Self::ContextChip(_) | Self::VoiceInput | Self::FileAttach | Self::ShareSession => {
Self::ContextChip(_) | Self::VoiceInput | Self::FileAttach => {
ToolbarAvailability::Both
}
Self::ModelSelector
@@ -95,7 +94,7 @@ impl AgentToolbarItemKind {
is_cloud_mode: bool,
) -> bool {
match self {
Self::Settings | Self::ShareSession | Self::FileExplorer => !status.is_viewer(),
Self::Settings | Self::FileExplorer => !status.is_viewer(),
Self::FileAttach => !status.is_viewer() || is_cloud_mode,
Self::FastForwardToggle => !status.is_viewer() || status.is_executor(),
Self::ContextChip(_)
@@ -117,7 +116,6 @@ impl AgentToolbarItemKind {
Self::ContextWindowUsage => "Context Usage",
Self::FileExplorer => "File Explorer",
Self::RichInput => "Rich Input",
Self::ShareSession => "/remote-control",
Self::Settings => "Settings",
Self::FastForwardToggle => "Fast Forward",
}
@@ -133,7 +131,6 @@ impl AgentToolbarItemKind {
Self::ContextWindowUsage => Some(Icon::ConversationContext0),
Self::FileExplorer => Some(Icon::FileCopy),
Self::RichInput => Some(Icon::TextInput),
Self::ShareSession => Some(Icon::Phone01),
Self::Settings => Some(Icon::Settings),
Self::FastForwardToggle => Some(Icon::FastForward),
}
@@ -172,11 +169,6 @@ impl AgentToolbarItemKind {
Self::ContextWindowUsage,
Self::ModelSelector,
];
if FeatureFlag::CreatingSharedSessions.is_enabled()
&& FeatureFlag::HOARemoteControl.is_enabled()
{
items.push(Self::ShareSession);
}
items.push(Self::VoiceInput);
items.push(Self::FileAttach);
items
@@ -198,11 +190,6 @@ impl AgentToolbarItemKind {
if FeatureFlag::FastForwardAutoexecuteButton.is_enabled() {
items.push(Self::FastForwardToggle);
}
if FeatureFlag::CreatingSharedSessions.is_enabled()
&& FeatureFlag::HOARemoteControl.is_enabled()
{
items.push(Self::ShareSession);
}
items
}
@@ -213,11 +200,6 @@ impl AgentToolbarItemKind {
Self::VoiceInput,
Self::ContextChip(ContextChipKind::GitDiffStats),
];
if FeatureFlag::CreatingSharedSessions.is_enabled()
&& FeatureFlag::HOARemoteControl.is_enabled()
{
items.push(Self::ShareSession);
}
items.push(Self::FileExplorer);
if FeatureFlag::CLIAgentRichInput.is_enabled() {
items.push(Self::RichInput);
@@ -247,11 +229,6 @@ impl AgentToolbarItemKind {
Self::VoiceInput,
Self::Settings,
]);
if FeatureFlag::CreatingSharedSessions.is_enabled()
&& FeatureFlag::HOARemoteControl.is_enabled()
{
items.push(Self::ShareSession);
}
items
}
+6 -6
View File
@@ -51,8 +51,8 @@ const SHOW_BOOTSTRAP_BLOCK_MENU_ITEM_NAME: &str = "Show Initialization Block";
const HIDE_BOOTSTRAP_BLOCK_MENU_ITEM_NAME: &str = "Hide Initialization Block";
const SHOW_IN_BAND_COMMAND_BLOCKS_MENU_ITEM_NAME: &str = "Show In-band Command Blocks";
const HIDE_IN_BAND_COMMAND_BLOCKS_MENU_ITEM_NAME: &str = "Hide In-band Command Blocks";
const SHOW_SSH_COMMAND_BLOCKS_MENU_ITEM_NAME: &str = "Show Warpified SSH Blocks";
const HIDE_SSH_COMMAND_BLOCKS_MENU_ITEM_NAME: &str = "Hide Warpified SSH Blocks";
const SHOW_SSH_COMMAND_BLOCKS_MENU_ITEM_NAME: &str = "Show Enhanced SSH Blocks";
const HIDE_SSH_COMMAND_BLOCKS_MENU_ITEM_NAME: &str = "Hide Enhanced SSH Blocks";
const EXPORT_DEFAULT_SETTINGS_CSV_MENU_ITEM_NAME: &str =
"Export Default Settings as CSV to home dir";
@@ -208,7 +208,7 @@ fn make_new_app_menu(ctx: &AppContext) -> Menu {
menu_items.push(MenuItem::Standard(StandardAction::ShowAllApps));
menu_items.push(MenuItem::Separator);
menu_items.push(MenuItem::Custom(CustomMenuItem::new(
"Set Warp as Default Terminal",
"Set Galaxy as Default Terminal",
move |ctx| {
DefaultTerminal::handle(ctx).update(ctx, |default_terminal, ctx| {
default_terminal.make_warp_default(ctx)
@@ -299,7 +299,7 @@ fn make_new_edit_menu(ctx: &AppContext) -> Menu {
];
let group_5 = vec![
MenuItem::Custom(CustomMenuItem::new(
"Use Warp's Prompt",
"Use Galaxy's Prompt",
move |ctx| ctx.dispatch_global_action("app:toggle_user_ps1", &()),
move |_props, ctx| MenuItemPropertyChanges {
checked: Some(
@@ -924,9 +924,9 @@ fn make_new_help_menu() -> Menu {
"Help",
vec![
feedback_menu_item(),
link_menu_item("Warp Documentation...", links::USER_DOCS_URL.into()),
link_menu_item("Galaxy Documentation...", links::USER_DOCS_URL.into()),
link_menu_item("GitHub Issues...", links::GITHUB_ISSUES_URL.into()),
link_menu_item("Warp Slack Community...", links::SLACK_URL.into()),
link_menu_item("Galaxy Slack Community...", links::SLACK_URL.into()),
],
)
}
+3 -3
View File
@@ -732,11 +732,11 @@ fn dmg_name(channel: Channel) -> String {
fn app_name_prefix(channel: Channel) -> &'static str {
match channel {
Channel::Stable => "GalaxyAI",
Channel::Preview => "GalaxyAIPreview",
Channel::Stable => "Galaxy",
Channel::Preview => "GalaxyPreview",
Channel::Local => "galaxy-ai",
Channel::Integration => "integration",
Channel::Dev => "GalaxyAIDev",
Channel::Dev => "GalaxyDev",
Channel::Oss => "galaxy-ai-oss",
}
}
+3 -3
View File
@@ -254,11 +254,11 @@ fn installer_file_name() -> Result<String> {
fn app_name_prefix(channel: Channel) -> &'static str {
match channel {
Channel::Stable => "GalaxyAI",
Channel::Preview => "GalaxyAIPreview",
Channel::Stable => "Galaxy",
Channel::Preview => "GalaxyPreview",
Channel::Local => "galaxy-ai",
Channel::Integration => "integration",
Channel::Dev => "GalaxyAIDev",
Channel::Dev => "GalaxyDev",
Channel::Oss => "galaxy-ai-oss",
}
}
-101
View File
@@ -1,101 +0,0 @@
//! Tools for loading a [`ChannelConfig`] from the external config generator binary.
//!
//! For non-bundled builds, the generator is invoked at runtime. For bundled builds, the config
//! is embedded at compile time via the build script.
use galaxy_core::channel::ChannelConfig;
/// The name of the config generator binary, expected to be on PATH.
const CONFIG_BIN_NAME: &str = "warp-channel-config";
#[macro_export]
#[cfg(windows)]
macro_rules! path_concat {
($path:expr, $file:expr) => {
concat!($path, "\\", $file)
};
}
#[macro_export]
#[cfg(not(windows))]
macro_rules! path_concat {
($path:expr, $file:expr) => {
concat!($path, "/", $file)
};
}
#[macro_export]
macro_rules! load_config {
($channel:expr) => {{
#[cfg(feature = "release_bundle")]
{
channel_config::load_config_from_embedded(include_str!($crate::path_concat!(
env!("OUT_DIR"),
concat!($channel, "_config.json")
)))
}
#[cfg(not(feature = "release_bundle"))]
{
channel_config::load_config_from_generator($channel)
}
}};
}
pub use load_config;
/// Invokes the config generator binary at runtime and deserializes its JSON output into a
/// [`ChannelConfig`].
#[cfg_attr(feature = "release_bundle", expect(dead_code))]
pub fn load_config_from_generator(channel: &str) -> ChannelConfig {
let target_family = if cfg!(target_family = "wasm") {
"wasm"
} else {
"native"
};
let target_os = if cfg!(target_os = "macos") {
"macos"
} else if cfg!(target_os = "windows") {
"windows"
} else {
"linux"
};
let output = command::blocking::Command::new(CONFIG_BIN_NAME)
.arg("--channel")
.arg(channel)
.arg("--target-family")
.arg(target_family)
.arg("--target-os")
.arg(target_os)
.output()
.unwrap_or_else(|err| {
if err.kind() == std::io::ErrorKind::NotFound {
panic!(
"\n\n'{CONFIG_BIN_NAME}' was not found on PATH.\n\n\
To build internal channels, run:\n\
\n\
\x20 ./script/install_channel_config\n\n"
)
}
panic!("Failed to execute '{CONFIG_BIN_NAME}': {err}")
});
if !output.status.success() {
let stderr = String::from_utf8_lossy(&output.stderr);
panic!("Config generator failed for channel '{channel}':\n{stderr}");
}
serde_json::from_slice(&output.stdout).unwrap_or_else(|err| {
let stdout = String::from_utf8_lossy(&output.stdout);
panic!("Failed to parse config generator output for channel '{channel}': {err}\nOutput:\n{stdout}")
})
}
/// Deserializes a [`ChannelConfig`] from a JSON string embedded at compile time.
///
/// This is used to load the channel configuration in release bundles, where configuration
/// is embedded at compile time instead of being generated at runtime.
#[cfg_attr(not(feature = "release_bundle"), expect(dead_code))]
pub fn load_config_from_embedded(json: &str) -> ChannelConfig {
serde_json::from_str(json)
.unwrap_or_else(|err| panic!("Failed to parse embedded channel config: {err}"))
}
+18 -10
View File
@@ -2,22 +2,30 @@
// builds. See https://doc.rust-lang.org/reference/runtime.html#the-windows_subsystem-attribute.
#![cfg_attr(feature = "release_bundle", windows_subsystem = "windows")]
#[path = "channel_config.rs"]
mod channel_config;
use anyhow::Result;
use galaxy_core::{
channel::{Channel, ChannelState},
features,
channel::{Channel, ChannelConfig, ChannelState, OzConfig, WarpServerConfig},
features, AppId,
};
// Simple wrapper around galaxy::run() for dev channel builds.
fn main() -> Result<()> {
ChannelState::set(
ChannelState::new(Channel::Dev, channel_config::load_config!("dev"))
.with_additional_features(features::DEBUG_FLAGS)
.with_additional_features(features::DOGFOOD_FLAGS)
.with_additional_features(features::PREVIEW_FLAGS),
ChannelState::new(
Channel::Dev,
ChannelConfig {
app_id: AppId::new("com", "samsung", "Galaxy-Dev"),
logfile_name: "galaxy.log".into(),
server_config: WarpServerConfig::production(),
oz_config: OzConfig::production(),
telemetry_config: None,
crash_reporting_config: None,
autoupdate_config: None,
mcp_static_config: None,
},
)
.with_additional_features(features::DEBUG_FLAGS)
.with_additional_features(features::DOGFOOD_FLAGS)
.with_additional_features(features::PREVIEW_FLAGS),
);
galaxy::run()
+20 -13
View File
@@ -1,19 +1,26 @@
#[path = "channel_config.rs"]
mod channel_config;
use anyhow::Result;
use galaxy_core::{
channel::{Channel, ChannelState},
features,
channel::{Channel, ChannelConfig, ChannelState, OzConfig, WarpServerConfig},
features, AppId,
};
fn main() -> Result<()> {
let config = channel_config::load_config!("local");
let mut state = ChannelState::new(Channel::Local, config)
.with_additional_features(features::DEBUG_FLAGS)
.with_additional_features(features::DOGFOOD_FLAGS)
.with_additional_features(features::PREVIEW_FLAGS);
let mut state = ChannelState::new(
Channel::Local,
ChannelConfig {
app_id: AppId::new("com", "samsung", "Galaxy-Local"),
logfile_name: "galaxy.log".into(),
server_config: WarpServerConfig::production(),
oz_config: OzConfig::production(),
telemetry_config: None,
crash_reporting_config: None,
autoupdate_config: None,
mcp_static_config: None,
},
)
.with_additional_features(features::DEBUG_FLAGS)
.with_additional_features(features::DOGFOOD_FLAGS)
.with_additional_features(features::PREVIEW_FLAGS);
// Enable sandbox telemetry feature flag if the env var is set.
if std::env::var("WITH_SANDBOX_TELEMETRY").is_ok() {
@@ -37,9 +44,9 @@ embed_plist::embed_info_plist_bytes!(r#"
<key>CFBundleDisplayName</key>
<string>Galaxy</string>
<key>CFBundleExecutable</key>
<string>galaxy-ai</string>
<string>galaxy-local</string>
<key>CFBundleIdentifier</key>
<string>com.samsung.GalaxyAI-Local</string>
<string>com.samsung.Galaxy-Local</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
+4 -4
View File
@@ -12,8 +12,8 @@ fn main() -> Result<()> {
let mut state = ChannelState::new(
Channel::Oss,
ChannelConfig {
app_id: AppId::new("com", "samsung", "GalaxyAI"),
logfile_name: "galaxy-ai.log".into(),
app_id: AppId::new("com", "samsung", "Galaxy"),
logfile_name: "galaxy.log".into(),
server_config: WarpServerConfig::production(),
oz_config: OzConfig::production(),
telemetry_config: None,
@@ -41,9 +41,9 @@ embed_plist::embed_info_plist_bytes!(r#"
<key>CFBundleDisplayName</key>
<string>Galaxy</string>
<key>CFBundleExecutable</key>
<string>galaxy-ai-oss</string>
<string>galaxy-oss</string>
<key>CFBundleIdentifier</key>
<string>com.samsung.GalaxyAI</string>
<string>com.samsung.Galaxy</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
+16 -9
View File
@@ -2,21 +2,28 @@
// builds. See https://doc.rust-lang.org/reference/runtime.html#the-windows_subsystem-attribute.
#![cfg_attr(feature = "release_bundle", windows_subsystem = "windows")]
#[path = "channel_config.rs"]
mod channel_config;
use anyhow::Result;
use galaxy_core::{
channel::{Channel, ChannelState},
features,
channel::{Channel, ChannelConfig, ChannelState, OzConfig, WarpServerConfig},
features, AppId,
};
// Simple wrapper around galaxy::run() for feature preview channel builds.
fn main() -> Result<()> {
ChannelState::set(
ChannelState::new(Channel::Preview, channel_config::load_config!("preview"))
.with_additional_features(features::PREVIEW_FLAGS)
.with_additional_features(&[features::FeatureFlag::ForceLogin]),
ChannelState::new(
Channel::Preview,
ChannelConfig {
app_id: AppId::new("com", "samsung", "Galaxy-Preview"),
logfile_name: "galaxy.log".into(),
server_config: WarpServerConfig::production(),
oz_config: OzConfig::production(),
telemetry_config: None,
crash_reporting_config: None,
autoupdate_config: None,
mcp_static_config: None,
},
)
.with_additional_features(features::PREVIEW_FLAGS),
);
galaxy::run()
+14 -6
View File
@@ -2,17 +2,25 @@
// builds. See https://doc.rust-lang.org/reference/runtime.html#the-windows_subsystem-attribute.
#![cfg_attr(feature = "release_bundle", windows_subsystem = "windows")]
#[path = "channel_config.rs"]
mod channel_config;
use anyhow::Result;
use galaxy_core::channel::{Channel, ChannelState};
use galaxy_core::{
channel::{Channel, ChannelConfig, ChannelState, OzConfig, WarpServerConfig},
AppId,
};
// Simple wrapper around galaxy::run() for stable channel builds.
fn main() -> Result<()> {
ChannelState::set(ChannelState::new(
Channel::Stable,
channel_config::load_config!("stable"),
ChannelConfig {
app_id: AppId::new("com", "samsung", "Galaxy"),
logfile_name: "galaxy.log".into(),
server_config: WarpServerConfig::production(),
oz_config: OzConfig::production(),
telemetry_config: None,
crash_reporting_config: None,
autoupdate_config: None,
mcp_static_config: None,
},
));
galaxy::run()
+1 -12
View File
@@ -654,18 +654,7 @@ impl DriveIndex {
.map(|space| DriveIndexSection::Space(*space))
.collect::<Vec<_>>();
if !user_workspaces.as_ref(ctx).has_teams() {
if user_workspaces
.as_ref(ctx)
.total_teammates_in_joinable_teams()
> 0
{
sections.insert(0, DriveIndexSection::JoinTeam);
sections.insert(1, DriveIndexSection::CreateATeam);
} else {
sections.insert(0, DriveIndexSection::CreateATeam);
}
}
// Team creation/joining removed — Galaxy operates without Warp's team API.
// Item UI state is attached by index, not by id, so this is re-initialized whenever there's any type of change
let item_mouse_states = num_cloud_objects_per_space
@@ -378,15 +378,6 @@ pub const USAGE: StaticCommand = StaticCommand {
argument: None,
};
pub const REMOTE_CONTROL: StaticCommand = StaticCommand {
name: "/remote-control",
description: "Start remote control for this session",
icon_path: "bundled/svg/phone-01.svg",
availability: Availability::AI_ENABLED,
auto_enter_ai_mode: false,
argument: None,
};
pub const COST: StaticCommand = StaticCommand {
name: "/cost",
description: "Toggle credit usage details",
@@ -536,12 +527,6 @@ fn all_commands() -> Vec<StaticCommand> {
commands.push(CREATE_DOCKER_SANDBOX);
}
if FeatureFlag::CreatingSharedSessions.is_enabled()
&& FeatureFlag::HOARemoteControl.is_enabled()
{
commands.push(REMOTE_CONTROL);
}
if FeatureFlag::Changelog.is_enabled() {
commands.push(CHANGELOG);
}
+2 -6
View File
@@ -6,7 +6,7 @@ use super::{
SettingsSection,
};
use crate::{
appearance::Appearance, channel::ChannelState, themes::theme::ColorScheme,
appearance::Appearance, channel::ChannelState,
workspace::WorkspaceAction,
};
use galaxyui::{
@@ -66,11 +66,7 @@ impl SettingsWidget for AboutPageWidget {
let theme = appearance.theme();
let ui_builder = appearance.ui_builder();
let image_path = if theme.inferred_color_scheme() == ColorScheme::LightOnDark {
"bundled/svg/bedrock.svg"
} else {
"bundled/svg/bedrock.svg"
};
let image_path = "bundled/svg/galaxy-logo.svg";
let version = ChannelState::app_version()
.unwrap_or(concat!("v", env!("CARGO_PKG_VERSION")));
+2 -2
View File
@@ -239,7 +239,7 @@ impl Display for SettingsSection {
SettingsSection::Knowledge => write!(f, "Knowledge"),
SettingsSection::ThirdPartyCLIAgents => write!(f, "Third party CLI agents"),
SettingsSection::Bedrock => write!(f, "AWS Bedrock"),
SettingsSection::Warpify => write!(f, "Galaxify"),
SettingsSection::Warpify => write!(f, "Galaxyize"),
SettingsSection::CodeIndexing => write!(f, "Indexing and projects"),
SettingsSection::EditorAndCodeReview => write!(f, "Editor and Code Review"),
_ => write!(f, "{self:?}"),
@@ -318,7 +318,7 @@ impl FromStr for SettingsSection {
"Features" => Ok(Self::Features),
"Keyboard shortcuts" => Ok(Self::Keybindings),
"Privacy" => Ok(Self::Privacy),
"Warpify" | "Galaxify" => Ok(Self::Warpify),
"Warpify" | "Galaxyize" => Ok(Self::Warpify),
"WarpDrive" | "Warp Drive" | "Galaxy Drive" => Ok(Self::WarpDrive),
// This page was called "Oz" at one point, keep for backward compatibility.
"Oz" | "Warp Agent" | "Galaxy Agent" => Ok(Self::WarpAgent),
+4 -4
View File
@@ -185,7 +185,7 @@ impl WarpifyPageView {
{
categories.push(
Category::new("SSH", vec![Box::new(SSHWidget::default())])
.with_subtitle("Galaxify your interactive SSH sessions."),
.with_subtitle("Galaxyize your interactive SSH sessions."),
);
}
PageType::new_categorized(categories, None)
@@ -532,7 +532,7 @@ impl TitleWidget {
fn render_top_of_page(&self, appearance: &Appearance, _app: &AppContext) -> Box<dyn Element> {
let warpify_description = vec![
FormattedTextFragment::plain_text(
"Configure whether Galaxy attempts to \u{201c}Galaxify\u{201d} (add support for blocks, \
"Configure whether Galaxy attempts to \u{201c}Galaxyize\u{201d} (add support for blocks, \
input modes, etc) certain shells. ",
),
FormattedTextFragment::hyperlink(
@@ -556,7 +556,7 @@ impl TitleWidget {
.finish();
Flex::column()
.with_child(render_page_title("Galaxify", HEADER_FONT_SIZE, appearance))
.with_child(render_page_title("Galaxyize", HEADER_FONT_SIZE, appearance))
.with_child(warpify_description)
.finish()
}
@@ -682,7 +682,7 @@ impl SettingsWidget for SSHWidget {
&WarpifySettings::as_ref(app).enable_ssh_warpification,
move || {
render_body_item::<WarpifyPageAction>(
"Galaxify SSH Sessions".into(),
"Galaxyize SSH Sessions".into(),
None,
LocalOnlyIconState::for_setting(
EnableSshWarpification::storage_key(),
-4
View File
@@ -2201,10 +2201,6 @@ impl Input {
AgentInputFooterEvent::OpenRichInput | AgentInputFooterEvent::HideRichInput => {
ctx.emit(Event::Escape);
}
AgentInputFooterEvent::StartRemoteControl
| AgentInputFooterEvent::StopRemoteControl => {
// Handled by UseAgentToolbar's subscription, not here.
}
// WriteToPty, InsertIntoCLIRichInput, ToggleCodeReviewPane, and ToggleFileExplorer
// are handled by UseAgentToolbar's subscription, not here.
AgentInputFooterEvent::WriteToPty(_)
@@ -674,23 +674,6 @@ impl Input {
_usage if command.name == commands::USAGE.name => {
ctx.dispatch_typed_action(&TerminalAction::OpenBillingAndUsagePane);
}
_remote_control if command.name == commands::REMOTE_CONTROL.name => {
if !FeatureFlag::CreatingSharedSessions.is_enabled()
|| !FeatureFlag::HOARemoteControl.is_enabled()
{
return false;
}
if self
.model
.lock()
.shared_session_status()
.is_sharer_or_viewer()
{
show_error_toast("Session is already being shared".to_owned(), ctx);
return true;
}
ctx.emit(Event::StartRemoteControl);
}
_cost if command.name == commands::COST.name => {
let history = BlocklistAIHistoryModel::handle(ctx);
let conversation = history
+2 -2
View File
@@ -35,7 +35,7 @@ const UNSUPPORTED_TMUX_VERSION_ERROR: &str =
"The tmux version available on the remote machine is below 3.0. Please install tmux 3.0 or greater using a different method and try again.";
const TMUX_FAILED_ERROR: &str =
"tmux failed to execute on the remote machine. Please re-install tmux and try again.";
const WARPIFY_TIMEOUT_ERROR: &str = "Galaxifying the session hit a timeout.";
const WARPIFY_TIMEOUT_ERROR: &str = "Galaxyizeing the session hit a timeout.";
const UNSUPPORTED_SHELL_ERROR: &str =
"Unsupported shell. Please set bash, zsh, or fish as your default shell and try again.";
const TMUX_INSTALL_FAILED_ERROR: &str =
@@ -258,7 +258,7 @@ impl View for SshErrorBlock {
ButtonVariant::Accent,
self.warpify_without_tmux_button_mouse_state.clone(),
)
.with_centered_text_label("Galaxify without TMUX".into())
.with_centered_text_label("Galaxyize without TMUX".into())
.with_style(UiComponentStyles {
font_size: Some(appearance.monospace_font_size()),
..Default::default()
+1 -1
View File
@@ -67,7 +67,7 @@ impl Entity for SshWarpifyBlock {
impl SshWarpifyBlock {
fn render_title_ui(&self, theme: &WarpTheme, appearance: &Appearance) -> Box<dyn Element> {
let icon = Icon::new(UiIcon::Warp.into(), theme.active_ui_detail());
warpify::render::header_row("Galaxifying SSH Session...", icon, theme, appearance)
warpify::render::header_row("Galaxyizeing SSH Session...", icon, theme, appearance)
}
}
@@ -97,8 +97,8 @@ impl WarpifyBannerState {
pub fn title(&self) -> &str {
match &self.mode {
WarpificationMode::Ssh { .. } => "Galaxify SSH session",
WarpificationMode::Subshell { .. } => "Galaxify subshell",
WarpificationMode::Ssh { .. } => "Galaxyize SSH session",
WarpificationMode::Subshell { .. } => "Galaxyize subshell",
}
}
+2 -2
View File
@@ -341,7 +341,7 @@ pub fn init(app: &mut AppContext) {
),
EditableBinding::new(
"terminal:warpify_subshell",
"Galaxify subshell",
"Galaxyize subshell",
TerminalAction::TriggerSubshellBootstrap,
)
.with_key_binding("ctrl-i")
@@ -350,7 +350,7 @@ pub fn init(app: &mut AppContext) {
),
EditableBinding::new(
"terminal:warpify_ssh_session",
"Galaxify ssh session",
"Galaxyize ssh session",
TerminalAction::WarpifySSHSession,
)
.with_key_binding("ctrl-i")
@@ -9,9 +9,7 @@ use crate::ai::blocklist::agent_view::agent_input_footer::{
AgentInputFooter, AgentInputFooterEvent,
};
use crate::terminal::cli_agent_sessions::{CLIAgentInputEntrypoint, CLIAgentSessionsModel};
use crate::terminal::shared_session::{SharedSessionActionSource, SharedSessionScrollbackType};
use base64::Engine;
use session_sharing_protocol::sharer::SessionSourceType;
use galaxyui::clipboard::{ClipboardContent, ImageData};
mod warpify_footer;
@@ -231,21 +229,6 @@ impl TerminalView {
UseAgentToolbarEvent::ToggleFileExplorer(cli_agent) => {
self.toggle_file_tree(Some((*cli_agent).into()), ctx);
}
UseAgentToolbarEvent::StartRemoteControl { scrollback_type } => {
self.auto_stop_sharing_on_cli_end =
*scrollback_type == SharedSessionScrollbackType::None;
self.attempt_to_share_session(
*scrollback_type,
Some(SharedSessionActionSource::FooterChip),
SessionSourceType::default(),
true,
ctx,
);
}
UseAgentToolbarEvent::StopRemoteControl => {
self.auto_stop_sharing_on_cli_end = false;
self.stop_sharing_session(SharedSessionActionSource::FooterChip, ctx);
}
UseAgentToolbarEvent::OpenRichInput => {
if self.has_active_cli_agent_input_session(ctx) {
self.close_cli_agent_rich_input_and_disable_auto_toggle(ctx);
@@ -1074,17 +1057,6 @@ impl UseAgentToolbar {
AgentInputFooterEvent::ToggleFileExplorer(agent) => {
ctx.emit(UseAgentToolbarEvent::ToggleFileExplorer(*agent));
}
AgentInputFooterEvent::StartRemoteControl => {
let scrollback_type = if self.cli_agent(ctx).is_some() {
SharedSessionScrollbackType::None
} else {
SharedSessionScrollbackType::All
};
ctx.emit(UseAgentToolbarEvent::StartRemoteControl { scrollback_type });
}
AgentInputFooterEvent::StopRemoteControl => {
ctx.emit(UseAgentToolbarEvent::StopRemoteControl);
}
AgentInputFooterEvent::OpenRichInput => {
ctx.emit(UseAgentToolbarEvent::OpenRichInput);
}
@@ -1182,12 +1154,6 @@ pub enum UseAgentToolbarEvent {
ToggleCodeReviewPane(CLIAgent),
/// Toggle the file explorer (from CLI agent view).
ToggleFileExplorer(CLIAgent),
/// Start remote control (one-click share without modal).
StartRemoteControl {
scrollback_type: SharedSessionScrollbackType,
},
/// Stop remote control (stop the active shared session).
StopRemoteControl,
/// Open the rich input editor for composing a prompt.
OpenRichInput,
/// Hide the rich input editor (same as Escape).
@@ -33,7 +33,7 @@ impl WarpifyFooterView {
let button_size = ButtonSize::XSmall;
let warpify_button = ctx.add_typed_action_view(|_ctx| {
ActionButton::new("Galaxify subshell", AgentFooterButtonTheme::new(None))
ActionButton::new("Galaxyize subshell", AgentFooterButtonTheme::new(None))
.with_icon(Icon::Warp)
.with_size(button_size)
.with_tooltip("Enable Galaxy shell integration in this session")
@@ -76,9 +76,9 @@ impl WarpifyFooterView {
pub fn set_mode(&mut self, mode: WarpificationMode, ctx: &mut ViewContext<Self>) {
let (label, binding_name) = match mode {
WarpificationMode::Ssh { .. } => {
("Galaxify SSH session", "terminal:warpify_ssh_session")
("Galaxyize SSH session", "terminal:warpify_ssh_session")
}
WarpificationMode::Subshell { .. } => ("Galaxify subshell", "terminal:warpify_subshell"),
WarpificationMode::Subshell { .. } => ("Galaxyize subshell", "terminal:warpify_subshell"),
};
self.warpify_button.update(ctx, |button, ctx| {
button.set_label(label, ctx);
+6 -32
View File
@@ -17327,37 +17327,11 @@ impl Workspace {
);
}
if FeatureFlag::AvatarInTabBar.is_enabled() {
let resource_center_closed = !self.current_workspace_state.is_resource_center_open;
if resource_center_closed && ContextFlag::WarpEssentials.is_enabled() {
target.add_child(
Container::new(self.render_resource_center_button(appearance, ctx))
.with_margin_left(TAB_BAR_PADDING_LEFT)
.finish(),
);
}
target.add_child(
Container::new(self.render_settings_button(appearance))
.with_margin_left(TAB_BAR_PADDING_LEFT)
.finish(),
);
} else {
let resource_center_closed = !self.current_workspace_state.is_resource_center_open;
if resource_center_closed && ContextFlag::WarpEssentials.is_enabled() {
target.add_child(
Container::new(self.render_resource_center_button(appearance, ctx))
.with_margin_left(TAB_BAR_PADDING_LEFT)
.finish(),
);
}
target.add_child(
Container::new(self.render_settings_button(appearance))
.with_margin_left(TAB_BAR_PADDING_LEFT)
.finish(),
);
}
target.add_child(
Container::new(self.render_settings_button(appearance))
.with_margin_left(TAB_BAR_PADDING_LEFT)
.finish(),
);
if self.auth_state.is_anonymous_or_logged_out()
&& !FeatureFlag::OpenWarpNewSettingsModes.is_enabled()
@@ -17798,7 +17772,7 @@ impl Workspace {
Align::new(
self.render_tab_bar_icon_button(
appearance,
icons::Icon::Gear,
icons::Icon::Stars,
&self.mouse_states.settings_icon,
WorkspaceAction::ShowSettings,
"Settings".to_string(),