From f0de04ee2d380b0b6593ecbc16f767b9868c0ae4 Mon Sep 17 00:00:00 2001 From: Dariush Vesal Date: Sun, 8 Nov 2026 17:53:31 +0330 Subject: [PATCH] Update managed Hiddify installation to 5.5.5 --- AGENTS.md | 4 ++++ Cargo.lock | 30 +++++++++++++------------- Cargo.toml | 2 +- apps/desktop/package.json | 2 +- docs/adr/0138-hiddify-5-5-5.md | 26 +++++++++++++++++++++++ docs/adr/README.md | 1 + package.json | 2 +- src-tauri/src/deps.rs | 39 ++++++++++++++++++++++++---------- src-tauri/tauri.conf.json | 2 +- version | 2 +- 10 files changed, 79 insertions(+), 31 deletions(-) create mode 100644 docs/adr/0138-hiddify-5-5-5.md diff --git a/AGENTS.md b/AGENTS.md index dd12bf2..3ca3907 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -71,6 +71,10 @@ If a required command fails or emits a warning from project code, fix it in the ## Lessons +- A pinned fallback does not pin an installer that tries `releases/latest` + first. Hiddify's automatic installer and manual fallback guide must use the + same tested release on Linux and Windows (ADR 0138). + - A fixed sleep does not prove a child has installed its signal handler on a busy native runner. The graceful-stop fixture must read an explicit flushed readiness message after handler installation, keep the child alive through diff --git a/Cargo.lock b/Cargo.lock index c332b48..0664d02 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2046,7 +2046,7 @@ dependencies = [ [[package]] name = "iran-split-cli" -version = "6.2.91" +version = "6.2.92" dependencies = [ "async-trait", "chrono", @@ -2064,7 +2064,7 @@ dependencies = [ [[package]] name = "iran-split-clients" -version = "6.2.91" +version = "6.2.92" dependencies = [ "async-trait", "ipnet", @@ -2080,7 +2080,7 @@ dependencies = [ [[package]] name = "iran-split-config" -version = "6.2.91" +version = "6.2.92" dependencies = [ "hex", "rand 0.9.5", @@ -2093,7 +2093,7 @@ dependencies = [ [[package]] name = "iran-split-core" -version = "6.2.91" +version = "6.2.92" dependencies = [ "async-trait", "chrono", @@ -2110,7 +2110,7 @@ dependencies = [ [[package]] name = "iran-split-desktop" -version = "6.2.91" +version = "6.2.92" dependencies = [ "chrono", "dirs 6.0.0", @@ -2152,7 +2152,7 @@ dependencies = [ [[package]] name = "iran-split-helper" -version = "6.2.91" +version = "6.2.92" dependencies = [ "clap", "hex", @@ -2177,7 +2177,7 @@ dependencies = [ [[package]] name = "iran-split-helper-winacl" -version = "6.2.91" +version = "6.2.92" dependencies = [ "tokio", "windows", @@ -2185,7 +2185,7 @@ dependencies = [ [[package]] name = "iran-split-ipc" -version = "6.2.91" +version = "6.2.92" dependencies = [ "bytes", "chrono", @@ -2198,7 +2198,7 @@ dependencies = [ [[package]] name = "iran-split-mihomo" -version = "6.2.91" +version = "6.2.92" dependencies = [ "chrono", "futures-util", @@ -2221,7 +2221,7 @@ dependencies = [ [[package]] name = "iran-split-netstats" -version = "6.2.91" +version = "6.2.92" dependencies = [ "libc", "tempfile", @@ -2230,7 +2230,7 @@ dependencies = [ [[package]] name = "iran-split-platform-linux" -version = "6.2.91" +version = "6.2.92" dependencies = [ "async-trait", "chrono", @@ -2254,7 +2254,7 @@ dependencies = [ [[package]] name = "iran-split-platform-macos" -version = "6.2.91" +version = "6.2.92" dependencies = [ "async-trait", "chrono", @@ -2278,7 +2278,7 @@ dependencies = [ [[package]] name = "iran-split-platform-win" -version = "6.2.91" +version = "6.2.92" dependencies = [ "async-trait", "chrono", @@ -2301,7 +2301,7 @@ dependencies = [ [[package]] name = "iran-split-rules" -version = "6.2.91" +version = "6.2.92" dependencies = [ "async-trait", "chrono", @@ -2323,7 +2323,7 @@ dependencies = [ [[package]] name = "iran-split-taskbar" -version = "6.2.91" +version = "6.2.92" dependencies = [ "iran-split-config", "objc2", diff --git a/Cargo.toml b/Cargo.toml index d019f7e..f31df7b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,7 +19,7 @@ members = [ ] [workspace.package] -version = "6.2.91" +version = "6.2.92" edition = "2021" license = "MIT OR Apache-2.0" rust-version = "1.88" diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 409c4f3..936a1a5 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,6 +1,6 @@ { "name": "@iran-split/desktop", - "version": "6.2.91", + "version": "6.2.92", "private": true, "type": "module", "scripts": { diff --git a/docs/adr/0138-hiddify-5-5-5.md b/docs/adr/0138-hiddify-5-5-5.md new file mode 100644 index 0000000..6681375 --- /dev/null +++ b/docs/adr/0138-hiddify-5-5-5.md @@ -0,0 +1,26 @@ +# ADR 0138: Use Hiddify 5.5.5 for managed installation + +## Status + +Accepted + +## Context + +The Windows installer still downloaded Hiddify 4.1.1. Linux tried the mutable +`releases/latest` AppImage before falling back to 4.1.1, so the platforms could +install different versions. + +## Decision + +- Pin managed Hiddify downloads and manual installation guides to the official + [5.5.5 release](https://github.com/hiddify/hiddify-app/releases/tag/v5.5.5). +- Linux downloads its versioned x64 AppImage directly. Windows retains the + versioned x64 portable ZIP followed by the setup executable fallback. +- Preserve discovery of existing installations and their settings. This change + selects the version for new managed installations; it does not replace an + existing external client automatically. + +## Validation + +A cross-platform unit test checks the exact Linux and Windows asset URLs and +that the manual guide uses the same download as automatic installation. diff --git a/docs/adr/README.md b/docs/adr/README.md index 64bdf2c..847ddde 100644 --- a/docs/adr/README.md +++ b/docs/adr/README.md @@ -141,3 +141,4 @@ Keep this index current. Add a new ADR for each non-obvious change, or update th | [0135](./0135-serialized-native-lifecycle.md) | Serialize native release and budget lifecycle replies | Accepted | | [0136](./0136-preserve-completed-proxy-handoff.md) | Preserve a completed proxy handoff on repeated Stop and Quit | Accepted | | [0137](./0137-inactive-host-dns-evidence.md) | Record classified host DNS answers while disconnected | Accepted | +| [0138](./0138-hiddify-5-5-5.md) | Use Hiddify 5.5.5 for managed installation | Accepted | diff --git a/package.json b/package.json index ecf9153..c6aae3d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iran-split-desktop-workspace", - "version": "6.2.91", + "version": "6.2.92", "private": true, "packageManager": "pnpm@9.0.1", "engines": { diff --git a/src-tauri/src/deps.rs b/src-tauri/src/deps.rs index 7a5d561..da3ec5e 100644 --- a/src-tauri/src/deps.rs +++ b/src-tauri/src/deps.rs @@ -15,7 +15,7 @@ use tracing::{info, warn}; const USER_AGENT: &str = concat!("BiFlow/", env!("CARGO_PKG_VERSION")); const MAX_DOWNLOAD_BYTES: usize = 180 * 1024 * 1024; -const HIDDIFY_VERSION: &str = "v4.1.1"; +const HIDDIFY_VERSION: &str = "v5.5.5"; const MIHOMO_VERSION: &str = "v1.19.29"; const MIHOMO_LINUX_SHA256: &str = "9c397be7489538628fae781bc005e4c5b8cd7b0961b8bb2ca815c8150f193577"; @@ -372,11 +372,7 @@ async fn install_hiddify(data: &Path) -> Result { } async fn install_hiddify_linux(data: &Path) -> Result { - let bytes = download_first(&[ - hiddify_linux_appimage_url(), - hiddify_linux_appimage_pinned_url(), - ]) - .await?; + let bytes = download(&hiddify_linux_appimage_url()).await?; if !is_elf(&bytes) { return Err(DepsError::Integrity( "Hiddify AppImage is not an ELF binary".into(), @@ -575,11 +571,6 @@ fn mihomo_file_name() -> &'static str { } fn hiddify_linux_appimage_url() -> String { - "https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Linux-x64-AppImage.AppImage" - .into() -} - -fn hiddify_linux_appimage_pinned_url() -> String { format!( "https://github.com/hiddify/hiddify-app/releases/download/{HIDDIFY_VERSION}/Hiddify-Linux-x64-AppImage.AppImage" ) @@ -867,6 +858,32 @@ mod tests { assert!(!url_allowed("https://example.com/hiddify")); } + #[test] + fn hiddify_downloads_and_manual_guide_use_5_5_5() { + let release = "https://github.com/hiddify/hiddify-app/releases/download/v5.5.5"; + assert_eq!( + hiddify_linux_appimage_url(), + format!("{release}/Hiddify-Linux-x64-AppImage.AppImage") + ); + assert_eq!( + hiddify_windows_portable_url(), + format!("{release}/Hiddify-Windows-Portable-x64.zip") + ); + assert_eq!( + hiddify_windows_setup_url(), + format!("{release}/Hiddify-Windows-Setup-x64.exe") + ); + let guide = install_guide(DependencyId::Hiddify); + assert_eq!( + guide.download_url, + if cfg!(target_os = "windows") { + hiddify_windows_setup_url() + } else { + hiddify_linux_appimage_url() + } + ); + } + #[test] fn opens_biflow_repository_links() { assert!(open_url_allowed("https://github.com/devlifeX/BiFlow")); diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index afe9c0f..e5db834 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "BiFlow", - "version": "6.2.91", + "version": "6.2.92", "identifier": "app.biflow.desktop", "build": { "beforeDevCommand": "pnpm bundle:check && pnpm --dir apps/desktop dev", diff --git a/version b/version index 61d04b7..030e1ce 100644 --- a/version +++ b/version @@ -1 +1 @@ -6.2.91 +6.2.92