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

- Remove warp-channel-config dependency; all bin targets hardcode ChannelConfig inline
- Rename bin targets: galaxy-oss, galaxy-local, galaxy-stable, galaxy-dev, galaxy-preview
- Rename config dir from .galaxy-ai to .galaxy
- Add Galaxy app icon (512x512 rounded PNG + SVG logo)
- Replace settings gear icon with Stars (sparkle) icon
- Remove lightbulb/resource center button from header toolbar
- Add Galaxy logo SVG to Settings > About page
- Rename Galaxify -> Galaxyize across all UI strings
- Remove Create Team / Join Team sections from Galaxy Drive
- Fix missing => in OpenRichInput match arms
- Clean up unused imports and warnings
- Update Cargo.toml bundle metadata with Samsung branding
- Re-enable code review, project explorer, global search in settings
This commit is contained in:
Ryan Ward
2026-05-13 01:29:25 -05:00
parent ebafd9322d
commit 11152f2f40
41 changed files with 551 additions and 552 deletions
+3
View File
@@ -55,3 +55,6 @@ desired_behavior.md
# Don't include the python cache for bundled skills.
__pycache__/
# Local Warp upstream reference checkout (used by pull_warp_feature skill)
.galaxy/
+360
View File
@@ -0,0 +1,360 @@
---
name: pull_warp_feature
description: Pull a feature from the upstream Warp codebase into the Galaxy fork. Use this skill whenever the user wants to port, backport, or bring over a feature from Warp into Galaxy. This skill handles cloning the Warp source, analyzing the feature for Warp-specific dependencies, planning safe replacements, and implementing the port.
---
# Pull Warp Feature into Galaxy
This skill orchestrates porting a feature from the upstream Warp terminal (github.com/warpdotdev/warp) into the Galaxy fork. It is intentionally cautious — Galaxy MUST NOT contain any Warp-proprietary service dependencies, Warp API calls, or Warp cloud infrastructure ties.
---
## Phase 1: Acquire Warp Source
Before anything else, ensure a clean copy of the Warp source exists locally for reference.
### Steps
1. Check if `.galaxy/warp-upstream/` already exists in the project root:
```bash
ls -d .galaxy/warp-upstream/.git 2>/dev/null
```
2. **If it does NOT exist**, clone the Warp repo:
```bash
mkdir -p .galaxy
git clone --depth 1 https://github.com/warpdotdev/warp.git .galaxy/warp-upstream
```
Use `--depth 1` to keep it lightweight. If deeper history is needed for a specific feature, deepen later with `git fetch --unshallow`.
3. **If it DOES exist**, pull latest:
```bash
git -C .galaxy/warp-upstream pull --ff-only
```
4. **Ensure `.galaxy/` is gitignored.** Check `.gitignore` for a `.galaxy/` entry. If missing, append it:
```bash
echo ".galaxy/" >> .gitignore
```
IMPORTANT: Verify the line doesn't already exist before appending. Use `grep -q "^\.galaxy/" .gitignore` first.
5. **NEVER commit the `.galaxy/` directory or its contents.** It is a local-only reference checkout.
---
## Phase 2: Identify the Feature
Once the Warp source is available, ask the user:
> **What feature are you looking at bringing over?**
Wait for the user's response. Do NOT proceed until you have a clear answer.
### Interpreting the response
- The user may describe the feature by name (e.g. "tab drag and drop", "AI suggestions", "voice input").
- The user may reference a specific file, module, or PR number.
- The user may describe behavior they saw in Warp and want in Galaxy.
Accept any of these as valid starting points.
---
## Phase 3: Deep Feature Analysis
Once you know the target feature, perform a thorough investigation. You need to build a complete dependency map before making any promises.
### 3a. Locate the feature in Warp source
Search the Warp source at `.galaxy/warp-upstream/` for the feature:
- Use `grep`, `codebase_semantic_search`, and `file_glob` against `.galaxy/warp-upstream/`
- Read the relevant source files in full
- Identify the entry points, data models, UI components, and backend calls
- Map out every file the feature touches
### 3b. Locate the corresponding code in Galaxy
Search the Galaxy codebase to understand:
- Does Galaxy already have a partial implementation of this feature?
- What Galaxy modules correspond to the Warp modules this feature touches?
- Are there naming differences? (e.g. `warp_core``galaxy_core`, `WarpUI``GalaxyUI`)
### 3c. Build the dependency inventory
For EVERY dependency the feature has, categorize it into one of these buckets:
**✅ SAFE — No changes needed:**
- Pure UI logic (elements, views, event handlers)
- Local computation (parsers, formatters, algorithms)
- Terminal emulation logic
- Platform-native APIs (macOS, Windows, Linux)
- Local filesystem operations
- Open-source crate dependencies already in Galaxy's `Cargo.toml`
**⚠️ REQUIRES REPLACEMENT — Can be ported with modification:**
- Warp AI / LLM calls → Must be replaced with Amazon Bedrock via `BedrockClient`
- Warp API HTTP endpoints → Must be removed or replaced with local storage
- Warp Drive cloud sync → Must be replaced with local `.galaxy/` storage or removed
- Warp authentication/identity → Must be removed or replaced with Galaxy auth
- Warp telemetry/analytics → Must be removed entirely
- Warp-specific feature flags → Must be converted to Galaxy `FeatureFlag` enum variants
- GraphQL queries to Warp server → Must be removed or rerouted
**🚫 BLOCKED — Cannot be ported:**
- Features that fundamentally require Warp's proprietary backend to function
- Features that require Warp's authentication tokens with no Bedrock/local alternative
- Features requiring real-time sync with Warp's cloud that cannot be made local
- Warp billing/subscription gating logic
### 3d. Ask follow-up questions
Based on your analysis, ask the user clarifying questions. These might include:
- "This feature uses Warp's X service — do you want me to replace it with Y, or skip that part?"
- "There are two sub-features here: A and B. A is clean to port, B requires major rework. Want both?"
- "The Warp version uses cloud storage for Z. Should I store this in `~/.galaxy-ai/` or `.galaxy/`?"
- "This depends on crate X which isn't in Galaxy yet. OK to add it?"
Do NOT proceed until the user has answered your follow-up questions and you are confident you understand the scope.
---
## Phase 4: Compatibility Assessment
This is the most critical phase. You must produce a detailed assessment. Go through EVERY dependency from Phase 3c and make a concrete determination.
### 4a. AI/LLM Dependencies
If the feature uses Warp AI in any way:
1. **Identify every AI call site** — What prompts are sent? What models are used? What's the expected response format?
2. **Determine if Bedrock can handle it** — Galaxy uses `BedrockClient::converse_stream` (see `app/src/ai/bedrock/client.rs`). The feature's AI usage MUST be expressible as Bedrock Converse API calls.
3. **Check for Warp-specific prompt engineering** — System prompts in Warp may reference Warp-specific context. These must be rewritten for Galaxy.
4. **Check for Warp-specific tool use** — If the feature defines custom AI tools, verify they don't call Warp APIs internally.
5. **Verdict**: Can it be "Bedrockified"? If NO → the feature CANNOT be ported. Stop and inform the user.
Key files for Bedrock integration reference:
- `app/src/ai/bedrock/client.rs` — Client implementation
- `app/src/ai/bedrock/convert_request.rs` — Request construction and system prompts
- `app/src/ai/bedrock/convert.rs` — Wire format conversion
- `app/src/ai/bedrock/tool_docs.rs` — Tool documentation
- `app/src/ai/bedrock/stream.rs` — Response stream processing
### 4b. Cloud Storage / Warp API Dependencies
If the feature calls Warp API endpoints or uses Warp Drive:
1. **List every HTTP/GraphQL call** the feature makes to Warp servers
2. **For each call, determine:**
- Can it be removed entirely without breaking the feature?
- Can it be replaced with local file storage in `~/.galaxy-ai/` or project-local `.galaxy/`?
- Can it be replaced with a different API (e.g. direct AWS call)?
3. **If it requires Warp server and there's no local alternative** → that specific sub-feature CANNOT be ported
4. **Local storage patterns to use:**
- User-scoped data: `~/.galaxy-ai/<feature>/`
- Project-scoped data: `.galaxy/<feature>/` (ensure gitignored)
- SQLite via Diesel: `app/src/persistence/` (for data that fits Galaxy's existing DB)
### 4c. Authentication Dependencies
If the feature requires Warp authentication:
1. Does Galaxy have its own auth that can substitute?
2. If the feature gates on "is the user logged in" — can this gate be removed?
3. If the feature requires user identity — can it use a local config value instead?
### 4d. Telemetry / Analytics
Any Warp telemetry, analytics, or tracking code MUST be stripped entirely. Do not replace it — remove it.
### 4e. Naming and Branding
All references to "Warp" in user-facing strings, comments, and identifiers must be changed to "Galaxy":
- `warp``galaxy`
- `Warp``Galaxy`
- `WARP``GALAXY`
- `warp_core``galaxy_core`
- `WarpUI``GalaxyUI`
- etc.
This includes:
- Rust module names and paths
- Struct/enum/function names
- String literals shown to users
- Comments and documentation
- Environment variable prefixes (`WARP_``GALAXY_`)
- Config file paths (`~/.warp/``~/.galaxy-ai/`)
---
## Phase 5: Present Findings and Plan
Present the user with a structured summary using the `create_plan` tool. The plan MUST include:
1. **Feature summary**: What the feature does in Warp, in 2-3 sentences
2. **Files to port**: Exact list of files from `.galaxy/warp-upstream/` and where they map in Galaxy
3. **Dependency assessment table** (as a list, not a markdown table):
- For each dependency: what it is, its category (SAFE / REQUIRES REPLACEMENT / BLOCKED), and the replacement strategy
4. **AI assessment**: Does it need AI? Can it be Bedrockified? What changes are needed?
5. **Cloud/API assessment**: Does it call Warp servers? What's the local replacement?
6. **Storage assessment**: Where will data live? What gets gitignored?
7. **Risk areas**: What might break? What needs extra testing?
8. **Estimated scope**: How many files are touched? Is this a 1-hour or 1-week port?
**CRITICAL**: Do NOT proceed to implementation until the user explicitly approves the plan.
If any part of the feature is BLOCKED, clearly state:
> "The following parts of this feature CANNOT be ported because they fundamentally require Warp's proprietary infrastructure: [list]. I recommend porting only the parts that are SAFE or REQUIRES REPLACEMENT."
---
## Phase 6: Implementation
Only after the user approves the plan, begin implementation.
### Implementation Rules
These rules are NON-NEGOTIABLE:
1. **NEVER copy Warp API URLs, tokens, or endpoint paths into Galaxy code.**
2. **NEVER leave Warp telemetry/analytics calls in the code, even commented out.**
3. **NEVER leave `warp` branding in user-facing strings.** Internal code comments referencing the upstream origin (e.g. "Ported from Warp's X module") are acceptable.
4. **ALL AI calls MUST go through `BedrockClient`** — no direct OpenAI, Anthropic, or other provider calls.
5. **ALL cloud storage MUST be local**`~/.galaxy-ai/` for user data, `.galaxy/` for project data, or Diesel/SQLite for persistent structured data.
6. **ALL feature flags MUST use Galaxy's `FeatureFlag` enum** in `galaxy_features/src/lib.rs`.
7. **ALL environment variables MUST use the `GALAXY_` prefix.**
8. **ALL config paths MUST use `~/.galaxy-ai/`** not `~/.warp/`.
### Implementation Procedure
1. **Create a TODO list** with discrete steps for the port.
2. **Port files one module at a time**, in dependency order (deepest dependencies first, UI last):
- Copy the file from `.galaxy/warp-upstream/` to the correct Galaxy location
- Rename all Warp references to Galaxy equivalents
- Replace all REQUIRES REPLACEMENT dependencies with Galaxy alternatives
- Remove all BLOCKED dependencies and any code paths that depend on them
- Ensure all `use` / `mod` statements point to Galaxy crate names
3. **After each module**, verify it compiles:
```bash
cargo check -p <crate_name>
```
4. **After all modules are ported**, run full workspace checks:
```bash
cargo fmt
cargo clippy --workspace --all-targets --all-features --tests -- -D warnings
```
5. **If the feature has tests in Warp**, port the tests too:
- Place tests in `${filename}_tests.rs` per Galaxy convention
- Update test assertions to reflect Galaxy behavior (no Warp API mocking)
- Run tests:
```bash
cargo nextest run --no-fail-fast -p <crate_name>
```
6. **Update documentation**:
- Update `GALAXY.md` if the feature changes architecture or adds commands
- Update `WARP.md` if it exists and needs corresponding changes
- Update `CLAUDE.md` if it exists in the project
7. **Final validation**:
```bash
cargo build
cargo nextest run --no-fail-fast --workspace --exclude command-signatures-v2
```
### Post-Implementation Audit
After implementation, perform a final audit. Search the entire diff for:
```bash
# In the changed files, search for any Warp leaks
grep -rn "warp\.dev" <changed_files>
grep -rn "api\.warp" <changed_files>
grep -rn "warpdotdev" <changed_files>
grep -rn "warp-server" <changed_files>
grep -rn "WARP_API" <changed_files>
grep -rn "warp_api" <changed_files>
```
Any hits (other than comments documenting the port origin) are bugs that must be fixed before completion.
Also verify no `.galaxy/` files were staged:
```bash
git status --porcelain | grep "^A.*\.galaxy/"
```
---
## Reference: Galaxy ↔ Warp Name Mapping
Common renames when porting:
- `warp` → `galaxy` (crate names, binary names)
- `warp_core` → `galaxy_core`
- `warpui` → `galaxyui`
- `warpui_core` → `galaxyui_core`
- `warpui_extras` → `galaxyui_extras`
- `warp_terminal` → `galaxy_terminal`
- `warp_util` → `galaxy_util`
- `warp_features` → `galaxy_features`
- `warp_completer` → `galaxy_completer`
- `warp_graphql_schema` → `galaxy_graphql_schema`
- `warp_cli` → `galaxy_cli`
- `WARP_` prefix env vars → `GALAXY_`
- `~/.warp/` → `~/.galaxy-ai/`
- Warp AI server endpoints → `BedrockClient::converse_stream`
- Warp Drive → local storage in `~/.galaxy-ai/` or `.galaxy/`
- `WarpAI` / `warp_ai` → `GalaxyAI` / `galaxy_ai`
## Reference: Bedrock Integration Points
When replacing Warp AI calls with Bedrock:
- Client: `app/src/ai/bedrock/client.rs` — `BedrockClient::converse_stream`
- Request building: `app/src/ai/bedrock/convert_request.rs`
- Response parsing: `app/src/ai/bedrock/stream.rs`
- Tool definitions: `app/src/ai/bedrock/tool_docs.rs`
- AWS credentials: `app/src/ai/aws_credentials.rs`
- Model selection: `app/src/ai/llms.rs`
All AI features MUST flow through these modules. Direct HTTP calls to any LLM provider are forbidden.
## Reference: Local Storage Patterns
When replacing Warp cloud storage:
- **User preferences / global state**: `~/.galaxy-ai/<feature_name>/`
- **Project-scoped state**: `<project_root>/.galaxy/<feature_name>/` (must be gitignored)
- **Structured persistent data**: Use Diesel ORM + SQLite via `app/src/persistence/`
- **Cached/temporary data**: `$TMPDIR/galaxy_<feature_name>/`
---
## Failure Modes — When to STOP
STOP the port and inform the user if:
1. The feature's core functionality requires real-time communication with Warp's servers and there is no local alternative.
2. The feature's AI usage cannot be expressed as Bedrock Converse API calls (e.g. it requires fine-tuned Warp-specific models with no public equivalent).
3. The feature depends on Warp-proprietary data formats or protocols that are not documented in the open-source repo.
4. Porting the feature would require modifying more than 30% of Galaxy's existing codebase — this suggests architectural incompatibility.
5. The feature's tests all depend on Warp server mocks that have no Galaxy equivalent, making it untestable.
In these cases, present the user with:
- WHY the port is blocked
- WHICH specific dependency is the blocker
- WHETHER a partial port (subset of functionality) is viable
- WHAT alternative approaches might achieve similar UX without the blocked dependency
+5
View File
@@ -160,6 +160,11 @@ When adding/editing match statements, avoid using the wildcard _ when at all pos
- MCP config: `~/.galaxy-ai/.mcp.json`
- Environment variables use `GALAXY_` prefix (e.g., `GALAXY_API_KEY`, `GALAXY_INTEGRATION`)
### Skills
**pull_warp_feature** (`.warp/skills/pull_warp_feature/SKILL.md`):
Ports features from upstream Warp into Galaxy. Clones Warp source into `.galaxy/warp-upstream/` (gitignored), analyzes the feature for Warp-specific dependencies (AI → Bedrock, cloud → local storage, telemetry → removed), presents a compatibility plan, and implements the port after approval. All AI must go through `BedrockClient`; all cloud storage must be local.
## Future Work
### IDE-Level LSP Integration
+30 -39
View File
@@ -1,7 +1,7 @@
[package]
authors = ["Ryan Ward <ryan.ward@samsung.com>"]
default-run = "galaxy-ai-oss"
description = "Galaxy AI - AI-powered terminal for development teams"
default-run = "galaxy-oss"
description = "Galaxy - AI-powered terminal"
edition = "2021"
autobins = false
name = "galaxy"
@@ -18,27 +18,27 @@ path = "src/lib.rs"
# flag overrides). Otherwise these binaries are exactly identical to our main binary.
[[bin]]
name = "galaxy-ai-oss"
name = "galaxy-oss"
path = "src/bin/oss.rs"
test = false
[[bin]]
name = "galaxy-ai"
name = "galaxy-local"
path = "src/bin/local.rs"
test = false
[[bin]]
name = "stable"
name = "galaxy-stable"
path = "src/bin/stable.rs"
test = false
[[bin]]
name = "dev"
name = "galaxy-dev"
path = "src/bin/dev.rs"
test = false
[[bin]]
name = "preview"
name = "galaxy-preview"
path = "src/bin/preview.rs"
required-features = ["preview_channel"]
test = false
@@ -932,55 +932,46 @@ codex_notifications = []
cloud_mode_setup_v2 = ["cloud_mode"]
cloud_mode_input_v2 = ["cloud_mode"]
[package.metadata.bundle.bin.warp-oss]
[package.metadata.bundle.bin.galaxy-oss]
category = "public.app-category.developer-tools"
copyright = "© 2025, Denver Technologies, Inc"
identifier = "dev.galaxy.GalaxyOss"
copyright = "© 2026, Samsung Electronics Co., Ltd."
identifier = "com.samsung.Galaxy"
name = "Galaxy"
resources = ["assets/onboarding"]
icon = ["channels/oss/icon/no-padding/512x512.png", "channels/oss/icon/no-padding/icon.ico"]
short_description = "The open-source, cloud-backed terminal for individuals and teams."
short_description = "Galaxy - AI-powered terminal for development teams."
[package.metadata.bundle.bin.stable]
[package.metadata.bundle.bin.galaxy-stable]
category = "public.app-category.developer-tools"
copyright = "© 2025, Denver Technologies, Inc"
identifier = "dev.galaxy.Galaxy-Stable"
copyright = "© 2026, Samsung Electronics Co., Ltd."
identifier = "com.samsung.Galaxy-Stable"
name = "Galaxy"
osx_frameworks = [
"frameworks/default/Sentry-Dynamic-WithARM64e.xcframework/macos-arm64_arm64e_x86_64/Sentry.framework",
]
resources = ["assets/onboarding"]
short_description = "The cloud-backed terminal for individuals and teams, stable build."
short_description = "Galaxy - AI-powered terminal, stable build."
[package.metadata.bundle.bin.preview]
[package.metadata.bundle.bin.galaxy-preview]
category = "public.app-category.developer-tools"
copyright = "© 2025, Denver Technologies, Inc"
identifier = "dev.galaxy.Galaxy-Preview"
name = "GalaxyPreview"
osx_frameworks = [
"frameworks/default/Sentry-Dynamic-WithARM64e.xcframework/macos-arm64_arm64e_x86_64/Sentry.framework",
]
copyright = "© 2026, Samsung Electronics Co., Ltd."
identifier = "com.samsung.Galaxy-Preview"
name = "Galaxy Preview"
resources = ["assets/onboarding"]
short_description = "The cloud-backed terminal for individuals and teams, feature preview build."
short_description = "Galaxy - AI-powered terminal, preview build."
[package.metadata.bundle.bin.dev]
[package.metadata.bundle.bin.galaxy-dev]
category = "public.app-category.developer-tools"
copyright = "© 2025, Denver Technologies, Inc"
identifier = "dev.galaxy.Galaxy-Dev"
name = "GalaxyDev"
osx_frameworks = [
"frameworks/dev/Sentry-Dynamic-WithARM64e.xcframework/macos-arm64_arm64e_x86_64/Sentry.framework",
]
copyright = "© 2026, Samsung Electronics Co., Ltd."
identifier = "com.samsung.Galaxy-Dev"
name = "Galaxy Dev"
resources = ["assets/onboarding"]
short_description = "The cloud-backed terminal for individuals and teams, developer build."
short_description = "Galaxy - AI-powered terminal, developer build."
[package.metadata.bundle.bin.warp]
[package.metadata.bundle.bin.galaxy-local]
category = "public.app-category.developer-tools"
copyright = "© 2025, Denver Technologies, Inc"
identifier = "dev.galaxy.Galaxy-Local"
name = "GalaxyLocal"
copyright = "© 2026, Samsung Electronics Co., Ltd."
identifier = "com.samsung.Galaxy-Local"
name = "Galaxy Local"
resources = ["assets/onboarding"]
short_description = "The cloud-backed terminal for individuals and teams, developer build."
short_description = "Galaxy - AI-powered terminal, local build."
[package.metadata.cargo-udeps.ignore]
normal = ["embed_plist"]
+2 -2
View File
@@ -3,11 +3,11 @@
<plist version="1.0">
<dict>
<key>CFBundleIdentifier</key>
<string>com.samsung.GalaxyAIDockTilePlugin</string>
<string>com.samsung.GalaxyDockTilePlugin</string>
<key>CFBundleExecutable</key>
<string>WarpDockTilePlugin</string>
<key>CFBundleName</key>
<string>GalaxyAIDockTilePlugin</string>
<string>GalaxyDockTilePlugin</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
Binary file not shown.

After

Width:  |  Height:  |  Size: 246 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 KiB

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

After

Width:  |  Height:  |  Size: 624 B

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

After

Width:  |  Height:  |  Size: 246 KiB

+1 -1
View File
@@ -28,7 +28,7 @@ use crate::{
///
/// This should be used, for example, as the base directory under which
/// repository workflows would be stored (in "./.warp-core/workflows").
pub const WARP_CONFIG_DIR: &str = ".galaxy-ai";
pub const WARP_CONFIG_DIR: &str = ".galaxy";
/// The legacy config directory name used by Warp before the rename to Warp Core.
/// Used for auto-migration on first launch.
+5 -5
View File
@@ -152,13 +152,13 @@ mkdir -p "$OUT_DIR"
if [[ $RELEASE_CHANNEL = "local" ]]; then
WARP_BIN="warp"
BINARY_NAME="warp-local"
APP_NAME="WarpLocal"
APP_NAME="GalaxyLocal"
FEATURES="$FEATURES,agent_mode_debug"
export HANDLE_MARKDOWN=1
elif [[ $RELEASE_CHANNEL = "dev" ]]; then
WARP_BIN="dev"
BINARY_NAME="warp-dev"
APP_NAME="WarpDev"
APP_NAME="GalaxyDev"
FEATURES="$FEATURES,agent_mode_debug"
# Enable heap profiling using jemalloc through pprof.
FEATURES="$FEATURES,jemalloc_pprof"
@@ -166,16 +166,16 @@ elif [[ $RELEASE_CHANNEL = "dev" ]]; then
elif [[ $RELEASE_CHANNEL = "preview" ]]; then
WARP_BIN="preview"
BINARY_NAME="warp-preview"
APP_NAME="WarpPreview"
APP_NAME="GalaxyPreview"
FEATURES="$FEATURES,preview_channel"
elif [[ $RELEASE_CHANNEL = "stable" ]]; then
WARP_BIN="stable"
BINARY_NAME="warp"
APP_NAME="Warp"
APP_NAME="Galaxy"
elif [[ $RELEASE_CHANNEL = "oss" ]]; then
WARP_BIN="warp-oss"
BINARY_NAME="warp-oss"
APP_NAME="WarpOss"
APP_NAME="GalaxyOss"
# The OSS channel does not ship Sentry, so drop the crash_reporting feature
# (which would otherwise pull in the Sentry SDK as a dependency).
FEATURES="release_bundle"
+15 -15
View File
@@ -270,9 +270,9 @@ fi
if [[ $RELEASE_CHANNEL = "local" ]]; then
WARP_BIN="galaxy-ai"
BUNDLE_ID="com.samsung.GalaxyAI-Local"
WARP_APP_NAME="GalaxyAI"
WARP_SCHEME_NAME="galaxyai"
BUNDLE_ID="com.samsung.Galaxy-Local"
WARP_APP_NAME="Galaxy"
WARP_SCHEME_NAME="galaxy"
FEATURES="$FEATURES,agent_mode_debug"
# For local builds, use different versions of our bundled frameworks (e.g.:
# Sentry). This needs to be exported so it can be referenced by
@@ -280,9 +280,9 @@ if [[ $RELEASE_CHANNEL = "local" ]]; then
export FRAMEWORK_OVERRIDE="dev"
elif [[ $RELEASE_CHANNEL = "dev" ]]; then
WARP_BIN="dev"
BUNDLE_ID="com.samsung.GalaxyAI-Dev"
WARP_APP_NAME="GalaxyAIDev"
WARP_SCHEME_NAME="galaxyaidev"
BUNDLE_ID="com.samsung.Galaxy-Dev"
WARP_APP_NAME="GalaxyDev"
WARP_SCHEME_NAME="galaxydev"
FEATURES="$FEATURES,agent_mode_debug"
# Enable heap usage tracking & profiling using jemalloc through pprof.
FEATURES="$FEATURES,jemalloc_pprof,heap_usage_tracking"
@@ -293,22 +293,22 @@ elif [[ $RELEASE_CHANNEL = "dev" ]]; then
export HANDLE_MARKDOWN=1
elif [[ $RELEASE_CHANNEL = "preview" ]]; then
WARP_BIN="preview"
BUNDLE_ID="com.samsung.GalaxyAI-Preview"
WARP_APP_NAME="GalaxyAIPreview"
WARP_SCHEME_NAME="galaxyaipreview"
BUNDLE_ID="com.samsung.Galaxy-Preview"
WARP_APP_NAME="GalaxyPreview"
WARP_SCHEME_NAME="galaxypreview"
FEATURES="$FEATURES,preview_channel"
# Enable heap usage tracking & profiling using jemalloc through pprof.
FEATURES="$FEATURES,jemalloc_pprof,heap_usage_tracking"
elif [[ $RELEASE_CHANNEL = "stable" ]]; then
WARP_BIN="stable"
BUNDLE_ID="com.samsung.GalaxyAI"
WARP_APP_NAME="GalaxyAI"
WARP_SCHEME_NAME="galaxyai"
BUNDLE_ID="com.samsung.Galaxy"
WARP_APP_NAME="Galaxy"
WARP_SCHEME_NAME="galaxy"
elif [[ $RELEASE_CHANNEL = "oss" ]]; then
WARP_BIN="galaxy-ai-oss"
BUNDLE_ID="com.samsung.GalaxyAI"
WARP_APP_NAME="GalaxyAI"
WARP_SCHEME_NAME="galaxyai"
BUNDLE_ID="com.samsung.Galaxy"
WARP_APP_NAME="Galaxy"
WARP_SCHEME_NAME="galaxy"
# The OSS channel does not ship Sentry, so drop the cocoa_sentry feature
# (which would otherwise pull in the Sentry framework dependency).
FEATURES="release_bundle,extern_plist"
+5 -5
View File
@@ -91,28 +91,28 @@ $BUNDLE_ID = "dev.warp.$app_name"
if ("$CHANNEL" -eq 'local') {
$WARP_BIN = 'warp'
$BINARY_NAME = 'warp.exe'
$APP_NAME = 'WarpLocal'
$APP_NAME = 'GalaxyLocal'
$FEATURES = "$FEATURES,nld_improvements"
} elseif ("$CHANNEL" -eq 'dev') {
$WARP_BIN = 'dev'
$BINARY_NAME = 'dev.exe'
$APP_NAME = 'WarpDev'
$APP_NAME = 'GalaxyDev'
$FEATURES = "$FEATURES,agent_mode_debug,nld_improvements"
} elseif ("$CHANNEL" -eq 'preview') {
$WARP_BIN = 'preview'
$BINARY_NAME = 'preview.exe'
$APP_NAME = 'WarpPreview'
$APP_NAME = 'GalaxyPreview'
$FEATURES = "$FEATURES,preview_channel,nld_improvements"
} elseif ("$CHANNEL" -eq 'stable') {
$WARP_BIN = 'stable'
$BINARY_NAME = 'warp.exe'
$APP_NAME = 'Warp'
$APP_NAME = 'Galaxy'
# TODO(vorporeal): Remove this once we get tests passing with this default enabled.
$FEATURES = "$FEATURES,nld_improvements"
} elseif ("$CHANNEL" -eq 'oss') {
$WARP_BIN = 'warp-oss'
$BINARY_NAME = 'warp-oss.exe'
$APP_NAME = 'WarpOss'
$APP_NAME = 'GalaxyOss'
# The OSS channel does not ship Sentry, so drop the crash_reporting feature
# (which would otherwise pull in the Sentry SDK as a dependency).
$FEATURES = 'release_bundle,gui,nld_improvements'
+2 -2
View File
@@ -5,7 +5,7 @@
#define MyAppPublisher "Denver Technologies, Inc."
#define MyAppURL "https://www.warp.dev/"
#ifndef MyAppName
#define MyAppName "WarpDev"
#define MyAppName "GalaxyDev"
#endif
#ifndef MyAppVersion
#define MyAppVersion "0.1.0"
@@ -130,7 +130,7 @@ Root: HKA; Subkey: "Software\Classes\Directory\Background\shell\{#MyAppName}Wind
Root: HKA; Subkey: "Software\Classes\Directory\Background\shell\{#MyAppName}Window\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""{#MyAppName}://action/new_window?path=%V"""
[Tasks]
Name: addToPath; Description: "Add Warp to PATH"
Name: addToPath; Description: "Add Galaxy to PATH"
[UninstallDelete]
Type: filesandordirs; Name: "{userappdata}\warp\{#MyAppName}"