feat: v1.7.6 - Split Tunneling (Per-App Proxy) for Desktop
Some checks failed
CI / run (push) Has been cancelled

Flutter integration:
- Update SingboxConfigOption with per-app proxy fields
- Add perAppProxyMode, includedApplications, excludedApplications
- Read per-app settings from SharedPreferences
- Pass settings to libcore via HiddifyOptions

libcore backend:
- Implement ProcessName routing rules for desktop platforms
- Support include mode (whitelist) and exclude mode (blacklist)
- Only Chrome/Firefox/etc. specified by name use VPN

Version bump: 1.7.5 → 1.7.6
Update libcore submodule to include per-app proxy support
This commit is contained in:
Umbrix Developer
2026-01-20 17:38:49 +03:00
parent dec7ed2509
commit fec6fa166c
4 changed files with 35 additions and 2 deletions

View File

@@ -334,6 +334,32 @@ abstract class ConfigOptions {
"",
);
// Per-App Proxy Settings (Desktop platforms)
static final perAppProxyMode = PreferencesNotifier.create<String, String>(
"per-app-proxy-mode",
"off",
);
static final perAppProxyIncludeList = PreferencesNotifier.create<List<String>, String>(
"per-app-proxy-include-list",
[],
mapFrom: (value) {
if (value.isEmpty) return [];
return value.split(',').map((e) => e.trim()).where((e) => e.isNotEmpty).toList();
},
mapTo: (value) => value.join(','),
);
static final perAppProxyExcludeList = PreferencesNotifier.create<List<String>, String>(
"per-app-proxy-exclude-list",
[],
mapFrom: (value) {
if (value.isEmpty) return [];
return value.split(',').map((e) => e.trim()).where((e) => e.isNotEmpty).toList();
},
mapTo: (value) => value.join(','),
);
static final hasExperimentalFeatures = Provider.autoDispose<bool>(
(ref) {
final mode = ref.watch(serviceMode);
@@ -557,6 +583,10 @@ abstract class ConfigOptions {
noiseSize: ref.watch(warpNoiseSize),
noiseDelay: ref.watch(warpNoiseDelay),
),
// Per-App Proxy
perAppProxyMode: ref.watch(perAppProxyMode),
includedApplications: ref.watch(perAppProxyMode) == 'include' ? ref.watch(perAppProxyIncludeList) : [],
excludedApplications: ref.watch(perAppProxyMode) == 'exclude' ? ref.watch(perAppProxyExcludeList) : [],
// geoipPath: ref.watch(geoAssetPathResolverProvider).relativePath(
// geoAssets.geoip.providerName,
// geoAssets.geoip.fileName,

View File

@@ -52,6 +52,9 @@ class SingboxConfigOption with _$SingboxConfigOption {
required SingboxTlsTricks tlsTricks,
required SingboxWarpOption warp,
required SingboxWarpOption warp2,
@JsonKey(name: 'per-app-proxy-mode') @Default('off') String perAppProxyMode,
@JsonKey(name: 'included-applications') @Default([]) List<String> includedApplications,
@JsonKey(name: 'excluded-applications') @Default([]) List<String> excludedApplications,
}) = _SingboxConfigOption;
String format() {