From 148c97eab11ddc0f0378e661d13cfe84eca87410 Mon Sep 17 00:00:00 2001 From: Ryan Ward Date: Tue, 23 Jun 2026 15:28:59 -0500 Subject: [PATCH] Fix View Options popup not responding to clicks Remove duplicate popup rendering from render_vertical_tabs_panel. The popup was rendered both inside the panel's stack AND at the workspace level in a Dismiss overlay, causing event dispatch conflicts due to shared MouseStateHandle instances between the two identical popup trees. --- WARP.md | 42 +- .../blocklist/controller/response_stream.rs | 15 +- app/src/ai/llms.rs | 161 ++++-- app/src/cloud_object/model/model_test.rs | 4 +- app/src/drive/settings.rs | 8 +- app/src/search/command_search/settings.rs | 4 +- .../cloud_objects/update_manager_test.rs | 14 +- app/src/settings/accessibility.rs | 4 +- app/src/settings/ai.rs | 158 +++--- app/src/settings/alias_expansion.rs | 4 +- app/src/settings/block_visibility.rs | 8 +- app/src/settings/changelog.rs | 4 +- app/src/settings/cloud_preferences.rs | 4 +- app/src/settings/code.rs | 12 +- app/src/settings/editor.rs | 20 +- app/src/settings/emacs_bindings.rs | 4 +- app/src/settings/font.rs | 6 +- app/src/settings/input.rs | 30 +- app/src/settings/input_mode.rs | 4 +- app/src/settings/pane.rs | 6 +- app/src/settings/privacy.rs | 12 +- app/src/settings/same_line_prompt_block.rs | 4 +- app/src/settings/select.rs | 8 +- app/src/settings/ssh.rs | 4 +- app/src/settings/theme.rs | 8 +- app/src/settings/vim_banner.rs | 4 +- app/src/terminal/alt_screen_reporting.rs | 8 +- app/src/terminal/block_list_settings.rs | 8 +- app/src/terminal/general_settings.rs | 28 +- app/src/terminal/keys_settings.rs | 14 +- app/src/terminal/ligature_settings.rs | 4 +- app/src/terminal/safe_mode_settings.rs | 8 +- app/src/terminal/session_settings.rs | 24 +- app/src/terminal/settings.rs | 12 +- app/src/terminal/shared_session/settings.rs | 12 +- app/src/terminal/warpify/settings.rs | 14 +- app/src/undo_close/settings.rs | 6 +- app/src/util/file/external_editor/settings.rs | 10 +- app/src/window_settings.rs | 16 +- app/src/workflows/aliases.rs | 4 +- app/src/workspace/tab_settings.rs | 36 +- app/src/workspace/view/vertical_tabs.rs | 21 +- script/build-and-deploy-hermes.sh | 26 + script/build-and-deploy-hermes/.gitignore | 2 + script/build-and-deploy-hermes/package.json | 21 + script/build-and-deploy-hermes/src/index.tsx | 472 ++++++++++++++++ script/build-and-deploy-hermes/tsconfig.json | 14 + script/build-and-deploy-hermes/yarn.lock | 504 ++++++++++++++++++ script/install-galaxy.sh | 110 +--- 49 files changed, 1507 insertions(+), 419 deletions(-) create mode 100755 script/build-and-deploy-hermes.sh create mode 100644 script/build-and-deploy-hermes/.gitignore create mode 100644 script/build-and-deploy-hermes/package.json create mode 100644 script/build-and-deploy-hermes/src/index.tsx create mode 100644 script/build-and-deploy-hermes/tsconfig.json create mode 100644 script/build-and-deploy-hermes/yarn.lock diff --git a/WARP.md b/WARP.md index 099a1554..647d9777 100644 --- a/WARP.md +++ b/WARP.md @@ -76,17 +76,45 @@ Provider dispatch: response_stream.rs → resolve_provider_config() → Provider **Provider settings** (in settings TOML): - `ai.bedrock.enabled` — Use AWS Bedrock directly (default: true) -- `ai.openai.enabled` — Use OpenAI-compatible endpoint, e.g. LiteLLM (default: false, takes priority) -- `ai.openai.base_url` — Endpoint URL (default: `http://localhost:4000/v1`) -- `ai.openai.api_key` — Optional API key (stored in keychain) +- `ai.openai.enabled` — Use OpenAI-compatible endpoint(s) (default: false, takes priority over Bedrock) +- `ai.openai.base_url` — Legacy single-provider endpoint URL (default: `http://localhost:4000/v1`) +- `ai.openai.api_key` — Legacy single-provider API key (stored in keychain) - `ai.openai.model` — Model name override sent to the endpoint -- `ai.openai.models` — Array of `OpenAIModelConfig` objects (model_id, display_name, vision_supported, context_size, provider) +- `ai.openai.models` — Legacy single-provider model list (`Vec`) +- `ai.providers` — **Multi-provider config** (`Vec`): each entry has `name`, `base_url`, `api_key`, `models[]` + +**Multi-provider example** (settings.toml): +```toml +[ai.openai] +enabled = true + +[[ai.providers]] +name = "LiteLLM" +base_url = "http://localhost:4000/v1" +api_key = "sk-..." + +[[ai.providers.models]] +model_id = "claude-sonnet-4-20250514[1m]" +display_name = "Claude Sonnet 4 (1M)" +context_size = 1000000 + +[[ai.providers]] +name = "Ollama (Local)" +base_url = "http://localhost:11434/v1" + +[[ai.providers.models]] +model_id = "llama3.2" +display_name = "Llama 3.2" +context_size = 128000 +``` **OpenAI/LiteLLM model discovery**: - Models can be auto-fetched from the `/models` endpoint via the Settings > OpenAI / LiteLLM page -- Fetched models include context window sizes from `max_model_len` / `context_window` / `max_input_tokens` fields -- Models injected into `LLMPreferences` use `LLMProvider::LiteLLM` and show the OpenAI icon in the picker -- Provider is inferred from model ID (claude→anthropic, gpt→openai, gemini→google) +- For each model, the system probes `{model_id}[1m]` with a minimal chat completion request +- If the `[1m]` variant is accepted (HTTP 200 or 429), it's used with 1M context window +- Otherwise, the base model ID is used with its reported context size +- Models injected via `ai.providers[]` are routed to their specific endpoint (per-model routing map) +- Provider name shown as the description label in the model picker; icon shows OpenAI logo for all OpenAI-compatible providers Key invariants: - Known tools are in `KNOWN_TOOLS` constant in `response_translator.rs` diff --git a/app/src/ai/blocklist/controller/response_stream.rs b/app/src/ai/blocklist/controller/response_stream.rs index cbcf4d25..b58254b4 100644 --- a/app/src/ai/blocklist/controller/response_stream.rs +++ b/app/src/ai/blocklist/controller/response_stream.rs @@ -90,6 +90,19 @@ impl ResponseStream { // Check if OpenAI/LiteLLM provider is enabled if *settings.openai_enabled.value() { + // First, check if this specific model has a per-provider routing entry + // (from the multi-provider `ai.providers[]` config or legacy `ai.openai.models`). + use crate::ai::llms::LLMPreferences; + let prefs = LLMPreferences::as_ref(ctx); + if let Some(config) = prefs.openai_client_config_for_model(model_id) { + return ProviderConfig::OpenAI(OpenAIClientConfig { + base_url: config.base_url.clone(), + api_key: config.api_key.clone(), + model: Some(model_id.to_string()), + }); + } + + // Fall back to the legacy single-provider config let base_url = settings.openai_base_url.value().clone(); let api_key = { let key = settings.openai_api_key.value().clone(); @@ -99,8 +112,6 @@ impl ResponseStream { Some(key) } }; - // Use the model override from settings if set, otherwise use the selected model ID. - // This allows LiteLLM models to pass through their actual model_id to the proxy. let model = { let m = settings.openai_model.value().clone(); if m.is_empty() { diff --git a/app/src/ai/llms.rs b/app/src/ai/llms.rs index aaff39ab..a450e01e 100644 --- a/app/src/ai/llms.rs +++ b/app/src/ai/llms.rs @@ -16,7 +16,10 @@ use crate::{ network::{NetworkStatus, NetworkStatusEvent, NetworkStatusKind}, report_error, server::server_api::ServerApiProvider, - settings::ai::{AISettings, AISettingsChangedEvent, BedrockModelConfig, OpenAIModelConfig}, + settings::ai::{ + AISettings, AISettingsChangedEvent, BedrockModelConfig, OpenAIModelConfig, + OpenAIProviderConfig, + }, workspaces::user_workspaces::{UserWorkspaces, UserWorkspacesEvent}, }; @@ -512,6 +515,10 @@ pub struct LLMPreferences { models_by_feature: ModelsByFeature, last_update: Option, base_llm_for_terminal_view: HashMap, + /// Maps model IDs from OpenAI-compatible providers to their client configs. + /// Used by `resolve_provider_config` to route requests to the correct endpoint. + #[cfg(not(target_family = "wasm"))] + openai_provider_routing: HashMap, } impl LLMPreferences { @@ -560,6 +567,7 @@ impl LLMPreferences { AISettingsChangedEvent::OpenAIEnabled { .. } | AISettingsChangedEvent::OpenAIModels { .. } | AISettingsChangedEvent::OpenAIBaseUrl { .. } + | AISettingsChangedEvent::OpenAIProviders { .. } ) { me.inject_openai_models(ctx); ctx.emit(LLMPreferencesEvent::UpdatedAvailableLLMs); @@ -572,6 +580,8 @@ impl LLMPreferences { models_by_feature, last_update: None, base_llm_for_terminal_view, + #[cfg(not(target_family = "wasm"))] + openai_provider_routing: HashMap::new(), }; // In agent mode eval builds, eagerly kick off a fetch of the model list from the server @@ -799,9 +809,18 @@ impl LLMPreferences { } } - /// Injects models from the OpenAI-compatible (LiteLLM) provider into the available model lists. + /// Injects models from OpenAI-compatible providers into the available model lists. + /// + /// Supports two configuration paths: + /// 1. Legacy single-provider: `ai.openai.{base_url, api_key, models}` + /// 2. Multi-provider: `ai.providers[]` (each with name, base_url, api_key, models) + /// + /// Also populates `openai_provider_routing` so that `resolve_provider_config` can + /// dispatch requests to the correct endpoint per model. #[cfg(not(target_family = "wasm"))] fn inject_openai_models(&mut self, ctx: &AppContext) { + use super::openai::client::OpenAIClientConfig; + // Remove any previously injected LiteLLM models self.models_by_feature .agent_mode @@ -814,65 +833,119 @@ impl LLMPreferences { if let Some(ref mut cli) = self.models_by_feature.cli_agent { cli.choices.retain(|m| m.provider != LLMProvider::LiteLLM); } + self.openai_provider_routing.clear(); let settings = AISettings::as_ref(ctx); if !*settings.openai_enabled.value() { return; } - let user_models: Vec = settings.openai_models.value().clone(); - if user_models.is_empty() { + // Collect all (provider_name, base_url, api_key, models) tuples from both config paths. + let mut provider_entries: Vec<(String, String, Option, Vec)> = + Vec::new(); + + // Path 1: Multi-provider `ai.providers[]` + let providers: Vec = settings.openai_providers.value().clone(); + for provider in providers { + if provider.models.is_empty() { + continue; + } + provider_entries.push(( + provider.name, + provider.base_url, + provider.api_key, + provider.models, + )); + } + + // Path 2: Legacy single-provider `ai.openai.{base_url, models}` + let legacy_models: Vec = settings.openai_models.value().clone(); + if !legacy_models.is_empty() { + let base_url = settings.openai_base_url.value().clone(); + let api_key = { + let key = settings.openai_api_key.value().clone(); + if key.is_empty() { + None + } else { + Some(key) + } + }; + let name = + if base_url.contains("localhost") || base_url.contains("127.0.0.1") { + "LiteLLM (local)".to_string() + } else { + "LiteLLM".to_string() + }; + provider_entries.push((name, base_url, api_key, legacy_models)); + } + + if provider_entries.is_empty() { return; } - let base_url = settings.openai_base_url.value().clone(); - let description_label = if base_url.contains("localhost") || base_url.contains("127.0.0.1") - { - "LiteLLM (local)".to_string() - } else { - "LiteLLM".to_string() - }; - - for model in &user_models { - let llm_info = LLMInfo { - id: LLMId::from(model.model_id.as_str()), - display_name: model.display_name.clone(), - base_model_name: model.display_name.clone(), - reasoning_level: None, - usage_metadata: LLMUsageMetadata { - request_multiplier: 1, - credit_multiplier: None, - }, - description: Some(description_label.clone()), - disable_reason: None, - vision_supported: model.vision_supported, - spec: None, - provider: LLMProvider::LiteLLM, - host_configs: HashMap::from([( - LLMModelHost::DirectApi, - RoutingHostConfig { - enabled: true, - model_routing_host: LLMModelHost::DirectApi, - }, - )]), - discount_percentage: None, + let mut total_injected = 0; + for (provider_name, base_url, api_key, models) in provider_entries { + let client_config = OpenAIClientConfig { + base_url: base_url.clone(), + api_key: api_key.clone(), + model: None, // filled per-request from model_id }; - self.models_by_feature - .agent_mode - .choices - .push(llm_info.clone()); - self.models_by_feature.coding.choices.push(llm_info.clone()); - if let Some(ref mut cli) = self.models_by_feature.cli_agent { - cli.choices.push(llm_info); + + for model in &models { + // Register the routing entry + self.openai_provider_routing + .insert(model.model_id.clone(), client_config.clone()); + + let llm_info = LLMInfo { + id: LLMId::from(model.model_id.as_str()), + display_name: model.display_name.clone(), + base_model_name: model.display_name.clone(), + reasoning_level: None, + usage_metadata: LLMUsageMetadata { + request_multiplier: 1, + credit_multiplier: None, + }, + description: Some(provider_name.clone()), + disable_reason: None, + vision_supported: model.vision_supported, + spec: None, + provider: LLMProvider::LiteLLM, + host_configs: HashMap::from([( + LLMModelHost::DirectApi, + RoutingHostConfig { + enabled: true, + model_routing_host: LLMModelHost::DirectApi, + }, + )]), + discount_percentage: None, + }; + self.models_by_feature + .agent_mode + .choices + .push(llm_info.clone()); + self.models_by_feature.coding.choices.push(llm_info.clone()); + if let Some(ref mut cli) = self.models_by_feature.cli_agent { + cli.choices.push(llm_info); + } + total_injected += 1; } } log::info!( - "[openai/litellm] Injected {} model(s) into available choices", - user_models.len() + "[openai/litellm] Injected {total_injected} model(s) into available choices" ); } + /// Returns the OpenAI client config for a given model ID, if it was injected + /// from an OpenAI-compatible provider. + #[cfg(not(target_family = "wasm"))] + pub fn openai_client_config_for_model( + &self, + model_id: &str, + ) -> Option<&super::openai::client::OpenAIClientConfig> { + self.openai_provider_routing.get(model_id) + } + /// Returns the `LLMInfo` for the base LLM to be used for an Agent Mode request. pub fn get_active_base_model<'a>( &'a self, diff --git a/app/src/cloud_object/model/model_test.rs b/app/src/cloud_object/model/model_test.rs index 0fd508ba..72a32b6d 100644 --- a/app/src/cloud_object/model/model_test.rs +++ b/app/src/cloud_object/model/model_test.rs @@ -1,7 +1,7 @@ use chrono::Utc; use galaxyui::{App, ModelHandle}; use lazy_static::lazy_static; -use settings::{RespectUserSyncSetting, SyncToCloud}; +use settings::{SyncToCloud}; use crate::auth::auth_manager::AuthManager; use crate::auth::user::TEST_USER_UID; @@ -507,7 +507,7 @@ fn test_create_json_object() { Preference::new( "test_storage_key".to_owned(), "{\"test_key\": \"test_value\"}", - SyncToCloud::Globally(RespectUserSyncSetting::Yes), + SyncToCloud::Never, ) .expect("error creating preference"), ), diff --git a/app/src/drive/settings.rs b/app/src/drive/settings.rs index ddf2a612..2449040a 100644 --- a/app/src/drive/settings.rs +++ b/app/src/drive/settings.rs @@ -1,6 +1,6 @@ use galaxy_core::features::FeatureFlag; use settings::{ - macros::define_settings_group, RespectUserSyncSetting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, SupportedPlatforms, SyncToCloud, }; use super::DriveSortOrder; @@ -12,7 +12,7 @@ define_settings_group!(WarpDriveSettings, settings: [ type: DriveSortOrder, default: DriveSortOrder::ByObjectType, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "warp_drive.sorting_choice", description: "The sort order for items in Galaxy Drive.", @@ -21,7 +21,7 @@ define_settings_group!(WarpDriveSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, }, // Controls whether Warp Drive appears in the tools panel, command palette, and command search. @@ -29,7 +29,7 @@ define_settings_group!(WarpDriveSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "warp_drive.enabled", description: "Whether Galaxy Drive is enabled.", diff --git a/app/src/search/command_search/settings.rs b/app/src/search/command_search/settings.rs index ca1b864d..26d814d2 100644 --- a/app/src/search/command_search/settings.rs +++ b/app/src/search/command_search/settings.rs @@ -1,5 +1,5 @@ use settings::{ - macros::define_settings_group, RespectUserSyncSetting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, SupportedPlatforms, SyncToCloud, }; define_settings_group!(CommandSearchSettings, settings: [ @@ -7,7 +7,7 @@ define_settings_group!(CommandSearchSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "workflows.show_global_workflows_in_universal_search", description: "Whether to show global workflows in universal search results.", diff --git a/app/src/server/cloud_objects/update_manager_test.rs b/app/src/server/cloud_objects/update_manager_test.rs index 82948927..08283b8a 100644 --- a/app/src/server/cloud_objects/update_manager_test.rs +++ b/app/src/server/cloud_objects/update_manager_test.rs @@ -5,7 +5,7 @@ use futures_lite::future; use galaxy_core::features::FeatureFlag; use galaxy_graphql::{object_permissions::AccessLevel, scalars::time::ServerTimestamp}; use galaxyui::{App, ModelHandle, SingletonEntity}; -use settings::{RespectUserSyncSetting, SyncToCloud}; +use settings::{SyncToCloud}; #[cfg(test)] use crate::server::server_api::object::MockObjectClient; @@ -745,7 +745,7 @@ fn test_sync_state_after_creation_item_not_in_sync_queue_generic_object() { Preference::new( "foo".to_owned(), "{\"test_key\": \"test_value\"}", - SyncToCloud::Globally(RespectUserSyncSetting::Yes), + SyncToCloud::Never, ) .expect("error creating preference"), ), @@ -1290,7 +1290,7 @@ fn test_bulk_create_generic_string_objects() { Preference::new( "storage_key_1".to_string(), "{\"test_key\": \"test_value_1\"}", - SyncToCloud::Globally(RespectUserSyncSetting::Yes), + SyncToCloud::Never, ) .expect("error creating preference"), ), @@ -1303,7 +1303,7 @@ fn test_bulk_create_generic_string_objects() { Preference::new( "storage_key_2".to_string(), "{\"test_key\": \"test_value_2\"}", - SyncToCloud::Globally(RespectUserSyncSetting::Yes), + SyncToCloud::Never, ) .expect("error creating preference"), ), @@ -1444,7 +1444,7 @@ fn test_sync_state_after_update_item_not_in_sync_queue_generic_string_object() { Preference::new( "foo".to_owned(), "{\"test_key\": \"test_value\"}", - SyncToCloud::Globally(RespectUserSyncSetting::Yes), + SyncToCloud::Never, ) .expect("error creating preference"), ), @@ -1458,7 +1458,7 @@ fn test_sync_state_after_update_item_not_in_sync_queue_generic_string_object() { Preference::new( "foo".to_owned(), "{\"test_key\": \"test_value_2\"}", - SyncToCloud::Globally(RespectUserSyncSetting::Yes), + SyncToCloud::Never, ) .expect("error creating preference"), ), @@ -2679,7 +2679,7 @@ fn test_pending_metadata_update_with_polling() { Preference::new( "test_storage_key".to_string(), "{\"test_key\": \"test_value\"}", - SyncToCloud::Globally(RespectUserSyncSetting::Yes), + SyncToCloud::Never, ) .expect("error creating preference"), ), diff --git a/app/src/settings/accessibility.rs b/app/src/settings/accessibility.rs index d60c9868..d0634671 100644 --- a/app/src/settings/accessibility.rs +++ b/app/src/settings/accessibility.rs @@ -1,6 +1,6 @@ use galaxyui::accessibility::AccessibilityVerbosity; use settings::{ - macros::define_settings_group, RespectUserSyncSetting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, SupportedPlatforms, SyncToCloud, }; define_settings_group!(AccessibilitySettings, settings: [ @@ -8,7 +8,7 @@ define_settings_group!(AccessibilitySettings, settings: [ type: AccessibilityVerbosity, default: AccessibilityVerbosity::default(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, storage_key: "AccessibilityVerbosity", toml_path: "accessibility.accessibility_verbosity", diff --git a/app/src/settings/ai.rs b/app/src/settings/ai.rs index 7df03be0..cebd9450 100644 --- a/app/src/settings/ai.rs +++ b/app/src/settings/ai.rs @@ -25,7 +25,7 @@ use regex::Regex; use galaxy_core::execution_mode::AppExecutionMode; use galaxy_core::features::FeatureFlag; use settings::{ - define_settings_group, RespectUserSyncSetting, Setting, SupportedPlatforms, SyncToCloud, + define_settings_group, Setting, SupportedPlatforms, SyncToCloud, }; use serde::{de::Deserializer, Deserialize, Serialize}; @@ -311,7 +311,7 @@ settings::macros::implement_setting_for_enum!( DefaultSessionMode, AISettings, SupportedPlatforms::ALL, - SyncToCloud::Globally(RespectUserSyncSetting::Yes), + SyncToCloud::Never, private: false, toml_path: "general.default_session_mode", description: "The default mode for new terminal sessions.", @@ -361,7 +361,7 @@ settings::macros::implement_setting_for_enum!( ThinkingDisplayMode, AISettings, SupportedPlatforms::ALL, - SyncToCloud::Globally(RespectUserSyncSetting::Yes), + SyncToCloud::Never, private: false, toml_path: "agents.warp_agent.other.thinking_display_mode", description: "Controls how agent thinking traces are displayed after streaming.", @@ -422,7 +422,7 @@ settings::macros::implement_setting_for_enum!( BedrockAuthMethod, AISettings, SupportedPlatforms::DESKTOP, - SyncToCloud::Globally(RespectUserSyncSetting::Yes), + SyncToCloud::Never, private: false, toml_path: "ai.bedrock.auth_method", description: "Authentication method for AWS Bedrock.", @@ -825,7 +825,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::No), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.warp_agent.is_any_ai_enabled", description: "Controls whether all AI features are enabled.", @@ -836,7 +836,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::No), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.warp_agent.active_ai.enabled", description: "Controls whether proactive AI features like suggestions are enabled.", @@ -847,7 +847,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.warp_agent.input.ai_auto_detection_enabled", description: "Controls whether AI automatically detects natural language input.", @@ -861,7 +861,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.warp_agent.input.nld_in_terminal_enabled", description: "Controls whether natural language detection is enabled in the terminal input.", @@ -870,7 +870,7 @@ define_settings_group!(AISettings, settings: [ type: String, default: String::new(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.warp_agent.input.ai_command_denylist", description: "Commands to exclude from AI natural language autodetection.", @@ -882,7 +882,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.warp_agent.input.use_local_model", description: "Use a locally downloaded AI model for command recognition and suggestions instead of Bedrock.", @@ -893,7 +893,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, // TODO(roland): revisit this when launched to stable supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.warp_agent.active_ai.intelligent_autosuggestions_enabled", description: "Controls whether AI-powered intelligent autosuggestions are enabled.", @@ -907,7 +907,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, // TODO(advait): revisit this when launched to stable supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.warp_agent.active_ai.agent_mode_query_suggestions_enabled", description: "Controls whether prompt suggestions are shown in agent mode.", @@ -919,7 +919,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.warp_agent.active_ai.code_suggestions_enabled", description: "Controls whether AI code suggestions are enabled.", @@ -931,7 +931,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.warp_agent.active_ai.natural_language_autosuggestions_enabled", description: "Controls whether ghosted text autosuggestions are shown for AI input queries.", @@ -944,7 +944,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.warp_agent.active_ai.shared_block_title_generation_enabled", description: "Controls whether titles are auto-generated when sharing blocks.", @@ -955,7 +955,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.warp_agent.active_ai.git_operations_autogen_enabled", description: "Controls whether AI auto-generates commit messages and PR title/body in the code review dialogs.", @@ -966,7 +966,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.warp_agent.active_ai.rule_suggestions_enabled", description: "Controls whether the agent suggests rules to save after responses.", @@ -978,7 +978,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.voice.voice_input_enabled", description: "Controls whether voice input is enabled for AI interactions.", @@ -990,7 +990,7 @@ define_settings_group!(AISettings, settings: [ type: usize, default: 0, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, }, // Whether or not the user has manually dismissed the voice input new feature popup. @@ -998,7 +998,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, }, // This field is used to store the key used for voice input toggling. @@ -1011,8 +1011,8 @@ define_settings_group!(AISettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::DESKTOP, - // Never sync to cloud to keep state separate across devices, since microphone access is per-device. - sync_to_cloud: SyncToCloud::Never, + sync_to_cloud: SyncToCloud::Never, // Never sync to cloud to keep state separate across devices, since microphone access is per-device. + private: true, }, // Predicates that Agent Mode can use to decide if it can execute @@ -1024,7 +1024,7 @@ define_settings_group!(AISettings, settings: [ type: Vec, default: DEFAULT_COMMAND_EXECUTION_ALLOWLIST.clone(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.profiles.agent_mode_command_execution_allowlist", description: "Commands that the agent can execute without explicit permission.", @@ -1038,7 +1038,7 @@ define_settings_group!(AISettings, settings: [ type: Vec, default: DEFAULT_COMMAND_EXECUTION_DENYLIST.clone(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.profiles.agent_mode_command_execution_denylist", description: "Commands that the agent must always ask before executing.", @@ -1051,7 +1051,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.profiles.agent_mode_execute_readonly_commands", description: "Whether the agent can auto-execute read-only commands without asking.", @@ -1066,7 +1066,7 @@ define_settings_group!(AISettings, settings: [ type: AgentModeCodingPermissionsType, default: AgentModeCodingPermissionsType::default(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.profiles.agent_mode_coding_permissions", description: "The file read permission level for the agent.", @@ -1082,7 +1082,7 @@ define_settings_group!(AISettings, settings: [ type: Vec, default: vec![], supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Never, + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.profiles.agent_mode_coding_file_read_allowlist", description: "File paths the agent can read without asking for permission.", @@ -1095,7 +1095,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, } // Whether or not we should show the speedbump for auto-executing readonly cmds. @@ -1106,7 +1106,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, } // Whether or not we should show the speedbump for auto-writing to the PTY. @@ -1117,7 +1117,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, } // Whether or not we should show the speedbump for auto-reading files. @@ -1128,7 +1128,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, } // Whether direct Bedrock integration is enabled (client calls Bedrock API directly). @@ -1136,7 +1136,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "ai.bedrock.enabled", description: "Whether to use AWS Bedrock directly for AI requests.", @@ -1148,7 +1148,7 @@ define_settings_group!(AISettings, settings: [ type: String, default: "default".to_string(), supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "ai.bedrock.profile", description: "The AWS profile name to use for Bedrock credentials.", @@ -1158,7 +1158,7 @@ define_settings_group!(AISettings, settings: [ type: String, default: String::new(), supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "ai.bedrock.region", description: "AWS region for Bedrock API calls. Leave empty to auto-detect from profile.", @@ -1168,7 +1168,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "ai.bedrock.cross_region_inference", description: "Whether to automatically add cross-region inference prefixes to model IDs.", @@ -1178,7 +1178,7 @@ define_settings_group!(AISettings, settings: [ type: Vec, default: Vec::new(), supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "ai.bedrock.models", description: "Custom AWS Bedrock model configurations.", @@ -1188,7 +1188,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "ai.bedrock.auto_login", description: "Whether to automatically run the login command when Bedrock credentials expire.", @@ -1198,7 +1198,7 @@ define_settings_group!(AISettings, settings: [ type: String, default: "aws sso login".to_string(), supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "ai.bedrock.auth_refresh_command", description: "The command to run to refresh AWS credentials for Bedrock.", @@ -1208,7 +1208,7 @@ define_settings_group!(AISettings, settings: [ type: String, default: String::new(), supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Never, + sync_to_cloud: SyncToCloud::Never, private: true, } // AWS secret access key for static key authentication (stored in OS keychain). @@ -1216,7 +1216,7 @@ define_settings_group!(AISettings, settings: [ type: String, default: String::new(), supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Never, + sync_to_cloud: SyncToCloud::Never, private: true, } // Whether the Bedrock login banner has been permanently dismissed. @@ -1224,7 +1224,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, } // Whether the OpenAI-compatible (LiteLLM) provider is enabled. @@ -1232,17 +1232,18 @@ define_settings_group!(AISettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "ai.openai.enabled", description: "Whether to use an OpenAI-compatible endpoint (e.g. LiteLLM) for AI requests.", } // Base URL for the OpenAI-compatible API endpoint. + // Never synced — machine-local infrastructure (e.g. localhost). openai_base_url: OpenAIBaseUrl { type: String, default: "http://localhost:4000/v1".to_string(), supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "ai.openai.base_url", description: "Base URL for the OpenAI-compatible API endpoint (e.g. LiteLLM proxy).", @@ -1252,38 +1253,41 @@ define_settings_group!(AISettings, settings: [ type: String, default: String::new(), supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Never, + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "ai.openai.api_key", description: "API key for the OpenAI-compatible endpoint (optional if proxy handles auth).", } // Model name to send to the OpenAI-compatible endpoint. Empty = use selected model ID. + // Never synced — tied to the specific endpoint configuration. openai_model: OpenAIModel { type: String, default: String::new(), supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "ai.openai.model", description: "Model name to send to the OpenAI-compatible endpoint. Leave empty to use the selected model ID.", } // Custom OpenAI-compatible model configurations (fetched from LiteLLM or manually configured). + // Never synced to cloud — these are machine-local (tied to local endpoints). openai_models: OpenAIModels { type: Vec, default: Vec::new(), supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "ai.openai.models", description: "Custom OpenAI-compatible model configurations (e.g. from LiteLLM).", } // Multiple OpenAI-compatible provider endpoints (LiteLLM, Ollama, vLLM, etc.). // Each provider has its own name, base_url, api_key, and model list. + // Never synced to cloud — these are machine-local infrastructure configs. openai_providers: OpenAIProviders { type: Vec, default: Vec::new(), supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "ai.providers", description: "Multiple OpenAI-compatible provider endpoints (e.g. LiteLLM, Ollama, local models).", @@ -1293,7 +1297,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.knowledge.rules_enabled", description: "Whether the agent uses your saved rules during requests.", @@ -1303,7 +1307,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.knowledge.warp_drive_context_enabled", description: "Whether Galaxy Drive context is included in AI requests.", @@ -1316,7 +1320,7 @@ define_settings_group!(AISettings, settings: [ type: Vec, default: vec![], supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Never, + sync_to_cloud: SyncToCloud::Never, private: true, } @@ -1328,7 +1332,7 @@ define_settings_group!(AISettings, settings: [ type: Vec, default: vec![], supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Never, + sync_to_cloud: SyncToCloud::Never, private: true, } @@ -1339,7 +1343,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, } @@ -1348,7 +1352,7 @@ define_settings_group!(AISettings, settings: [ type: AIRequestQuotaInfo, default: AIRequestQuotaInfo::default(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, }, @@ -1360,7 +1364,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, } @@ -1368,7 +1372,7 @@ define_settings_group!(AISettings, settings: [ type: Option, default: None, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Never, + sync_to_cloud: SyncToCloud::Never, private: true, }, @@ -1381,7 +1385,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::No), + sync_to_cloud: SyncToCloud::Never, private: true, } @@ -1394,7 +1398,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::No), + sync_to_cloud: SyncToCloud::Never, private: true, } @@ -1406,7 +1410,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "cloud_platform.third_party_api_keys.can_use_warp_credits_with_byok", description: "Whether Galaxy credits can be used even when providing your own API key.", @@ -1416,7 +1420,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.warp_agent.other.should_render_use_agent_toolbar_for_user_commands", description: "Whether to show the \"Use Agent\" footer for terminal commands.", @@ -1428,7 +1432,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.third_party.should_render_cli_agent_toolbar", description: "Whether to show the CLI agent footer for coding agent commands.", @@ -1440,7 +1444,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.third_party.auto_toggle_composer", description: "Whether CLI agent Rich Input automatically closes and reopens based on the agent's blocked state.", @@ -1452,7 +1456,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.third_party.auto_open_composer_on_cli_agent_start", description: "Whether CLI agent Rich Input automatically opens when a CLI agent session starts.", @@ -1466,7 +1470,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.third_party.auto_dismiss_composer_after_submit", description: "Whether CLI agent Rich Input automatically closes after the user submits a prompt.", @@ -1480,7 +1484,7 @@ define_settings_group!(AISettings, settings: [ type: ToolbarCommandMap, default: ToolbarCommandMap::default(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.third_party.cli_agent_toolbar_enabled_commands", max_table_depth: 1, @@ -1497,7 +1501,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, } @@ -1512,7 +1516,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, } @@ -1522,7 +1526,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, } @@ -1533,7 +1537,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, } @@ -1548,7 +1552,7 @@ define_settings_group!(AISettings, settings: [ type: String, default: String::new(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Never, + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "general.default_tab_config_path", } @@ -1561,7 +1565,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.mcp_servers.file_based_mcp_enabled", description: "Whether third-party file-based MCP servers are automatically detected.", @@ -1577,7 +1581,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.warp_agent.input.include_agent_commands_in_history", description: "Whether agent-executed commands are included in command history.", @@ -1588,7 +1592,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.warp_agent.other.show_conversation_history", description: "Whether conversation history appears in the tools panel.", @@ -1600,7 +1604,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.warp_agent.other.show_agent_notifications", description: "Whether agent notifications are shown.", @@ -1613,7 +1617,7 @@ define_settings_group!(AISettings, settings: [ type: HashMap, default: HashMap::default(), supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Never, + sync_to_cloud: SyncToCloud::Never, private: true, } @@ -1625,7 +1629,7 @@ define_settings_group!(AISettings, settings: [ type: HashMap, default: HashMap::default(), supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Never, + sync_to_cloud: SyncToCloud::Never, private: true, } @@ -1637,7 +1641,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::No), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.warp_agent.other.agent_attribution_enabled", description: "Whether the Galaxy Agent adds an attribution co-author line to commit messages and pull requests it creates.", @@ -1650,7 +1654,7 @@ define_settings_group!(AISettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::No), + sync_to_cloud: SyncToCloud::Never, private: true, } ]); diff --git a/app/src/settings/alias_expansion.rs b/app/src/settings/alias_expansion.rs index bbb41ed3..7883d3da 100644 --- a/app/src/settings/alias_expansion.rs +++ b/app/src/settings/alias_expansion.rs @@ -1,5 +1,5 @@ use settings::{ - macros::define_settings_group, RespectUserSyncSetting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, SupportedPlatforms, SyncToCloud, }; define_settings_group!(AliasExpansionSettings, settings: [ @@ -7,7 +7,7 @@ define_settings_group!(AliasExpansionSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "terminal.input.alias_expansion_enabled", description: "Whether shell alias expansion is enabled in the input.", diff --git a/app/src/settings/block_visibility.rs b/app/src/settings/block_visibility.rs index 17ca5663..e457c218 100644 --- a/app/src/settings/block_visibility.rs +++ b/app/src/settings/block_visibility.rs @@ -1,5 +1,5 @@ use settings::{ - macros::define_settings_group, RespectUserSyncSetting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, SupportedPlatforms, SyncToCloud, }; // Settings for visibility of non-user command blocks like the bootstrap block @@ -9,7 +9,7 @@ define_settings_group!(BlockVisibilitySettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "appearance.blocks.should_show_bootstrap_block", description: "Whether the bootstrap block is visible in the terminal.", @@ -18,7 +18,7 @@ define_settings_group!(BlockVisibilitySettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "appearance.blocks.should_show_in_band_command_blocks", description: "Whether in-band command blocks are visible in the terminal.", @@ -27,7 +27,7 @@ define_settings_group!(BlockVisibilitySettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "appearance.blocks.should_show_ssh_block", description: "Whether the SSH connection block is visible in the terminal.", diff --git a/app/src/settings/changelog.rs b/app/src/settings/changelog.rs index 60470800..353f692c 100644 --- a/app/src/settings/changelog.rs +++ b/app/src/settings/changelog.rs @@ -1,5 +1,5 @@ use settings::{ - macros::define_settings_group, RespectUserSyncSetting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, SupportedPlatforms, SyncToCloud, }; define_settings_group!(ChangelogSettings, settings: [ @@ -7,7 +7,7 @@ define_settings_group!(ChangelogSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "general.show_changelog_after_update", description: "Whether the changelog is shown after an update.", diff --git a/app/src/settings/cloud_preferences.rs b/app/src/settings/cloud_preferences.rs index c1ae1c01..fd0649b3 100644 --- a/app/src/settings/cloud_preferences.rs +++ b/app/src/settings/cloud_preferences.rs @@ -15,14 +15,14 @@ use crate::{ }; use settings::{ - macros::define_settings_group, RespectUserSyncSetting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, SupportedPlatforms, SyncToCloud, }; define_settings_group!(CloudPreferencesSettings, settings: [ settings_sync_enabled: IsSettingsSyncEnabled { type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::No), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "account.is_settings_sync_enabled", description: "Whether settings are synced across devices via the cloud.", diff --git a/app/src/settings/code.rs b/app/src/settings/code.rs index 39693575..b98ddcc3 100644 --- a/app/src/settings/code.rs +++ b/app/src/settings/code.rs @@ -1,5 +1,5 @@ use settings::{ - macros::define_settings_group, RespectUserSyncSetting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, SupportedPlatforms, SyncToCloud, }; define_settings_group!(CodeSettings, settings: [ @@ -16,7 +16,7 @@ define_settings_group!(CodeSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, storage_key: "AgentModeCodebaseContext", toml_path: "code.indexing.agent_mode_codebase_context", @@ -26,7 +26,7 @@ define_settings_group!(CodeSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, storage_key: "AgentModeCodebaseContextAutoIndexing", toml_path: "code.indexing.agent_mode_codebase_context_auto_indexing", @@ -37,7 +37,7 @@ define_settings_group!(CodeSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, }, // Controls whether the project explorer / file tree appears in the tools panel. @@ -45,7 +45,7 @@ define_settings_group!(CodeSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "code.editor.show_project_explorer", description: "Whether the project explorer is shown in the tools panel.", @@ -55,7 +55,7 @@ define_settings_group!(CodeSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "code.editor.show_global_search", description: "Whether global file search is shown in the tools panel.", diff --git a/app/src/settings/editor.rs b/app/src/settings/editor.rs index 553d63f0..39356935 100644 --- a/app/src/settings/editor.rs +++ b/app/src/settings/editor.rs @@ -4,7 +4,7 @@ use enum_iterator::{all, Sequence}; use galaxyui::ModelContext; use serde::{Deserialize, Serialize}; use settings::{ - macros::define_settings_group, RespectUserSyncSetting, Setting as _, SupportedPlatforms, + macros::define_settings_group, Setting as _, SupportedPlatforms, SyncToCloud, }; @@ -153,7 +153,7 @@ define_settings_group!(AppEditorSettings, settings: [ type: CursorBlink, default: CursorBlink::default(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, storage_key: "CursorBlink", toml_path: "appearance.cursor.cursor_blink", @@ -163,7 +163,7 @@ define_settings_group!(AppEditorSettings, settings: [ type: CursorDisplayType, default: CursorDisplayType::default(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, storage_key: "CursorDisplayType", toml_path: "appearance.cursor.cursor_display_type", @@ -173,7 +173,7 @@ define_settings_group!(AppEditorSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "text_editing.vim_mode_enabled", description: "Whether Vim keybindings are enabled.", @@ -182,7 +182,7 @@ define_settings_group!(AppEditorSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "text_editing.vim_unnamed_system_clipboard", description: "Whether the Vim unnamed register uses the system clipboard.", @@ -191,7 +191,7 @@ define_settings_group!(AppEditorSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "text_editing.vim_status_bar", description: "Whether the Vim status bar is displayed.", @@ -200,7 +200,7 @@ define_settings_group!(AppEditorSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "text_editing.autocomplete_symbols", description: "Whether matching symbols like brackets and quotes are auto-completed.", @@ -209,7 +209,7 @@ define_settings_group!(AppEditorSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, storage_key: "Autosuggestions", toml_path: "terminal.input.autosuggestions.enabled", @@ -219,7 +219,7 @@ define_settings_group!(AppEditorSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "terminal.input.autosuggestions.keybinding_hint", description: "Whether autosuggestion keybinding hints are displayed.", @@ -228,7 +228,7 @@ define_settings_group!(AppEditorSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "terminal.input.autosuggestions.show_ignore_button", description: "Whether the ignore button is shown for autosuggestions.", diff --git a/app/src/settings/emacs_bindings.rs b/app/src/settings/emacs_bindings.rs index 2a4af5e7..e0afc4aa 100644 --- a/app/src/settings/emacs_bindings.rs +++ b/app/src/settings/emacs_bindings.rs @@ -1,6 +1,6 @@ use crate::banner::BannerState; use settings::{ - macros::define_settings_group, RespectUserSyncSetting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, SupportedPlatforms, SyncToCloud, }; // This isn't exactly a setting, but rather a record of a @@ -15,7 +15,7 @@ define_settings_group!(EmacsBindingsSettings, settings: [ type: BannerState, default: BannerState::NotDismissed, supported_platforms: SupportedPlatforms::LINUX, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, }, ]); diff --git a/app/src/settings/font.rs b/app/src/settings/font.rs index 9cbb558f..9e5fea37 100644 --- a/app/src/settings/font.rs +++ b/app/src/settings/font.rs @@ -3,7 +3,7 @@ use galaxyui::{fonts::Weight, rendering::ThinStrokes, AppContext, SingletonEntit use galaxyui::elements::DEFAULT_UI_LINE_HEIGHT_RATIO; use settings::{ - macros::define_settings_group, RespectUserSyncSetting, Setting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, Setting, SupportedPlatforms, SyncToCloud, }; use super::EnforceMinimumContrast as EnforceMinimumContrastEnum; @@ -97,7 +97,7 @@ define_settings_group!(FontSettings, type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "appearance.text.match_notebook_to_monospace_font_size", description: "Whether the notebook font size matches the terminal font size.", @@ -106,7 +106,7 @@ define_settings_group!(FontSettings, type: EnforceMinimumContrastEnum, default: EnforceMinimumContrastEnum::default(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "appearance.text.enforce_minimum_contrast", description: "Whether to enforce minimum contrast for text readability.", diff --git a/app/src/settings/input.rs b/app/src/settings/input.rs index 586af9a6..ebe76bc0 100644 --- a/app/src/settings/input.rs +++ b/app/src/settings/input.rs @@ -1,7 +1,7 @@ use galaxyui::{AppContext, SingletonEntity}; use serde::{Deserialize, Serialize}; /// TODO: move alias_expansion setting into this group. -use settings::{define_settings_group, RespectUserSyncSetting, SupportedPlatforms, SyncToCloud}; +use settings::{define_settings_group, SupportedPlatforms, SyncToCloud}; use std::collections::HashMap; use crate::terminal::input::inline_menu::InlineMenuType; @@ -38,7 +38,7 @@ define_settings_group!(InputSettings, type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "terminal.input.show_hint_text", description: "Whether hint text is shown in the terminal input.", @@ -47,7 +47,7 @@ define_settings_group!(InputSettings, type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "terminal.input.classic_completions_mode", description: "Whether classic completions mode is enabled.", @@ -56,7 +56,7 @@ define_settings_group!(InputSettings, type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "terminal.input.completions_open_while_typing", description: "Whether the completions menu opens automatically while typing.", @@ -65,7 +65,7 @@ define_settings_group!(InputSettings, type: bool, default: true, supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "terminal.input.error_underlining_enabled", description: "Whether command errors are underlined in the input.", @@ -74,7 +74,7 @@ define_settings_group!(InputSettings, type: bool, default: true, supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "terminal.input.syntax_highlighting", description: "Whether syntax highlighting is enabled in the terminal input.", @@ -83,7 +83,7 @@ define_settings_group!(InputSettings, type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "terminal.input.command_corrections", description: "Whether command corrections are suggested for mistyped commands.", @@ -92,7 +92,7 @@ define_settings_group!(InputSettings, type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, storage_key: "WorkflowsBoxOpen", }, @@ -100,14 +100,14 @@ define_settings_group!(InputSettings, type: i8, default: 0, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, }, input_box_type: InputBoxTypeSetting { type: InputBoxType, default: InputBoxType::Classic, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "terminal.input.input_box_type_setting", description: "The terminal input style.", @@ -116,7 +116,7 @@ define_settings_group!(InputSettings, type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "terminal.input.at_context_menu_in_terminal_mode", description: "Whether the @ context menu is available in terminal mode.", @@ -125,7 +125,7 @@ define_settings_group!(InputSettings, type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "terminal.input.enable_slash_commands_in_terminal", description: "Whether slash commands are available in the terminal input.", @@ -134,7 +134,7 @@ define_settings_group!(InputSettings, type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "terminal.input.outline_codebase_symbols_for_at_context_menu", description: "Whether codebase symbols appear in the @ context menu.", @@ -157,7 +157,7 @@ define_settings_group!(InputSettings, type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.warp_agent.input.show_agent_tips", description: "Whether agent tips are displayed in the input.", @@ -168,7 +168,7 @@ define_settings_group!(InputSettings, type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "terminal.input.show_terminal_input_message_bar", description: "Whether the terminal input message bar is shown.", diff --git a/app/src/settings/input_mode.rs b/app/src/settings/input_mode.rs index bd728bb9..5b92b8f4 100644 --- a/app/src/settings/input_mode.rs +++ b/app/src/settings/input_mode.rs @@ -1,6 +1,6 @@ use crate::terminal::block_list_viewport::InputMode; use settings::{ - macros::define_settings_group, RespectUserSyncSetting, Setting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, Setting, SupportedPlatforms, SyncToCloud, }; define_settings_group!(InputModeSettings, settings: [ @@ -10,7 +10,7 @@ define_settings_group!(InputModeSettings, settings: [ // to set it to InputMode::Waterfall. default: InputMode::PinnedToBottom, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, storage_key: "InputMode", toml_path: "appearance.input.input_mode", diff --git a/app/src/settings/pane.rs b/app/src/settings/pane.rs index be4f12d1..8b4dd185 100644 --- a/app/src/settings/pane.rs +++ b/app/src/settings/pane.rs @@ -1,5 +1,5 @@ use settings::{ - macros::define_settings_group, RespectUserSyncSetting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, SupportedPlatforms, SyncToCloud, }; define_settings_group!(PaneSettings, settings: [ @@ -7,7 +7,7 @@ define_settings_group!(PaneSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "appearance.panes.should_dim_inactive_panes", description: "Whether inactive panes are visually dimmed.", @@ -16,7 +16,7 @@ define_settings_group!(PaneSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "appearance.panes.focus_pane_on_hover", description: "Whether panes are focused when hovered over.", diff --git a/app/src/settings/privacy.rs b/app/src/settings/privacy.rs index 1a27f376..3c317324 100644 --- a/app/src/settings/privacy.rs +++ b/app/src/settings/privacy.rs @@ -22,7 +22,7 @@ use crate::terminal::safe_mode_settings::SafeModeSettings; use settings::{ macros::{define_settings_group, maybe_define_setting, register_settings_events}, - RespectUserSyncSetting, Setting, SupportedPlatforms, SyncToCloud, + Setting, SupportedPlatforms, SyncToCloud, }; use serde::{Deserialize, Serialize}; @@ -98,7 +98,7 @@ define_settings_group!(WarpDrivePrivacySettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::No), + sync_to_cloud: SyncToCloud::Never, private: false, storage_key: "TelemetryEnabled", toml_path: "privacy.telemetry_enabled", @@ -108,7 +108,7 @@ define_settings_group!(WarpDrivePrivacySettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::No), + sync_to_cloud: SyncToCloud::Never, private: false, storage_key: "CrashReportingEnabled", toml_path: "privacy.crash_reporting_enabled", @@ -118,7 +118,7 @@ define_settings_group!(WarpDrivePrivacySettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::No), + sync_to_cloud: SyncToCloud::Never, private: false, storage_key: "CloudConversationStorageEnabled", toml_path: "agents.cloud_conversation_storage_enabled", @@ -130,7 +130,7 @@ maybe_define_setting!(CustomSecretRegexList, group: PrivacySettings, { type: Vec, default: Vec::new(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::No), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "privacy.custom_secret_regex_list", description: "Custom regex patterns for detecting and redacting secrets.", @@ -140,7 +140,7 @@ maybe_define_setting!(HasInitializedDefaultSecretRegexes, group: PrivacySettings type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::No), + sync_to_cloud: SyncToCloud::Never, private: true, }); diff --git a/app/src/settings/same_line_prompt_block.rs b/app/src/settings/same_line_prompt_block.rs index 8d843241..40e1d1c1 100644 --- a/app/src/settings/same_line_prompt_block.rs +++ b/app/src/settings/same_line_prompt_block.rs @@ -1,5 +1,5 @@ use galaxy_core::define_settings_group; -use settings::{RespectUserSyncSetting, SupportedPlatforms, SyncToCloud}; +use settings::{SupportedPlatforms, SyncToCloud}; use serde::{Deserialize, Serialize}; @@ -41,7 +41,7 @@ define_settings_group!(SameLinePromptBlockSettings, settings: [ type: SLPBlockState, default: SLPBlockState::NotShown, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, }, ]); diff --git a/app/src/settings/select.rs b/app/src/settings/select.rs index 98d41a2f..41c44724 100644 --- a/app/src/settings/select.rs +++ b/app/src/settings/select.rs @@ -3,7 +3,7 @@ use std::ops::Not; use galaxyui::{clipboard::ClipboardContent, AppContext}; use settings::{ - macros::define_settings_group, RespectUserSyncSetting, Setting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, Setting, SupportedPlatforms, SyncToCloud, }; define_settings_group!(SelectionSettings, settings: [ @@ -11,7 +11,7 @@ define_settings_group!(SelectionSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "terminal.copy_on_select", description: "Whether text is automatically copied to the clipboard when selected.", @@ -20,7 +20,7 @@ define_settings_group!(SelectionSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::LINUX, - sync_to_cloud: SyncToCloud::PerPlatform(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "system.linux_selection_clipboard", description: "Whether the Linux primary selection clipboard is used.", @@ -32,7 +32,7 @@ define_settings_group!(SelectionSettings, settings: [ SupportedPlatforms::WINDOWS.into(), SupportedPlatforms::MAC.into() ), - sync_to_cloud: SyncToCloud::PerPlatform(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "terminal.input.middle_click_paste_enabled", description: "Whether middle-click pastes from the clipboard.", diff --git a/app/src/settings/ssh.rs b/app/src/settings/ssh.rs index 4a1e32e2..ab751a6f 100644 --- a/app/src/settings/ssh.rs +++ b/app/src/settings/ssh.rs @@ -1,5 +1,5 @@ use settings::{ - macros::define_settings_group, RespectUserSyncSetting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, SupportedPlatforms, SyncToCloud, }; define_settings_group!(SshSettings, @@ -8,7 +8,7 @@ define_settings_group!(SshSettings, type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, storage_key: "EnableSSHWrapper", toml_path: "warpify.ssh.enable_legacy_ssh_wrapper", diff --git a/app/src/settings/theme.rs b/app/src/settings/theme.rs index 076a48c2..2c61aa7f 100644 --- a/app/src/settings/theme.rs +++ b/app/src/settings/theme.rs @@ -2,7 +2,7 @@ use galaxyui::{platform::SystemTheme, AppContext}; use crate::themes::theme::{RespectSystemTheme, SelectedSystemThemes, ThemeKind}; use settings::{ - macros::define_settings_group, RespectUserSyncSetting, Setting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, Setting, SupportedPlatforms, SyncToCloud, }; // Settings group for themes related settings. @@ -18,7 +18,7 @@ define_settings_group!(ThemeSettings, settings: [ // to set the default theme to Phenomenon. default: ThemeKind::default(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "appearance.themes.theme", max_table_depth: 0, @@ -28,7 +28,7 @@ define_settings_group!(ThemeSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, storage_key: "SystemTheme", toml_path: "appearance.themes.system_theme", @@ -38,7 +38,7 @@ define_settings_group!(ThemeSettings, settings: [ type: SelectedSystemThemes, default: SelectedSystemThemes::default(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, storage_key: "SelectedSystemThemes", toml_path: "appearance.themes.selected_system_themes", diff --git a/app/src/settings/vim_banner.rs b/app/src/settings/vim_banner.rs index 444a3f34..2e2d8070 100644 --- a/app/src/settings/vim_banner.rs +++ b/app/src/settings/vim_banner.rs @@ -1,6 +1,6 @@ use crate::banner::BannerState; use galaxy_core::define_settings_group; -use settings::{RespectUserSyncSetting, SupportedPlatforms, SyncToCloud}; +use settings::{SupportedPlatforms, SyncToCloud}; // This isn't exactly a setting, but rather a record of a // user action that should be persisted the same way we would a setting. @@ -14,7 +14,7 @@ define_settings_group!(VimBannerSettings, settings: [ type: BannerState, default: BannerState::NotDismissed, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, }, ]); diff --git a/app/src/terminal/alt_screen_reporting.rs b/app/src/terminal/alt_screen_reporting.rs index d8f21fcb..6a3f6009 100644 --- a/app/src/terminal/alt_screen_reporting.rs +++ b/app/src/terminal/alt_screen_reporting.rs @@ -1,5 +1,5 @@ use settings::{ - macros::define_settings_group, RespectUserSyncSetting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, SupportedPlatforms, SyncToCloud, }; define_settings_group!(AltScreenReporting, settings: [ @@ -7,7 +7,7 @@ define_settings_group!(AltScreenReporting, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "terminal.mouse_reporting_enabled", description: "Whether to forward mouse events to full-screen terminal applications.", @@ -16,7 +16,7 @@ define_settings_group!(AltScreenReporting, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "terminal.scroll_reporting_enabled", description: "Whether to forward scroll events to full-screen terminal applications.", @@ -25,7 +25,7 @@ define_settings_group!(AltScreenReporting, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "terminal.focus_reporting_enabled", description: "Whether to forward focus and blur events to full-screen terminal applications.", diff --git a/app/src/terminal/block_list_settings.rs b/app/src/terminal/block_list_settings.rs index 7414cbbe..5e8ab5b9 100644 --- a/app/src/terminal/block_list_settings.rs +++ b/app/src/terminal/block_list_settings.rs @@ -1,5 +1,5 @@ use settings::{ - macros::define_settings_group, RespectUserSyncSetting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, SupportedPlatforms, SyncToCloud, }; // Settings for controlling the behavior of the block list. @@ -8,7 +8,7 @@ define_settings_group!(BlockListSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "appearance.blocks.show_jump_to_bottom_of_block_button", description: "Whether to show the jump-to-bottom button in long command output.", @@ -17,7 +17,7 @@ define_settings_group!(BlockListSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "general.snackbar_enabled", description: "Whether to show snackbar notifications.", @@ -26,7 +26,7 @@ define_settings_group!(BlockListSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "appearance.blocks.show_block_dividers", description: "Whether to show dividers between terminal blocks.", diff --git a/app/src/terminal/general_settings.rs b/app/src/terminal/general_settings.rs index 06cb0d67..d7f5c11b 100644 --- a/app/src/terminal/general_settings.rs +++ b/app/src/terminal/general_settings.rs @@ -2,7 +2,7 @@ use std::collections::HashSet; use crate::{banner::BannerState, resource_center::Tip}; use galaxy_core::settings::{ - macros::define_settings_group, RespectUserSyncSetting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, SupportedPlatforms, SyncToCloud, }; define_settings_group!(GeneralSettings, settings: [ @@ -10,7 +10,7 @@ define_settings_group!(GeneralSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "general.show_warning_before_quitting", description: "Whether to show a warning dialog before quitting Galaxy.", @@ -19,7 +19,7 @@ define_settings_group!(GeneralSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::MAC, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "general.quit_on_last_window_closed", description: "Whether to quit Galaxy when the last window is closed.", @@ -28,7 +28,7 @@ define_settings_group!(GeneralSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "general.restore_session", description: "Whether to restore the previous session when Galaxy starts up.", @@ -64,7 +64,7 @@ define_settings_group!(GeneralSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "general.link_tooltip", description: "Whether to show a tooltip when hovering over links.", @@ -80,28 +80,28 @@ define_settings_group!(GeneralSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, }, agent_mode_onboarding_block_shown: AgentModeOnboardingBlockShown { type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, }, telemetry_banner_dismissed: TelemetryBannerDismissed { type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, }, user_default_shell_unsupported_banner_state: UserDefaultShellUnsupportedBannerState { type: BannerState, default: BannerState::default(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, }, open_in_warp_banner_dismissed_for_markdown: OpenInWarpBannerDismissedMarkdown { @@ -129,14 +129,14 @@ define_settings_group!(GeneralSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, }, build_plan_migration_modal_dismissed: BuildPlanMigrationModalDismissed { type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, }, // One-time flag tracking whether the OpenWarp launch modal has already been @@ -146,7 +146,7 @@ define_settings_group!(GeneralSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::No), + sync_to_cloud: SyncToCloud::Never, private: true, }, anonymous_user_ai_sign_up_banner_shown: AnonymousUserAISignUpBannerShown { @@ -160,7 +160,7 @@ define_settings_group!(GeneralSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "code.editor.auto_open_code_review_pane_on_first_agent_change", description: "Whether to automatically open the code review pane when the agent makes its first change.", @@ -169,7 +169,7 @@ define_settings_group!(GeneralSettings, settings: [ type: HashSet, default: HashSet::new(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, }, ]); diff --git a/app/src/terminal/keys_settings.rs b/app/src/terminal/keys_settings.rs index de647bde..290eab28 100644 --- a/app/src/terminal/keys_settings.rs +++ b/app/src/terminal/keys_settings.rs @@ -1,6 +1,6 @@ use galaxyui::{keymap::Keystroke, AppContext, DisplayIdx, ModelContext}; use settings::{ - macros::define_settings_group, RespectUserSyncSetting, Setting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, Setting, SupportedPlatforms, SyncToCloud, }; use crate::{ @@ -17,7 +17,7 @@ define_settings_group!(KeysSettings, settings: [ type: crate::settings::QuakeModeSettings, default: crate::settings::QuakeModeSettings::default(), supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "global_hotkey.dedicated_window.settings", max_table_depth: 2, @@ -27,7 +27,7 @@ define_settings_group!(KeysSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "global_hotkey.dedicated_window.enabled", description: "Whether the dedicated hotkey window is enabled. Mutually exclusive with `global_hotkey.toggle_all_windows.enabled`; only one should be true at a time.", @@ -36,7 +36,7 @@ define_settings_group!(KeysSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "global_hotkey.toggle_all_windows.enabled", description: "Whether the hotkey that toggles visibility of all windows is enabled. Mutually exclusive with `global_hotkey.dedicated_window.enabled`; only one should be true at a time.", @@ -45,7 +45,7 @@ define_settings_group!(KeysSettings, settings: [ type: Option, default: None, supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "global_hotkey.toggle_all_windows.keybinding", description: "The keybinding used for the global activation hotkey. Format: modifiers (cmd, ctrl, alt, shift, meta) and a key joined by '-', e.g. \"cmd-shift-a\" or \"alt-enter\". Bindings are case-sensitive: when shift is present, the key must be its shifted form (e.g., \"ctrl-shift-E\", not \"ctrl-shift-e\").", @@ -54,7 +54,7 @@ define_settings_group!(KeysSettings, settings: [ type: ExtraMetaKeysEnum, default: ExtraMetaKeysEnum::default(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "terminal.input.extra_meta_keys", description: "Controls which additional keys are treated as meta keys.", @@ -63,7 +63,7 @@ define_settings_group!(KeysSettings, settings: [ type: CtrlTabBehavior, default: CtrlTabBehavior::default(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "keys.ctrl_tab_behavior_setting", description: "Controls the behavior of Ctrl+Tab.", diff --git a/app/src/terminal/ligature_settings.rs b/app/src/terminal/ligature_settings.rs index 42e31e72..aee792ee 100644 --- a/app/src/terminal/ligature_settings.rs +++ b/app/src/terminal/ligature_settings.rs @@ -2,7 +2,7 @@ use crate::features::FeatureFlag; use galaxyui::{AppContext, SingletonEntity}; use settings::{ - macros::define_settings_group, RespectUserSyncSetting, Setting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, Setting, SupportedPlatforms, SyncToCloud, }; define_settings_group!(LigatureSettings, settings: [ @@ -10,7 +10,7 @@ define_settings_group!(LigatureSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "appearance.text.ligature_rendering_enabled", description: "Whether to render font ligatures in the terminal.", diff --git a/app/src/terminal/safe_mode_settings.rs b/app/src/terminal/safe_mode_settings.rs index 5494fe9e..bd859262 100644 --- a/app/src/terminal/safe_mode_settings.rs +++ b/app/src/terminal/safe_mode_settings.rs @@ -1,6 +1,6 @@ use galaxyui::{AppContext, SingletonEntity}; use settings::{ - macros::define_settings_group, RespectUserSyncSetting, Setting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, Setting, SupportedPlatforms, SyncToCloud, }; use crate::{terminal::model::ObfuscateSecrets, workspaces::user_workspaces::UserWorkspaces}; @@ -75,7 +75,7 @@ define_settings_group!(SafeModeSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "privacy.secret_redaction.enabled", description: "Whether secret redaction is enabled to detect and obscure secrets in terminal output.", @@ -84,7 +84,7 @@ define_settings_group!(SafeModeSettings, settings: [ type: SecretDisplayMode, default: SecretDisplayMode::Strikethrough, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "privacy.secret_redaction.secret_display_mode_setting", description: "Controls how detected secrets are visually displayed in the terminal.", @@ -94,7 +94,7 @@ define_settings_group!(SafeModeSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "privacy.secret_redaction.hide_secrets_in_block_list", description: "Whether to hide detected secrets in the block list using asterisks.", diff --git a/app/src/terminal/session_settings.rs b/app/src/terminal/session_settings.rs index 2d6ec8a7..af18d425 100644 --- a/app/src/terminal/session_settings.rs +++ b/app/src/terminal/session_settings.rs @@ -10,7 +10,7 @@ pub use startup_shell::*; pub use working_directory_config::*; use galaxy_core::settings::{ - macros::define_settings_group, RespectUserSyncSetting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, SupportedPlatforms, SyncToCloud, }; use crate::ai::blocklist::agent_view::toolbar_item::AgentToolbarItemKind; @@ -300,7 +300,7 @@ define_settings_group!(SessionSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "terminal.input.honor_ps1", description: "Whether to use your shell's PS1 prompt instead of the Galaxy prompt.", @@ -309,21 +309,21 @@ define_settings_group!(SessionSettings, settings: [ type: PromptSelection, default: PromptSelection::default(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, }, should_add_agent_mode_chip: ShouldAddAgentModeChip { type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, }, should_confirm_close_session: ShouldConfirmCloseSession { type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "general.should_confirm_close_session", description: "Whether to show a confirmation dialog when closing a session.", @@ -333,14 +333,14 @@ define_settings_group!(SessionSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, } notifications: Notifications { type: NotificationsSettings, default: NotificationsSettings::default(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "notifications.preferences", max_table_depth: 1, @@ -353,7 +353,7 @@ define_settings_group!(SessionSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, storage_key: "GitPromptDirtyIndicator", }, @@ -364,7 +364,7 @@ define_settings_group!(SessionSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.warp_agent.input.show_model_selectors_in_prompt", description: "Whether to show AI model selectors in the input prompt.", @@ -373,7 +373,7 @@ define_settings_group!(SessionSettings, settings: [ type: AgentToolbarChipSelection, default: AgentToolbarChipSelection::default(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.warp_agent.input.agent_toolbar_chip_selection_setting", description: "Controls the layout of context chips in the Agent Mode toolbar.", @@ -382,7 +382,7 @@ define_settings_group!(SessionSettings, settings: [ type: CLIAgentToolbarChipSelection, default: CLIAgentToolbarChipSelection::default(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.third_party.cli_agent_toolbar_chip_selection_setting", description: "Controls the layout of context chips in the CLI Agent toolbar.", @@ -391,7 +391,7 @@ define_settings_group!(SessionSettings, settings: [ type: u64, default: 8, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "notifications.toast_duration_secs", description: "How long notification toasts are displayed, in seconds.", diff --git a/app/src/terminal/settings.rs b/app/src/terminal/settings.rs index bf24e391..d0239ab3 100644 --- a/app/src/terminal/settings.rs +++ b/app/src/terminal/settings.rs @@ -3,7 +3,7 @@ use serde::{Deserialize, Serialize}; use crate::settings::{AISettings, InputSettings, TerminalSpacing}; use galaxyui::{units::Pixels, AppContext, SingletonEntity}; use settings::{ - macros::define_settings_group, RespectUserSyncSetting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, SupportedPlatforms, SyncToCloud, }; #[derive( @@ -89,7 +89,7 @@ define_settings_group!(TerminalSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::DESKTOP, /* Audible bell is not supported on web */ - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "terminal.use_audible_bell", description: "Whether to play an audible bell sound on terminal bell events.", @@ -98,7 +98,7 @@ define_settings_group!(TerminalSettings, settings: [ type: SpacingMode, default: SpacingMode::default(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "appearance.spacing", description: "Controls the spacing between terminal blocks.", @@ -107,7 +107,7 @@ define_settings_group!(TerminalSettings, settings: [ type: usize, default: 50_000, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "terminal.maximum_grid_size", description: "The maximum number of rows in the terminal grid.", @@ -116,7 +116,7 @@ define_settings_group!(TerminalSettings, settings: [ type: AltScreenPaddingMode, default: AltScreenPaddingMode::default(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "appearance.full_screen_apps.alt_screen_padding", max_table_depth: 0, @@ -128,7 +128,7 @@ define_settings_group!(TerminalSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "terminal.show_terminal_zero_state_block", description: "Whether to show the AI zero-state block in new terminal sessions.", diff --git a/app/src/terminal/shared_session/settings.rs b/app/src/terminal/shared_session/settings.rs index ecc0998e..19e84be4 100644 --- a/app/src/terminal/shared_session/settings.rs +++ b/app/src/terminal/shared_session/settings.rs @@ -1,7 +1,7 @@ use std::time::Duration; use settings::{ - macros::define_settings_group, RespectUserSyncSetting, Setting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, Setting, SupportedPlatforms, SyncToCloud, }; define_settings_group!(SharedSessionSettings, settings: [ @@ -9,7 +9,7 @@ define_settings_group!(SharedSessionSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, }, inactivity_period_before_ending_session: InactivityPeriodBeforeEndingSession { @@ -17,7 +17,7 @@ define_settings_group!(SharedSessionSettings, settings: [ // After a total of 30 min of inactivity, we will end the session default: Duration::from_secs(1800), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, }, inactivity_period_before_warning: InactivityPeriodBeforeWarning { @@ -25,7 +25,7 @@ define_settings_group!(SharedSessionSettings, settings: [ // After a total of 25 min of inactivity, we will show a warning modal default: Duration::from_secs(1500), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, }, inactivity_period_before_revoking_roles: InactivityPeriodBeforeRevokingRoles { @@ -33,7 +33,7 @@ define_settings_group!(SharedSessionSettings, settings: [ // After a total of 10 min of inactivity, we will revoke all executor roles default: Duration::from_secs(600), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, }, // Killswitch: when false, the sharer ignores viewer terminal size reports. @@ -41,7 +41,7 @@ define_settings_group!(SharedSessionSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, }, ]); diff --git a/app/src/terminal/warpify/settings.rs b/app/src/terminal/warpify/settings.rs index b4862b24..8eaa8341 100644 --- a/app/src/terminal/warpify/settings.rs +++ b/app/src/terminal/warpify/settings.rs @@ -6,7 +6,7 @@ use lazy_static::lazy_static; use regex::Regex; use settings::{ macros::{maybe_define_setting, register_settings_events}, - ChangeEventReason, RespectUserSyncSetting, Setting, SupportedPlatforms, SyncToCloud, + ChangeEventReason, Setting, SupportedPlatforms, SyncToCloud, }; use strum_macros::EnumIter; @@ -17,7 +17,7 @@ maybe_define_setting!(AddedSubshellCommands, group: WarpifySettings, { type: Vec, default: Vec::new(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "warpify.subshells.added_subshell_commands", description: "Additional regex patterns for commands that should be recognized as subshells.", @@ -27,7 +27,7 @@ maybe_define_setting!(SubshellCommandsDenylist, group: WarpifySettings, { type: Vec, default: Vec::new(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "warpify.subshells.subshell_commands_denylist", description: "Commands that should not trigger the subshell warpification prompt.", @@ -37,7 +37,7 @@ maybe_define_setting!(SshHostsDenylist, group: WarpifySettings, { type: Vec, default: Vec::new(), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "warpify.ssh.ssh_hosts_denylist", description: "SSH hosts that should not trigger the warpification prompt.", @@ -47,7 +47,7 @@ maybe_define_setting!(EnableSshWarpification, group: WarpifySettings, { type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "warpify.ssh.enable_ssh_warpification", description: "Whether to enable Galaxy features in SSH sessions.", @@ -57,7 +57,7 @@ maybe_define_setting!(UseSshTmuxWrapper, group: WarpifySettings, { type: bool, default: false, supported_platforms: SupportedPlatforms::OR(SupportedPlatforms::MAC.into(), SupportedPlatforms::LINUX.into()), - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "warpify.ssh.use_ssh_tmux_wrapper", description: "Whether to use a tmux-based wrapper for SSH warpification.", @@ -96,7 +96,7 @@ settings::macros::implement_setting_for_enum!( SshExtensionInstallMode, WarpifySettings, SupportedPlatforms::ALL, - SyncToCloud::Globally(RespectUserSyncSetting::Yes), + SyncToCloud::Never, private: false, toml_path: "warpify.ssh.ssh_extension_install_mode", description: "Controls SSH extension installation behavior.", diff --git a/app/src/undo_close/settings.rs b/app/src/undo_close/settings.rs index bc04b575..655e8942 100644 --- a/app/src/undo_close/settings.rs +++ b/app/src/undo_close/settings.rs @@ -1,7 +1,7 @@ use std::time::Duration; use settings::{ - macros::define_settings_group, RespectUserSyncSetting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, SupportedPlatforms, SyncToCloud, }; define_settings_group!(UndoCloseSettings, settings: [ @@ -9,7 +9,7 @@ define_settings_group!(UndoCloseSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "general.undo_close.enabled", description: "Whether the undo close feature is enabled.", @@ -18,7 +18,7 @@ define_settings_group!(UndoCloseSettings, settings: [ type: Duration, default: Duration::from_secs(60), supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "general.undo_close.grace_period", description: "How long after closing a tab you can still undo the close.", diff --git a/app/src/util/file/external_editor/settings.rs b/app/src/util/file/external_editor/settings.rs index abc9c19e..cf4ac3b5 100644 --- a/app/src/util/file/external_editor/settings.rs +++ b/app/src/util/file/external_editor/settings.rs @@ -1,7 +1,7 @@ pub use crate::util::openable_file_type::EditorLayout; use serde::{Deserialize, Deserializer, Serialize}; use settings::{ - macros::define_settings_group, RespectUserSyncSetting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, SupportedPlatforms, SyncToCloud, }; #[derive( @@ -92,7 +92,7 @@ define_settings_group!(EditorSettings, settings: [ type: EditorLayout, default: EditorLayout::SplitPane, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "code.editor.open_file_layout", description: "The layout used when opening files in the editor.", @@ -101,7 +101,7 @@ define_settings_group!(EditorSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "code.editor.prefer_markdown_viewer", description: "Whether to use the Markdown viewer when opening Markdown files.", @@ -110,7 +110,7 @@ define_settings_group!(EditorSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "code.editor.prefer_tabbed_editor_view", description: "Whether to prefer opening files in a tabbed editor view.", @@ -119,7 +119,7 @@ define_settings_group!(EditorSettings, settings: [ type: OpenConversationPreference, default: OpenConversationPreference::NewTab, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "agents.warp_agent.other.open_conversation_layout_preference", description: "Whether to open agent conversations in a new tab or a split pane.", diff --git a/app/src/window_settings.rs b/app/src/window_settings.rs index d0cad480..a486f07d 100644 --- a/app/src/window_settings.rs +++ b/app/src/window_settings.rs @@ -1,6 +1,6 @@ use galaxyui::{AppContext, WindowId}; use settings::{ - macros::define_settings_group, RespectUserSyncSetting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, SupportedPlatforms, SyncToCloud, }; define_settings_group!(WindowSettings, settings: [ @@ -8,7 +8,7 @@ define_settings_group!(WindowSettings, settings: [ type: u8, default: 1, supported_platforms: SupportedPlatforms::MAC, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, storage_key: "OverrideBlur", toml_path: "appearance.window.override_blur", @@ -18,7 +18,7 @@ define_settings_group!(WindowSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::WINDOWS, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, storage_key: "OverrideBlurTexture", toml_path: "appearance.window.override_blur_texture", @@ -28,7 +28,7 @@ define_settings_group!(WindowSettings, settings: [ type: u8, default: 100, supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, storage_key: "OverrideOpacity", toml_path: "appearance.window.override_opacity", @@ -38,7 +38,7 @@ define_settings_group!(WindowSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "appearance.window.open_windows_at_custom_size", description: "Whether to open new windows at a custom size instead of the default.", @@ -47,7 +47,7 @@ define_settings_group!(WindowSettings, settings: [ type: u16, default: 80, supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "appearance.window.new_windows_num_columns", description: "The number of columns for new windows when using a custom size.", @@ -56,7 +56,7 @@ define_settings_group!(WindowSettings, settings: [ type: u16, default: 40, supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "appearance.window.new_windows_num_rows", description: "The number of rows for new windows when using a custom size.", @@ -65,7 +65,7 @@ define_settings_group!(WindowSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::DESKTOP, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "appearance.window.left_panel_visibility_across_tabs", description: "Whether the left panel visibility is shared across all tabs.", diff --git a/app/src/workflows/aliases.rs b/app/src/workflows/aliases.rs index 50b8fec6..f842176b 100644 --- a/app/src/workflows/aliases.rs +++ b/app/src/workflows/aliases.rs @@ -3,7 +3,7 @@ use std::collections::{HashMap, HashSet}; use anyhow::Error; use galaxy_core::{ define_settings_group, - settings::{RespectUserSyncSetting, Setting, SupportedPlatforms, SyncToCloud}, + settings::{Setting, SupportedPlatforms, SyncToCloud}, }; use galaxyui::{AppContext, ModelContext, SingletonEntity}; use serde::{Deserialize, Serialize}; @@ -23,7 +23,7 @@ define_settings_group!(WorkflowAliases, settings: [ type: Vec, default: vec![], supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: true, storage_key: "WorkflowAliases", } diff --git a/app/src/workspace/tab_settings.rs b/app/src/workspace/tab_settings.rs index 4a14ebf6..02330381 100644 --- a/app/src/workspace/tab_settings.rs +++ b/app/src/workspace/tab_settings.rs @@ -3,7 +3,7 @@ use std::path::Path; use galaxy_core::ui::theme::AnsiColorIdentifier; use settings::{ - macros::define_settings_group, RespectUserSyncSetting, SupportedPlatforms, SyncToCloud, + macros::define_settings_group, SupportedPlatforms, SyncToCloud, }; #[derive( @@ -62,7 +62,7 @@ settings::macros::implement_setting_for_enum!( TabCloseButtonPosition, TabSettings, SupportedPlatforms::ALL, - SyncToCloud::Globally(RespectUserSyncSetting::Yes), + SyncToCloud::Never, private: false, toml_path: "appearance.tabs.tab_close_button_position", description: "Position of the close button on tabs.", @@ -99,7 +99,7 @@ settings::macros::implement_setting_for_enum!( WorkspaceDecorationVisibility, TabSettings, SupportedPlatforms::ALL, - SyncToCloud::Globally(RespectUserSyncSetting::Yes), + SyncToCloud::Never, private: false, toml_path: "appearance.tabs.workspace_decoration_visibility", description: "When workspace decorations such as the tab bar are visible.", @@ -275,7 +275,7 @@ settings::macros::implement_setting_for_enum!( HeaderToolbarChipSelection, TabSettings, SupportedPlatforms::ALL, - SyncToCloud::Globally(RespectUserSyncSetting::Yes), + SyncToCloud::Never, private: false, toml_path: "appearance.tabs.header_toolbar_chip_selection", description: "Configuration for the header toolbar chips in the vertical tab panel header.", @@ -306,7 +306,7 @@ settings::macros::implement_setting_for_enum!( VerticalTabsViewMode, TabSettings, SupportedPlatforms::ALL, - SyncToCloud::Globally(RespectUserSyncSetting::Yes), + SyncToCloud::Never, private: false, toml_path: "appearance.vertical_tabs.view_mode", description: "Display mode for the vertical tab bar.", @@ -337,7 +337,7 @@ settings::macros::implement_setting_for_enum!( VerticalTabsDisplayGranularity, TabSettings, SupportedPlatforms::ALL, - SyncToCloud::Globally(RespectUserSyncSetting::Yes), + SyncToCloud::Never, private: false, toml_path: "appearance.vertical_tabs.display_granularity", description: "Granularity of rows displayed in the vertical tabs panel.", @@ -368,7 +368,7 @@ settings::macros::implement_setting_for_enum!( VerticalTabsTabItemMode, TabSettings, SupportedPlatforms::ALL, - SyncToCloud::Globally(RespectUserSyncSetting::Yes), + SyncToCloud::Never, private: false, toml_path: "appearance.vertical_tabs.tab_item_mode", description: "Tab item display mode in vertical tabs.", @@ -400,7 +400,7 @@ settings::macros::implement_setting_for_enum!( VerticalTabsPrimaryInfo, TabSettings, SupportedPlatforms::ALL, - SyncToCloud::Globally(RespectUserSyncSetting::Yes), + SyncToCloud::Never, private: false, toml_path: "appearance.vertical_tabs.primary_info", description: "The primary information displayed on vertical tabs.", @@ -432,7 +432,7 @@ settings::macros::implement_setting_for_enum!( VerticalTabsCompactSubtitle, TabSettings, SupportedPlatforms::ALL, - SyncToCloud::Globally(RespectUserSyncSetting::Yes), + SyncToCloud::Never, private: false, toml_path: "appearance.vertical_tabs.compact_subtitle", description: "Subtitle shown on compact vertical tabs.", @@ -443,7 +443,7 @@ define_settings_group!(TabSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "appearance.tabs.show_indicators_button", description: "Whether to show activity indicators on tabs.", @@ -452,7 +452,7 @@ define_settings_group!(TabSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "code.editor.show_code_review_button", description: "Whether to show the code review button on tabs.", @@ -461,7 +461,7 @@ define_settings_group!(TabSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "code.editor.show_code_review_diff_stats", description: "Whether to show lines added/removed counts on the code review button.", @@ -470,7 +470,7 @@ define_settings_group!(TabSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "appearance.tabs.preserve_active_tab_color", description: "Whether to preserve the active tab's color when switching tabs.", @@ -479,7 +479,7 @@ define_settings_group!(TabSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "appearance.vertical_tabs.enabled", description: "Whether to display tabs vertically instead of horizontally.", @@ -488,7 +488,7 @@ define_settings_group!(TabSettings, settings: [ type: bool, default: false, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "appearance.vertical_tabs.use_latest_prompt_as_title", description: "Whether vertical tab names for agent conversations use the latest user prompt.", @@ -502,7 +502,7 @@ define_settings_group!(TabSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "appearance.vertical_tabs.show_pr_link", description: "Whether to show PR links on vertical tabs.", @@ -511,7 +511,7 @@ define_settings_group!(TabSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "appearance.vertical_tabs.show_diff_stats", description: "Whether to show diff stats on vertical tabs.", @@ -520,7 +520,7 @@ define_settings_group!(TabSettings, settings: [ type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, - sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), + sync_to_cloud: SyncToCloud::Never, private: false, toml_path: "appearance.vertical_tabs.show_details_on_hover", description: "Whether to show a details sidecar when hovering over a vertical tab.", diff --git a/app/src/workspace/view/vertical_tabs.rs b/app/src/workspace/view/vertical_tabs.rs index c0125273..62253394 100644 --- a/app/src/workspace/view/vertical_tabs.rs +++ b/app/src/workspace/view/vertical_tabs.rs @@ -1448,23 +1448,10 @@ fn render_vertical_tabs_panel( .with_child(Shrinkable::new(1., scrollable_groups).finish()) .finish(); - let panel_with_popup: Box = if state.show_settings_popup { - let popup = render_settings_popup(state, app); - let mut stack = Stack::new().with_child(panel_content); - stack.add_positioned_overlay_child( - popup, - OffsetPositioning::offset_from_save_position_element( - VERTICAL_TABS_SETTINGS_BUTTON_POSITION_ID, - vec2f(0., 4.), - PositionedElementOffsetBounds::WindowByPosition, - PositionedElementAnchor::BottomLeft, - ChildAnchor::TopLeft, - ), - ); - stack.finish() - } else { - panel_content - }; + // Note: the settings popup is rendered at the workspace level (in a Dismiss overlay) + // rather than here, to ensure proper click-outside-to-dismiss behavior and avoid + // event dispatch conflicts from duplicate popup rendering with shared mouse states. + let panel_with_popup: Box = panel_content; let drag_side = match side { super::PanelPosition::Left => DragBarSide::Right, diff --git a/script/build-and-deploy-hermes.sh b/script/build-and-deploy-hermes.sh new file mode 100755 index 00000000..4ed9ada7 --- /dev/null +++ b/script/build-and-deploy-hermes.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +# Build and deploy Galaxy to Hermes (wst.mini-games.tv) +# +# Required env vars: +# HERMES_PASS - password for Hermes authentication +# +# Optional env vars: +# HERMES_USER - username (defaults to "ryan") + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +APP_DIR="$SCRIPT_DIR/build-and-deploy-hermes" + +if [ -z "$HERMES_PASS" ]; then + echo "Error: HERMES_PASS environment variable is required." + exit 1 +fi + +# Install deps if needed +if [ ! -d "$APP_DIR/node_modules" ]; then + echo "Installing dependencies..." + cd "$APP_DIR" && yarn install --frozen-lockfile +fi + +cd "$APP_DIR" && yarn --silent start \ No newline at end of file diff --git a/script/build-and-deploy-hermes/.gitignore b/script/build-and-deploy-hermes/.gitignore new file mode 100644 index 00000000..04c01ba7 --- /dev/null +++ b/script/build-and-deploy-hermes/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +dist/ \ No newline at end of file diff --git a/script/build-and-deploy-hermes/package.json b/script/build-and-deploy-hermes/package.json new file mode 100644 index 00000000..7a79e50d --- /dev/null +++ b/script/build-and-deploy-hermes/package.json @@ -0,0 +1,21 @@ +{ + "name": "build-and-deploy-hermes", + "version": "1.0.0", + "private": true, + "type": "module", + "scripts": { + "build": "tsx src/index.tsx", + "start": "tsx src/index.tsx" + }, + "dependencies": { + "ink": "^5.1.0", + "ink-spinner": "^5.0.0", + "react": "^18.3.1" + }, + "devDependencies": { + "@types/node": "^26.0.0", + "@types/react": "^18.3.12", + "tsx": "^4.19.0", + "typescript": "^5.6.0" + } +} diff --git a/script/build-and-deploy-hermes/src/index.tsx b/script/build-and-deploy-hermes/src/index.tsx new file mode 100644 index 00000000..6c7629b9 --- /dev/null +++ b/script/build-and-deploy-hermes/src/index.tsx @@ -0,0 +1,472 @@ +#!/usr/bin/env tsx +import React, { useState, useEffect, useCallback } from "react"; +import { render, Text, Box } from "ink"; +import Spinner from "ink-spinner"; +import { spawn, execSync } from "child_process"; +import { statSync, readFileSync } from "fs"; +import { createHash } from "crypto"; +import path from "path"; + +// ─── Configuration ─────────────────────────────────────────────────────────── + +const HERMES_USER = process.env.HERMES_USER ?? "ryan"; +const HERMES_PASS = process.env.HERMES_PASS; + +if (!HERMES_PASS) { + console.error("Error: HERMES_PASS environment variable is required."); + process.exit(1); +} + +const BASE_URL = "https://client.wst.mini-games.tv"; +const UPLOAD_KEY = "wst-data/ryan-share/galaxy/Galaxy.zip"; +const CONTENT_TYPE = "application/zip"; + +// Workspace root is three levels up from script/build-and-deploy-hermes/src +const WORKSPACE_ROOT = path.resolve(import.meta.dirname, "../../.."); + +// ─── Types ─────────────────────────────────────────────────────────────────── + +type StepStatus = "pending" | "running" | "done" | "error"; + +interface Step { + label: string; + status: StepStatus; + detail?: string; + logs?: string[]; + progress?: { bytes: number; totalBytes: number }; +} + +const MAX_LOG_LINES = 15; + +function runCommandStreaming( + cmd: string, + cwd: string, + onLog: (line: string) => void +): Promise { + return new Promise((resolve, reject) => { + const child = spawn(cmd, { + cwd, + shell: true, + stdio: ["ignore", "pipe", "pipe"], + }); + + let leftover = ""; + const processChunk = (chunk: Buffer) => { + const text = leftover + chunk.toString(); + const lines = text.split("\n"); + leftover = lines.pop() || ""; + for (const line of lines) { + if (line.trim()) onLog(line); + } + }; + + child.stdout?.on("data", processChunk); + child.stderr?.on("data", processChunk); + + child.on("close", (code) => { + if (leftover.trim()) onLog(leftover); + if (code === 0) resolve(); + else reject(new Error(`Command failed with exit code ${code}`)); + }); + + child.on("error", reject); + }); +} + +interface StartUploadResponse { + uploadId: string; + key: string; + totalParts: number; + partSize: number; + urls: { partNumber: number; url: string }[]; +} + +// ─── Helpers ───────────────────────────────────────────────────────────────── + +const COMMON_HEADERS: Record = { + "User-Agent": + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:152.0) Gecko/20100101 Firefox/152.0", + Accept: "*/*", + "Accept-Language": "en-US,en;q=0.9", + "Content-Type": "application/json", + Origin: BASE_URL, + "Sec-GPC": "1", + Connection: "keep-alive", + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-origin", + "Pragma": "no-cache", + "Cache-Control": "no-cache", +}; + +function authHeaders(token: string): Record { + return { ...COMMON_HEADERS, Authorization: `Bearer ${token}` }; +} + +async function apiPost(url: string, body: object, headers: Record): Promise { + const res = await fetch(url, { + method: "POST", + headers, + body: JSON.stringify(body), + }); + if (!res.ok) { + const text = await res.text(); + throw new Error(`POST ${url} failed (${res.status}): ${text}`); + } + return res.json() as Promise; +} + +function computeFileHash(filePath: string): string { + const hash = createHash("sha256"); + const data = readFileSync(filePath); + hash.update(data); + return hash.digest("hex"); +} + +async function uploadPart( + url: string, + filePath: string, + partNumber: number, + partSize: number, + totalParts: number, + onProgress: (bytesSent: number) => void +): Promise { + const fileSize = statSync(filePath).size; + const start = (partNumber - 1) * partSize; + const end = partNumber === totalParts ? fileSize : start + partSize; + const length = end - start; + + // Read the chunk into a buffer + const { openSync, readSync, closeSync } = await import("fs"); + const fd = openSync(filePath, "r"); + const buffer = Buffer.alloc(length); + readSync(fd, buffer, 0, length, start); + closeSync(fd); + + // Stream the upload to track progress + const CHUNK_SIZE = 256 * 1024; // 256KB reporting chunks + let uploaded = 0; + + const stream = new ReadableStream({ + start(controller) { + let offset = 0; + function push() { + if (offset >= length) { + controller.close(); + return; + } + const chunk = buffer.subarray(offset, Math.min(offset + CHUNK_SIZE, length)); + controller.enqueue(chunk); + offset += chunk.length; + uploaded += chunk.length; + onProgress(uploaded); + } + // Push all chunks synchronously since data is already in memory + while (offset < length) { + const chunk = buffer.subarray(offset, Math.min(offset + CHUNK_SIZE, length)); + controller.enqueue(chunk); + offset += chunk.length; + uploaded += chunk.length; + onProgress(uploaded); + } + controller.close(); + }, + }); + + const res = await fetch(url, { + method: "PUT", + headers: { + "Content-Type": CONTENT_TYPE, + "Content-Length": String(length), + }, + body: stream, + // @ts-ignore - duplex is needed for streaming uploads in Node + duplex: "half", + }); + + if (!res.ok) { + const text = await res.text(); + throw new Error(`PUT part ${partNumber} failed (${res.status}): ${text}`); + } + + const etag = res.headers.get("etag"); + if (!etag) { + throw new Error(`No ETag returned for part ${partNumber}`); + } + return etag; +} + +// ─── UI Component ──────────────────────────────────────────────────────────── + +const BAR_WIDTH = 30; + +function ProgressBar({ bytes, totalBytes }: { bytes: number; totalBytes: number }) { + const pct = Math.min(100, Math.round((bytes / totalBytes) * 100)); + const filled = Math.round((bytes / totalBytes) * BAR_WIDTH); + const empty = BAR_WIDTH - filled; + const uploadedMB = (bytes / (1024 * 1024)).toFixed(1); + const totalMB = (totalBytes / (1024 * 1024)).toFixed(1); + return ( + + {'█'.repeat(filled)} + {'░'.repeat(empty)} + {pct}% ({uploadedMB}/{totalMB} MB) + + ); +} + +function StepLine({ step }: { step: Step }) { + const icon = + step.status === "pending" + ? "○" + : step.status === "running" + ? "" + : step.status === "done" + ? "✓" + : "✗"; + + const color = + step.status === "pending" + ? "gray" + : step.status === "running" + ? "cyan" + : step.status === "done" + ? "green" + : "red"; + + return ( + + + {step.status === "running" ? ( + + {" "} + + ) : ( + {icon} + )} + {step.label} + {step.detail && — {step.detail}} + + {step.logs && step.logs.length > 0 && !step.progress && ( + + {step.logs.map((line, i) => ( + + {line} + + ))} + + )} + {step.progress && ( + + )} + + ); +} + +function App() { + const [steps, setSteps] = useState([ + { label: "Build Galaxy", status: "pending" }, + { label: "Create Galaxy.zip", status: "pending" }, + { label: "Authenticate with Hermes", status: "pending" }, + { label: "Start multipart upload", status: "pending" }, + { label: "Upload parts", status: "pending" }, + { label: "Complete upload", status: "pending" }, + ]); + + const updateStep = useCallback((index: number, update: Partial) => { + setSteps((prev) => prev.map((s, i) => (i === index ? { ...s, ...update } : s))); + }, []); + + const appendLog = useCallback((index: number, line: string) => { + setSteps((prev) => + prev.map((s, i) => { + if (i !== index) return s; + const logs = [...(s.logs || []), line].slice(-MAX_LOG_LINES); + return { ...s, logs }; + }) + ); + }, []); + + useEffect(() => { + (async () => { + try { + // ─── Step 0: Build ────────────────────────────────────────────── + updateStep(0, { status: "running" }); + await runCommandStreaming( + "cargo bundle --bin galaxy-oss --package galaxy", + WORKSPACE_ROOT, + (line) => appendLog(0, line) + ); + updateStep(0, { status: "done" }); + + // ─── Step 1: Zip ──────────────────────────────────────────────── + updateStep(1, { status: "running" }); + + // Find the .app bundle — cargo bundle outputs to target/debug/bundle/osx/ + const appDir = path.join( + WORKSPACE_ROOT, + "target/debug/bundle/osx" + ); + const zipPath = path.join(WORKSPACE_ROOT, "Galaxy.zip"); + + // Remove old zip if exists + execSync(`rm -f "${zipPath}"`, { stdio: "pipe" }); + // Zip the .app folder + await runCommandStreaming( + `cd "${appDir}" && zip -r -y "${zipPath}" Galaxy.app`, + WORKSPACE_ROOT, + (line) => appendLog(1, line) + ); + + const fileSize = statSync(zipPath).size; + const fileSizeMB = (fileSize / (1024 * 1024)).toFixed(1); + updateStep(1, { status: "done", detail: `${fileSizeMB} MB` }); + + // ─── Step 2: Authenticate ─────────────────────────────────────── + updateStep(2, { status: "running" }); + + const loginRes = await apiPost<{ token: string }>( + `${BASE_URL}/api/auth/login`, + { username: HERMES_USER, password: HERMES_PASS }, + COMMON_HEADERS + ); + const token = loginRes.token; + appendLog(2, `Authenticated as ${HERMES_USER}`); + updateStep(2, { status: "done" }); + + // ─── Step 3: Start upload ─────────────────────────────────────── + updateStep(3, { status: "running" }); + + const fileHash = computeFileHash(zipPath); + + const startRes = await apiPost( + `${BASE_URL}/api/uploads/start`, + { + key: UPLOAD_KEY, + contentType: CONTENT_TYPE, + fileSize, + fileHash, + }, + authHeaders(token) + ); + + const { uploadId, urls: partUrls, totalParts, partSize } = startRes; + appendLog(3, `Upload ID: ${uploadId.slice(0, 32)}...`); + appendLog(3, `File hash: ${fileHash}`); + appendLog(3, `File size: ${fileSizeMB} MB`); + appendLog(3, `Parts: ${totalParts}`); + updateStep(3, { status: "done", detail: `${totalParts} parts` }); + + // ─── Step 4: Upload parts ─────────────────────────────────────── + updateStep(4, { status: "running", progress: { bytes: 0, totalBytes: fileSize } }); + + // Use the partSize from the server response + const completedParts: { partNumber: number; etag: string }[] = []; + let totalBytesUploaded = 0; + + for (const part of partUrls) { + const prevPartsBytes = totalBytesUploaded; + const etag = await uploadPart( + part.url, + zipPath, + part.partNumber, + partSize, + totalParts, + (partBytes) => { + updateStep(4, { + status: "running", + progress: { bytes: prevPartsBytes + partBytes, totalBytes: fileSize }, + }); + } + ); + + // Update total bytes for next part's baseline + const thisPartSize = part.partNumber === totalParts + ? fileSize - (partSize * (totalParts - 1)) + : partSize; + totalBytesUploaded += thisPartSize; + + completedParts.push({ partNumber: part.partNumber, etag }); + + // Notify server of part completion + await apiPost( + `${BASE_URL}/api/uploads/part-complete`, + { + uploadId, + partNumber: part.partNumber, + etag, + }, + authHeaders(token) + ); + } + + updateStep(4, { + status: "done", + detail: `${fileSizeMB} MB uploaded`, + progress: undefined, + }); + + // ─── Step 5: Complete ──────────────────────────────────────────── + updateStep(5, { status: "running" }); + + await apiPost( + `${BASE_URL}/api/uploads/complete`, + { + key: UPLOAD_KEY, + uploadId, + parts: completedParts.sort((a, b) => a.partNumber - b.partNumber), + }, + authHeaders(token) + ); + + appendLog(5, `Key: ${UPLOAD_KEY}`); + updateStep(5, { status: "done" }); + + // Cleanup zip + execSync(`rm -f "${zipPath}"`, { stdio: "pipe" }); + } catch (err: any) { + // Mark current running step as error + setSteps((prev) => + prev.map((s) => + s.status === "running" + ? { ...s, status: "error" as StepStatus, detail: err.message } + : s + ) + ); + } + })(); + }, []); + + const allDone = steps.every((s) => s.status === "done" || s.status === "error"); + const hasError = steps.some((s) => s.status === "error"); + + return ( + + + + 🚀 Build & Deploy Galaxy → Hermes + + + + {steps.map((step, i) => ( + + ))} + + {allDone && ( + + {hasError ? ( + + ✗ Deploy failed. + + ) : ( + + ✓ Deploy complete! + + )} + + )} + + ); +} + +render(); \ No newline at end of file diff --git a/script/build-and-deploy-hermes/tsconfig.json b/script/build-and-deploy-hermes/tsconfig.json new file mode 100644 index 00000000..a159073f --- /dev/null +++ b/script/build-and-deploy-hermes/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "jsx": "react-jsx", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "outDir": "dist", + "rootDir": "src" + }, + "include": ["src"] +} \ No newline at end of file diff --git a/script/build-and-deploy-hermes/yarn.lock b/script/build-and-deploy-hermes/yarn.lock new file mode 100644 index 00000000..cb4d26fe --- /dev/null +++ b/script/build-and-deploy-hermes/yarn.lock @@ -0,0 +1,504 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@alcalzone/ansi-tokenize@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.1.3.tgz#9f89839561325a8e9a0c32360b8d17e48489993f" + integrity sha512-3yWxPTq3UQ/FY9p1ErPxIyfT64elWaMvM9lIHnaqpyft63tkxodF5aUElYHrdisWve5cETkh1+KBw1yJuW0aRw== + dependencies: + ansi-styles "^6.2.1" + is-fullwidth-code-point "^4.0.0" + +"@esbuild/aix-ppc64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz#7a01a8d2ec2fbb2dac78adad09b0fa781e4082be" + integrity sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ== + +"@esbuild/android-arm64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz#b540a27d14e4afd058496a4dbec4d3f414db110a" + integrity sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg== + +"@esbuild/android-arm@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.28.1.tgz#704bd297de6d762de54eabbeafbf55f6756abe2f" + integrity sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ== + +"@esbuild/android-x64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.28.1.tgz#d1cb166d34b0fbf0fe8ab460a5594f24a378701e" + integrity sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng== + +"@esbuild/darwin-arm64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz#1034b26457fc886368fe61bbd09f653f6afa8e54" + integrity sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q== + +"@esbuild/darwin-x64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz#65556a432a1e4d72032d8218c1932fcca1a49772" + integrity sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ== + +"@esbuild/freebsd-arm64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz#2e61e0592f9030d7e3dae18ee25ebc535918aef6" + integrity sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw== + +"@esbuild/freebsd-x64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz#c95ec289959ef8079c4dca817a1e2c4be66b9bd3" + integrity sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ== + +"@esbuild/linux-arm64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz#40b22175dda06182f3ee8141186c5ff304c4a717" + integrity sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g== + +"@esbuild/linux-arm@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz#c09a0f67917592ac0de892a9be4d3814debd2a6c" + integrity sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ== + +"@esbuild/linux-ia32@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz#a580f9c676797833891e519fc7a1337c8afd8db3" + integrity sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w== + +"@esbuild/linux-loong64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz#46452cf321dc7f9e91c2fa780a56bb56e79cd68b" + integrity sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg== + +"@esbuild/linux-mips64el@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz#4211b3184dd6608f53dcb22e39f5d34ee08852c8" + integrity sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ== + +"@esbuild/linux-ppc64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz#697857c2a61cb9b0b6bb6652e40c1dc5e1ca8e5d" + integrity sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ== + +"@esbuild/linux-riscv64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz#d192943eb146a40ac4c6497d0cf7be35b986bf08" + integrity sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ== + +"@esbuild/linux-s390x@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz#acea0356da0e0ebc08f97cf7b9c2e401e1e648dc" + integrity sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag== + +"@esbuild/linux-x64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz#6f0c3ce0cb64c534b70c4c45ecb2c16d34e35dfd" + integrity sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA== + +"@esbuild/netbsd-arm64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz#8bcd77077a0dce3378b574fedb26d2a253b73d36" + integrity sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw== + +"@esbuild/netbsd-x64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz#e7fb2a01e99c830c94e6623cd9fefb4c8fb58347" + integrity sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg== + +"@esbuild/openbsd-arm64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz#c52909372db8b86e2c55e05a8940033b5660a3b2" + integrity sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q== + +"@esbuild/openbsd-x64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz#c427b9be5a64c262ff9a7eb70b5fbbaadf446c6c" + integrity sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw== + +"@esbuild/openharmony-arm64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz#dc9b147baca2e6c4b3c85571741ef4860a489097" + integrity sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg== + +"@esbuild/sunos-x64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz#ce866d12df13c15e4c99f073a3d466f6e0649b3a" + integrity sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ== + +"@esbuild/win32-arm64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz#7468e3692d01d629d5941e5d83817bb80f9e39b4" + integrity sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA== + +"@esbuild/win32-ia32@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz#a5bc0063fb2bcab6d0ed63f2a1537958bc269ec6" + integrity sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg== + +"@esbuild/win32-x64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz#10064ee44f4347b90c9a02b446bbf80a91632b12" + integrity sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A== + +"@types/node@^26.0.0": + version "26.0.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-26.0.0.tgz#d4aece9e9412e9f2008d59bc2d74f5279316b665" + integrity sha512-vf2YFi1iY9lHGwNJMs01biZFbKJkrZR1T6/MlzjhJLPdntOHLhTrDSnSVcdtvjihi4VQNlrFRIxLsDBlQpAipA== + dependencies: + undici-types "~8.3.0" + +"@types/prop-types@*": + version "15.7.15" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.15.tgz#e6e5a86d602beaca71ce5163fadf5f95d70931c7" + integrity sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw== + +"@types/react@^18.3.12": + version "18.3.31" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.31.tgz#b5e95e28ffcceab8d982f33f2eb076e17653c2a4" + integrity sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw== + dependencies: + "@types/prop-types" "*" + csstype "^3.2.2" + +ansi-escapes@^7.0.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.3.0.tgz#5395bb74b2150a4a1d6e3c2565f4aeca78d28627" + integrity sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg== + dependencies: + environment "^1.0.0" + +ansi-regex@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" + integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== + +ansi-styles@^6.0.0, ansi-styles@^6.2.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" + integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== + +auto-bind@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-5.0.1.tgz#50d8e63ea5a1dddcb5e5e36451c1a8266ffbb2ae" + integrity sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg== + +chalk@^5.3.0: + version "5.6.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.6.2.tgz#b1238b6e23ea337af71c7f8a295db5af0c158aea" + integrity sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA== + +cli-boxes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" + integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== + +cli-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" + integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== + dependencies: + restore-cursor "^4.0.0" + +cli-spinners@^2.7.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + +cli-truncate@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" + integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== + dependencies: + slice-ansi "^5.0.0" + string-width "^7.0.0" + +code-excerpt@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-4.0.0.tgz#2de7d46e98514385cb01f7b3b741320115f4c95e" + integrity sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA== + dependencies: + convert-to-spaces "^2.0.1" + +convert-to-spaces@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz#61a6c98f8aa626c16b296b862a91412a33bceb6b" + integrity sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ== + +csstype@^3.2.2: + version "3.2.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.2.3.tgz#ec48c0f3e993e50648c86da559e2610995cf989a" + integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== + +emoji-regex@^10.3.0: + version "10.6.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.6.0.tgz#bf3d6e8f7f8fd22a65d9703475bc0147357a6b0d" + integrity sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A== + +environment@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" + integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== + +es-toolkit@^1.22.0: + version "1.48.1" + resolved "https://registry.yarnpkg.com/es-toolkit/-/es-toolkit-1.48.1.tgz#4e8a7c3b0fe3a80f4d640934c8552238f25430c7" + integrity sha512-wfnXlwd5I75eXRtdD2vuEs50xHHESECDsGD7yiQnfFVNoa5522NwXEbmgo98LfiukSQHs+mBM7/YG3qKJB9/mQ== + +esbuild@~0.28.0: + version "0.28.1" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.28.1.tgz#ef45b4634c9c9d97a296aea4114a5f9840f95578" + integrity sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw== + optionalDependencies: + "@esbuild/aix-ppc64" "0.28.1" + "@esbuild/android-arm" "0.28.1" + "@esbuild/android-arm64" "0.28.1" + "@esbuild/android-x64" "0.28.1" + "@esbuild/darwin-arm64" "0.28.1" + "@esbuild/darwin-x64" "0.28.1" + "@esbuild/freebsd-arm64" "0.28.1" + "@esbuild/freebsd-x64" "0.28.1" + "@esbuild/linux-arm" "0.28.1" + "@esbuild/linux-arm64" "0.28.1" + "@esbuild/linux-ia32" "0.28.1" + "@esbuild/linux-loong64" "0.28.1" + "@esbuild/linux-mips64el" "0.28.1" + "@esbuild/linux-ppc64" "0.28.1" + "@esbuild/linux-riscv64" "0.28.1" + "@esbuild/linux-s390x" "0.28.1" + "@esbuild/linux-x64" "0.28.1" + "@esbuild/netbsd-arm64" "0.28.1" + "@esbuild/netbsd-x64" "0.28.1" + "@esbuild/openbsd-arm64" "0.28.1" + "@esbuild/openbsd-x64" "0.28.1" + "@esbuild/openharmony-arm64" "0.28.1" + "@esbuild/sunos-x64" "0.28.1" + "@esbuild/win32-arm64" "0.28.1" + "@esbuild/win32-ia32" "0.28.1" + "@esbuild/win32-x64" "0.28.1" + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +get-east-asian-width@^1.0.0, get-east-asian-width@^1.3.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz#216900f91df11a8b2c198c3e1d93d6c035a776b9" + integrity sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA== + +indent-string@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" + integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== + +ink-spinner@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ink-spinner/-/ink-spinner-5.0.0.tgz#32ec318ef8ebb0ace8f595451f8e93280623429f" + integrity sha512-EYEasbEjkqLGyPOUc8hBJZNuC5GvXGMLu0w5gdTNskPc7Izc5vO3tdQEYnzvshucyGCBXc86ig0ujXPMWaQCdA== + dependencies: + cli-spinners "^2.7.0" + +ink@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/ink/-/ink-5.2.1.tgz#b9ea59f0d1eab2b4566903b35b54fd34323d1694" + integrity sha512-BqcUyWrG9zq5HIwW6JcfFHsIYebJkWWb4fczNah1goUO0vv5vneIlfwuS85twyJ5hYR/y18FlAYUxrO9ChIWVg== + dependencies: + "@alcalzone/ansi-tokenize" "^0.1.3" + ansi-escapes "^7.0.0" + ansi-styles "^6.2.1" + auto-bind "^5.0.1" + chalk "^5.3.0" + cli-boxes "^3.0.0" + cli-cursor "^4.0.0" + cli-truncate "^4.0.0" + code-excerpt "^4.0.0" + es-toolkit "^1.22.0" + indent-string "^5.0.0" + is-in-ci "^1.0.0" + patch-console "^2.0.0" + react-reconciler "^0.29.0" + scheduler "^0.23.0" + signal-exit "^3.0.7" + slice-ansi "^7.1.0" + stack-utils "^2.0.6" + string-width "^7.2.0" + type-fest "^4.27.0" + widest-line "^5.0.0" + wrap-ansi "^9.0.0" + ws "^8.18.0" + yoga-layout "~3.2.1" + +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + +is-fullwidth-code-point@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz#046b2a6d4f6b156b2233d3207d4b5a9783999b98" + integrity sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ== + dependencies: + get-east-asian-width "^1.3.1" + +is-in-ci@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-in-ci/-/is-in-ci-1.0.0.tgz#9a86bbda7e42c6129902e0574c54b018fbb6ab88" + integrity sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg== + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +loose-envify@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +patch-console@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/patch-console/-/patch-console-2.0.0.tgz#9023f4665840e66f40e9ce774f904a63167433bb" + integrity sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA== + +react-reconciler@^0.29.0: + version "0.29.2" + resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.29.2.tgz#8ecfafca63549a4f4f3e4c1e049dd5ad9ac3a54f" + integrity sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.2" + +react@^18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== + dependencies: + loose-envify "^1.1.0" + +restore-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" + integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +scheduler@^0.23.0, scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== + dependencies: + loose-envify "^1.1.0" + +signal-exit@^3.0.2, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + +slice-ansi@^7.1.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.2.tgz#adf7be70aa6d72162d907cd0e6d5c11f507b5403" + integrity sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w== + dependencies: + ansi-styles "^6.2.1" + is-fullwidth-code-point "^5.0.0" + +stack-utils@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +string-width@^7.0.0, string-width@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" + integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== + dependencies: + emoji-regex "^10.3.0" + get-east-asian-width "^1.0.0" + strip-ansi "^7.1.0" + +strip-ansi@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.2.0.tgz#d22a269522836a627af8d04b5c3fd2c7fa3e32e3" + integrity sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w== + dependencies: + ansi-regex "^6.2.2" + +tsx@^4.19.0: + version "4.22.4" + resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.22.4.tgz#0ab3b7fb4ec7feeee74e5b1f26337caa71e44700" + integrity sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg== + dependencies: + esbuild "~0.28.0" + optionalDependencies: + fsevents "~2.3.3" + +type-fest@^4.27.0: + version "4.41.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.41.0.tgz#6ae1c8e5731273c2bf1f58ad39cbae2c91a46c58" + integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA== + +typescript@^5.6.0: + version "5.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" + integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== + +undici-types@~8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-8.3.0.tgz#44e9fc9f3244648cdea35e4f9bb2d681e9410809" + integrity sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ== + +widest-line@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-5.0.0.tgz#b74826a1e480783345f0cd9061b49753c9da70d0" + integrity sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA== + dependencies: + string-width "^7.0.0" + +wrap-ansi@^9.0.0: + version "9.0.2" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.2.tgz#956832dea9494306e6d209eb871643bb873d7c98" + integrity sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww== + dependencies: + ansi-styles "^6.2.1" + string-width "^7.0.0" + strip-ansi "^7.1.0" + +ws@^8.18.0: + version "8.21.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.21.0.tgz#012e413fc07429945121b0c153158c4343086951" + integrity sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g== + +yoga-layout@~3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/yoga-layout/-/yoga-layout-3.2.1.tgz#d2d1ba06f0e81c2eb650c3e5ad8b0b4adde1e843" + integrity sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ== diff --git a/script/install-galaxy.sh b/script/install-galaxy.sh index 0a3be6c0..e64f5670 100755 --- a/script/install-galaxy.sh +++ b/script/install-galaxy.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # -# install-galaxy.sh — Clone, build, and install Galaxy.app on macOS. +# install-galaxy.sh — Download, sign, and install Galaxy.app on macOS. # # Usage: # curl -fsSL https://mng-web-sharing.mini-games.tv/wst-data/ryan-share/galaxy/install-galaxy.sh | bash @@ -10,99 +10,45 @@ set -euo pipefail -REPO_URL="git@gitlab.com:samnasbo/shared/galaxy.git" -CLONE_DIR="$HOME/.galaxy/source" +DOWNLOAD_URL="https://mng-web-sharing.mini-games.tv/wst-data/ryan-share/galaxy/Galaxy.zip" APP_NAME="Galaxy.app" INSTALL_DIR="/Applications" -BUNDLE_BIN="galaxy-oss" -BUNDLE_PKG="galaxy" # ---------- helpers ---------- info() { printf "\033[1;34m==>\033[0m %s\n" "$1"; } warn() { printf "\033[1;33m==> WARNING:\033[0m %s\n" "$1"; } fail() { printf "\033[1;31m==> ERROR:\033[0m %s\n" "$1"; exit 1; } -# ---------- 1. Xcode / CLI tools ---------- -info "Checking Xcode and Command Line Tools..." +# ---------- 1. Download ---------- +TMP_DIR=$(mktemp -d) +trap 'rm -rf "$TMP_DIR"' EXIT -if ! xcode-select -p &>/dev/null; then - fail "Xcode Command Line Tools are not installed. Run: xcode-select --install" +info "Downloading Galaxy.zip..." +curl -fSL -o "$TMP_DIR/Galaxy.zip" "$DOWNLOAD_URL" || fail "Failed to download Galaxy.zip" + +# ---------- 2. Extract ---------- +info "Extracting Galaxy.app..." +unzip -q "$TMP_DIR/Galaxy.zip" -d "$TMP_DIR" || fail "Failed to extract Galaxy.zip" + +# Remove macOS zip artifacts that cause "unsealed contents" errors during signing +rm -rf "$TMP_DIR/__MACOSX" +find "$TMP_DIR/$APP_NAME" -name '.DS_Store' -delete 2>/dev/null || true +find "$TMP_DIR/$APP_NAME" -name '._*' -delete 2>/dev/null || true +# Remove custom Icon file from bundle root (causes "unsealed contents" codesign error) +rm -f "$TMP_DIR/$APP_NAME/Icon"$'\r' "$TMP_DIR/$APP_NAME/Icon" 2>/dev/null || true + +if [[ ! -d "$TMP_DIR/$APP_NAME" ]]; then + fail "$APP_NAME not found after extraction." fi -if ! xcrun --show-sdk-path &>/dev/null; then - fail "Xcode SDK not found. Ensure Xcode or Command Line Tools are properly installed." -fi +# ---------- 3. Clear quarantine & ad-hoc sign ---------- +info "Clearing quarantine attributes..." +sudo /usr/bin/xattr -cr "$TMP_DIR/$APP_NAME" -if ! xcrun -f metal &>/dev/null; then - warn "Metal compiler not found. Attempting to download Metal toolchain..." - xcodebuild -downloadComponent MetalToolchain || warn "Could not download Metal toolchain — build may fail." -fi +info "Ad-hoc code signing..." +codesign --force --deep --sign - "$TMP_DIR/$APP_NAME" || fail "Code signing failed." -info "Xcode prerequisites look good." - -# ---------- 2. Homebrew ---------- -if ! command -v brew &>/dev/null; then - info "Installing Homebrew..." - /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - - # Add brew to PATH for Apple Silicon - if [[ -f /opt/homebrew/bin/brew ]]; then - eval "$(/opt/homebrew/bin/brew shellenv)" - fi -fi - -if ! command -v pkgconf &>/dev/null && ! command -v pkg-config &>/dev/null; then - info "Installing pkgconf via Homebrew..." - brew install pkgconf -fi - -# ---------- 3. Rust toolchain ---------- -if ! command -v rustup &>/dev/null; then - info "Installing Rust via rustup..." - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y - source "$HOME/.cargo/env" -fi - -info "Syncing Rust toolchain (rust-toolchain.toml will pin the exact version)..." -rustup show active-toolchain &>/dev/null || rustup default stable - -# aarch64-apple-darwin target for Apple Silicon -rustup target add aarch64-apple-darwin 2>/dev/null || true - -# cargo-bundle for producing the .app -if ! cargo bundle --help &>/dev/null 2>&1; then - info "Installing cargo-bundle..." - cargo install cargo-bundle \ - --git=https://github.com/burtonageo/cargo-bundle \ - --rev ae4c76e92c08774bf54ff077b1c52e3d1cd6c16d -fi - -# ---------- 4. Clone the repo ---------- -if [[ -d "$CLONE_DIR/.git" ]]; then - info "Repository already exists at $CLONE_DIR — pulling latest..." - git -C "$CLONE_DIR" fetch origin - git -C "$CLONE_DIR" reset --hard origin/master -else - info "Cloning Galaxy into $CLONE_DIR..." - mkdir -p "$(dirname "$CLONE_DIR")" - git clone "$REPO_URL" "$CLONE_DIR" -fi - -# ---------- 5. Build ---------- -info "Fetching dependencies..." -pushd "$CLONE_DIR" > /dev/null -cargo fetch - -info "Building and bundling $APP_NAME (release)..." -cargo bundle --release --bin "$BUNDLE_BIN" --package "$BUNDLE_PKG" -popd > /dev/null - -BUILT_APP="$CLONE_DIR/target/release/bundle/osx/$APP_NAME" -if [[ ! -d "$BUILT_APP" ]]; then - fail "Bundle not found at $BUILT_APP — build may have failed." -fi - -# ---------- 6. Kill, remove, install, launch ---------- +# ---------- 4. Kill, remove, install, launch ---------- info "Stopping any running Galaxy processes..." pkill -x "Galaxy" 2>/dev/null && sleep 1 || true pkill -9 -x "Galaxy" 2>/dev/null || true @@ -114,7 +60,7 @@ if [[ -d "$INSTALLED_APP" ]]; then fi info "Copying $APP_NAME to $INSTALL_DIR..." -cp -R "$BUILT_APP" "$INSTALL_DIR/" +cp -R "$TMP_DIR/$APP_NAME" "$INSTALL_DIR/" info "Launching Galaxy..." open "$INSTALLED_APP"