Skip to content

Commit 7596b66

Browse files
authored
Merge branch 'dev' into patreon-migration-and-accounts
2 parents b3809df + ce8c057 commit 7596b66

18 files changed

Lines changed: 719 additions & 40 deletions

CHANGELOG.md

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,30 +10,39 @@ and this project adheres to [Semantic Versioning 2.0](https://semver.org/spec/v2
1010
- Added enable/disable toggle for environment variables in Settings, allowing variables to be temporarily disabled without deleting them
1111
- Added single-instance window activation signaling so reopening the app restores and focuses the existing desktop window instead of launching a duplicate instance
1212
- Added notification system with localizable banner and markdown detail dialog UI
13-
- Added warning in data directory selector when an OneDrive folder is selected
13+
- Added warning in data directory selector when a OneDrive folder is selected
1414
- Added support in the Checkpoints page to distinguish standard updates from Early Access-only updates - thanks to @x0x0b!
1515
- Added torch index for Strix/Gorgon Point Ryzen AI APUs on Windows - thanks to @NeuralFault!
16+
- Added retry button to failed downloads - thanks to @NeuralFault!
1617
### Changed
1718
- Improved safetensor checkpoint classification to correctly detect UNet-only models for Wan Video, HiDream, Z-Image, Hunyuan3D, and diffusers-format Flux architectures, ensuring they are routed to the DiffusionModels folder
1819
- GGUF checkpoint downloads now go directly to the DiffusionModels folder instead of StableDiffusion
1920
- Configured portable Git to suppress detached HEAD advice messages
2021
- Settings file saves are now atomic to prevent corruption from interrupted writes
22+
- Updated torch indexes for A1111, ComfyUI, InvokeAI, and Forge-based UIs to rocm7.2 / cu128 depending on GPU - thanks to @NeuralFault!
2123
### Fixed
24+
- Fixed the Package Manager "Add Package" teaching tip opening inopportunely while packages were still loading or after opening the add-package dialog
2225
- Fixed downloaded checkpoint going to StableDiffusion folder when a saved download preference existed, even for GGUF files that should always go to DiffusionModels
2326
- Fixed potential crash when adding metadata to malformed or non-PNG image data in Inference
2427
- Fixed non-Latin-1 characters (e.g. Japanese, Chinese, Korean, emoji) in image generation parameters being stored in PNG tEXt chunks, violating the PNG specification and causing character corruption (mojibake) in standard-compliant parsers. Non-Latin-1 content now uses spec-compliant iTXt chunks with proper UTF-8 encoding ([#1535](https://github.com/LykosAI/StabilityMatrix/issues/1535))
2528
- Fixed an issue where `Align Your Steps` scheduler and Unet Loader workflows ignored Regional Prompting (and other addon) conditioning modifiers.
26-
- Potentially fixed [#1578](https://github.com/LykosAI/StabilityMatrix/issues/1578) - `SocketException: Address already in use` on Linux startup by cleaning stale interprocess socket files and reactivating the existing window
2729
- Fixed bold text not rendering in markdown dialogs on Windows 11 due to Avalonia 11.3.x variable font regression with Segoe UI Variable Text
2830
- Fixed Japanese text appearing compressed/squished in markdown dialogs by ensuring the bundled NotoSansJP font is used for CTextBlock rendering
2931
- Fixed ContentDialog title and buttons not using the correct font for Japanese locale (NotoSansJP) when shown as overlay
3032
- Added missing `CBold` and `CItalic` inline styles to the markdown style sheet
31-
- Fixed download progress bar showing 100% immediately for fresh downloads due to missing Content-Length fallback when Content-Range header is absent
3233
- Fixed downloads failing with "The request message was already sent" when the server doesn't return Content-Length on the first attempt, caused by reusing a consumed HttpRequestMessage in the retry loop
3334
- Fixed downloads from sources that redirect to CivitAI/HuggingFace (e.g. CivArchive) failing with Unauthorized by resolving the redirect target URL and applying auth headers for the correct domain
3435
- Fixed dropdown menu overlayed in Inference UI Model Cards not being scrollable on Linux - thanks to @NeuralFault!
36+
- Fixed model downloads failing on VPN connections - thanks to @NeuralFault!
37+
- Fixed [#1598](https://github.com/LykosAI/StabilityMatrix/issues/1598) - download progress bar showing 100% immediately for fresh downloads due to missing Content-Length fallback when Content-Range header is absent
38+
- Fixed [#1597](https://github.com/LykosAI/StabilityMatrix/issues/1597) - reForge launch failing due to setuptools version
39+
- Fixed [#1596](https://github.com/LykosAI/StabilityMatrix/issues/1596) - package installs and managed embedded Python startup being poisoned by inherited shell Python activation variables such as `PYTHONHOME`, `PYTHONPATH`, `VIRTUAL_ENV`, and Conda environment variables
3540
- Fixed [#1590](https://github.com/LykosAI/StabilityMatrix/issues/1590) - Startup crash when settings file is corrupted. Settings files are now self-healing with automatic recovery from null bytes, truncated JSON, and missing brackets
41+
- Potentially fixed [#1578](https://github.com/LykosAI/StabilityMatrix/issues/1578) - `SocketException: Address already in use` on Linux startup by cleaning stale interprocess socket files and reactivating the existing window
3642
- Fixed [#1397](https://github.com/LykosAI/StabilityMatrix/issues/1397), [#610](https://github.com/LykosAI/StabilityMatrix/issues/610) - duplicate pip package entries in results - thanks to @e-nord!
43+
### Supporters
44+
#### 🌟 Visionaries
45+
A heartfelt thank you to our incredible Visionaries: **Waterclouds**, **JungleDragon**, **bluepopsicle**, **Bob S**, and **whudunit** - every feature, fix, and late-night breakthrough in this release carries your fingerprints. A huge welcome to our newest Visionaries **Droolguy** and **snotty** (leveling up from the Pioneer ranks!), a warm welcome back to longtime Visionary **Ibixat**, and an equally huge welcome to **LG**, making their Stability Matrix debut straight at the Visionary tier! You're the reason we can keep building bold things - and an extra-special thank you to everyone now supporting us directly through our new platform. Your trust in this next chapter means the world!
3746

3847
## v2.16.0-dev.2
3948
### Added
@@ -112,21 +121,34 @@ A massive thank you to our esteemed Visionaries: **Waterclouds**, **JungleDragon
112121
- Added warning in data directory selector when an OneDrive folder is selected
113122
- Added support in the Checkpoints page to distinguish standard updates from Early Access-only updates - thanks to @x0x0b!
114123
- Added torch index for Strix/Gorgon Point Ryzen AI APUs on Windows - thanks to @NeuralFault!
124+
- Added retry button to failed downloads - thanks to @NeuralFault!
115125
### Changed
116126
- Settings file saves are now atomic to prevent corruption from interrupted writes
127+
- Updated torch indexes for A1111, ComfyUI, InvokeAI, and Forge-based UIs to rocm7.2 / cu128 depending on GPU - thanks to @NeuralFault!
117128
### Fixed
118129
- Fixed an issue where `Align Your Steps` scheduler and Unet Loader workflows ignored Regional Prompting (and other addon) conditioning modifiers.
119-
- Potentially fixed [#1578](https://github.com/LykosAI/StabilityMatrix/issues/1578) - `SocketException: Address already in use` on Linux startup by cleaning stale interprocess socket files and reactivating the existing window
130+
- Fixed the Package Manager "Add Package" teaching tip opening inopportunely while packages were still loading or after opening the add-package dialog
120131
- Fixed bold text not rendering in markdown dialogs on Windows 11 due to Avalonia 11.3.x variable font regression with Segoe UI Variable Text
121132
- Fixed Japanese text appearing compressed/squished in markdown dialogs by ensuring the bundled NotoSansJP font is used for CTextBlock rendering
122133
- Fixed ContentDialog title and buttons not using the correct font for Japanese locale (NotoSansJP) when shown as overlay
123134
- Added missing `CBold` and `CItalic` inline styles to the markdown style sheet
124-
- Fixed download progress bar showing 100% immediately for fresh downloads due to missing Content-Length fallback when Content-Range header is absent
125135
- Fixed downloads failing with "The request message was already sent" when the server doesn't return Content-Length on the first attempt, caused by reusing a consumed HttpRequestMessage in the retry loop
126136
- Fixed downloads from sources that redirect to CivitAI/HuggingFace (e.g. CivArchive) failing with Unauthorized by resolving the redirect target URL and applying auth headers for the correct domain
127137
- Fixed dropdown menu overlayed in Inference UI Model Cards not being scrollable on Linux - thanks to @NeuralFault!
138+
- Fixed model downloads failing on VPN connections - thanks to @NeuralFault!
139+
- Fixed [#1598](https://github.com/LykosAI/StabilityMatrix/issues/1598) - download progress bar showing 100% immediately for fresh downloads due to missing Content-Length fallback when Content-Range header is absent
140+
- Fixed [#1597](https://github.com/LykosAI/StabilityMatrix/issues/1597) - reForge launch failing due to setuptools version
141+
- Fixed [#1596](https://github.com/LykosAI/StabilityMatrix/issues/1596) - package installs and managed embedded Python startup being poisoned by inherited shell Python activation variables such as `PYTHONHOME`, `PYTHONPATH`, `VIRTUAL_ENV`, and Conda environment variables
128142
- Fixed [#1590](https://github.com/LykosAI/StabilityMatrix/issues/1590) - Startup crash when settings file is corrupted. Settings files are now self-healing with automatic recovery from null bytes, truncated JSON, and missing brackets
143+
- Potentially fixed [#1578](https://github.com/LykosAI/StabilityMatrix/issues/1578) - `SocketException: Address already in use` on Linux startup by cleaning stale interprocess socket files and reactivating the existing window
129144
- Fixed [#1397](https://github.com/LykosAI/StabilityMatrix/issues/1397), [#610](https://github.com/LykosAI/StabilityMatrix/issues/610) - duplicate pip package entries in results - thanks to @e-nord!
145+
### Supporters
146+
#### 🌟 Visionaries
147+
Lifting up our legendary Visionaries: **Waterclouds**, **JungleDragon**, **bluepopsicle**, **Bob S**, and **whudunit**. Through every release, every milestone, and every twist of this wild journey, your support has been our north star. A huge welcome to our newest Visionaries **Droolguy** and **snotty** (leveling up from the Pioneer crew!), a warm welcome back to longtime Visionary **Ibixat**, and an equally huge welcome to **LG**, making their Stability Matrix debut straight at the Visionary tier - so glad to have you all on board! We cannot thank you enough for standing behind Stability Matrix!
148+
#### 🚀 Pioneers
149+
And to our mighty Pioneer crew - the folks who keep the engine humming - thank you for everything! Massive shoutout to: **Szir777**, **Noah M**, **[USA]TechDude**, **Thom**, **SeraphOfSalem**, **Desert Viber**, **Adam**, **ACTUALLY_the_Real_Willem_Dafoe**, **takyamtom**, **robek**, **Ghislain G**, **Phil R**, **Tundra Everquill**, **Andrew B**, **SinthCore**, and **Ahmed S**. And a very warm welcome to our newest Pioneer **Commissar Lord Death**, plus a heartfelt shoutout to one more new Pioneer who joined us quietly through the Stripe migration - you know who you are, and we're so glad to have you!
150+
151+
And one more heartfelt thank you to everyone now supporting us directly through our new platform - this next chapter wouldn't be possible without your trust, and we're so grateful you've come along for the ride!
130152

131153
## v2.15.6
132154
### Added
@@ -2466,4 +2488,4 @@ We also want to give a huge thank you to our dedicated Pioneer-tier Patrons: **t
24662488
- Fixed crash on exit
24672489
- Fixed updating from versions prior to 2.x.x
24682490
- Fixed page duplication memory leak that caused increased memory usage when switching between pages
2469-
- Package page launch button will now navigate and launch the package, instead of just navigating to launch page
2491+
- Package page launch button will now navigate and launch the package, instead of just navigating to launch page

StabilityMatrix.Avalonia/Program.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public static class Program
6161
public static void Main(string[] args)
6262
{
6363
StartupTimer.Start();
64+
ProcessRunner.SanitizeCurrentProcessPythonEnvironment();
6465

6566
SetDebugBuild();
6667

StabilityMatrix.Avalonia/ViewModels/Base/PausableProgressItemViewModelBase.cs

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ public abstract partial class PausableProgressItemViewModelBase : ProgressItemVi
1414
nameof(IsPaused),
1515
nameof(IsCompleted),
1616
nameof(CanPauseResume),
17-
nameof(CanCancel)
17+
nameof(CanCancel),
18+
nameof(CanRetry),
19+
nameof(CanDismiss)
1820
)]
1921
private ProgressState state = ProgressState.Inactive;
2022

@@ -33,9 +35,31 @@ public abstract partial class PausableProgressItemViewModelBase : ProgressItemVi
3335
public virtual bool SupportsPauseResume => true;
3436
public virtual bool SupportsCancel => true;
3537

38+
/// <summary>
39+
/// Override to true in subclasses that support manual retry after failure.
40+
/// Defaults to false so unrelated progress item types are never affected.
41+
/// </summary>
42+
public virtual bool SupportsRetry => false;
43+
44+
/// <summary>
45+
/// Override to true in subclasses that support dismissing a failed item,
46+
/// which runs full sidecar cleanup before removing the entry.
47+
/// </summary>
48+
public virtual bool SupportsDismiss => false;
49+
3650
public bool CanPauseResume => SupportsPauseResume && !IsCompleted && !IsPending;
3751
public bool CanCancel => SupportsCancel && !IsCompleted;
3852

53+
/// <summary>
54+
/// True only when this item supports retry AND is in the Failed state.
55+
/// </summary>
56+
public bool CanRetry => SupportsRetry && State == ProgressState.Failed;
57+
58+
/// <summary>
59+
/// True only when this item supports dismiss AND is in the Failed state.
60+
/// </summary>
61+
public bool CanDismiss => SupportsDismiss && State == ProgressState.Failed;
62+
3963
private AsyncRelayCommand? pauseCommand;
4064
public IAsyncRelayCommand PauseCommand => pauseCommand ??= new AsyncRelayCommand(Pause);
4165

@@ -51,6 +75,16 @@ public abstract partial class PausableProgressItemViewModelBase : ProgressItemVi
5175

5276
public virtual Task Cancel() => Task.CompletedTask;
5377

78+
private AsyncRelayCommand? retryCommand;
79+
public IAsyncRelayCommand RetryCommand => retryCommand ??= new AsyncRelayCommand(Retry);
80+
81+
public virtual Task Retry() => Task.CompletedTask;
82+
83+
private AsyncRelayCommand? dismissCommand;
84+
public IAsyncRelayCommand DismissCommand => dismissCommand ??= new AsyncRelayCommand(Dismiss);
85+
86+
public virtual Task Dismiss() => Task.CompletedTask;
87+
5488
[RelayCommand]
5589
private Task TogglePauseResume()
5690
{

StabilityMatrix.Avalonia/ViewModels/PackageManager/MainPackageManagerViewModel.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using AsyncAwaitBestPractices;
44
using Avalonia.Controls;
55
using Avalonia.Threading;
6+
using CommunityToolkit.Mvvm.ComponentModel;
67
using CommunityToolkit.Mvvm.Input;
78
using DynamicData;
89
using DynamicData.Binding;
@@ -61,6 +62,9 @@ public partial class MainPackageManagerViewModel : PageViewModelBase
6162
public IObservableCollection<PackageCardViewModel> PackageCards { get; } =
6263
new ObservableCollectionExtended<PackageCardViewModel>();
6364

65+
[ObservableProperty]
66+
private bool isAddPackageTeachingTipOpen;
67+
6468
private DispatcherTimer timer;
6569

6670
public MainPackageManagerViewModel(
@@ -112,11 +116,13 @@ private void OnOneClickInstallFinished(object? sender, bool e)
112116
public void SetPackages(IEnumerable<InstalledPackage> packages)
113117
{
114118
installedPackages.Edit(s => s.Load(packages));
119+
UpdateAddPackageTeachingTip();
115120
}
116121

117122
public void SetUnknownPackages(IEnumerable<InstalledPackage> packages)
118123
{
119124
unknownInstalledPackages.Edit(s => s.Load(packages));
125+
UpdateAddPackageTeachingTip();
120126
}
121127

122128
protected override async Task OnInitialLoadedAsync()
@@ -151,7 +157,9 @@ public override async Task OnLoadedAsync()
151157
if (Design.IsDesignMode || !settingsManager.IsLibraryDirSet)
152158
return;
153159

160+
IsAddPackageTeachingTipOpen = false;
154161
await LoadPackages();
162+
UpdateAddPackageTeachingTip();
155163

156164
timer.Start();
157165
}
@@ -164,6 +172,7 @@ public override void OnUnloaded()
164172

165173
public void ShowInstallDialog(BasePackage? selectedPackage = null)
166174
{
175+
IsAddPackageTeachingTipOpen = false;
167176
NavigateToSubPage(typeof(PackageInstallBrowserViewModel));
168177
}
169178

@@ -237,6 +246,11 @@ private void NavigateToSubPage(Type viewModelType)
237246
);
238247
}
239248

249+
private void UpdateAddPackageTeachingTip()
250+
{
251+
IsAddPackageTeachingTipOpen = Packages.Count == 0;
252+
}
253+
240254
private void OnInstalledPackagesChanged(object? sender, EventArgs e) =>
241-
OnLoadedAsync().SafeFireAndForget();
255+
Dispatcher.UIThread.InvokeAsync(OnLoadedAsync).SafeFireAndForget();
242256
}

StabilityMatrix.Avalonia/ViewModels/Progress/DownloadProgressItemViewModel.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,17 @@ private void OnProgressStateChanged(ProgressState state)
7171
}
7272
}
7373

74+
/// <summary>
75+
/// Downloads support manual retry when they reach the Failed state.
76+
/// </summary>
77+
public override bool SupportsRetry => true;
78+
79+
/// <summary>
80+
/// Downloads support dismiss, which cleans up all sidecar files when
81+
/// the user discards a failed download without retrying.
82+
/// </summary>
83+
public override bool SupportsDismiss => true;
84+
7485
/// <inheritdoc />
7586
public override Task Cancel()
7687
{
@@ -91,4 +102,23 @@ public override Task Resume()
91102
{
92103
return downloadService.TryResumeDownload(download);
93104
}
105+
106+
/// <inheritdoc />
107+
/// Resets the internal retry counter so the user gets a fresh 3-attempt budget,
108+
/// then re-registers the download in the service dictionary (it was removed on
109+
/// failure) and resumes it through the normal concurrency queue.
110+
public override Task Retry()
111+
{
112+
download.ResetAttempts();
113+
return downloadService.TryRestartDownload(download);
114+
}
115+
116+
/// <inheritdoc />
117+
/// Runs full cleanup (temp file + sidecar files) for a failed download the user
118+
/// chooses not to retry, then transitions to Cancelled so the service removes it.
119+
public override Task Dismiss()
120+
{
121+
download.Dismiss();
122+
return Task.CompletedTask;
123+
}
94124
}

StabilityMatrix.Avalonia/Views/PackageManager/MainPackageManagerView.axaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,7 @@
619619
Name="TeachingTip1"
620620
Title="{x:Static lang:Resources.TeachingTip_AddPackageToGetStarted}"
621621
Grid.Row="0"
622-
IsOpen="{Binding !Packages.Count}"
622+
IsOpen="{Binding IsAddPackageTeachingTipOpen}"
623623
PreferredPlacement="Top"
624624
Target="{Binding #AddPackagesButton}" />
625625

StabilityMatrix.Avalonia/Views/ProgressManagerPage.axaml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,24 @@
113113
IsVisible="{Binding CanCancel}">
114114
<ui:SymbolIcon Symbol="Cancel" />
115115
</Button>
116+
117+
<!-- Retry button: only visible when download is in Failed state -->
118+
<Button
119+
Classes="transparent-full"
120+
Command="{Binding RetryCommand}"
121+
IsVisible="{Binding CanRetry}"
122+
ToolTip.Tip="Retry download">
123+
<ui:SymbolIcon Symbol="Refresh" />
124+
</Button>
125+
126+
<!-- Dismiss button: cleans up sidecar files for failed downloads that won't be retried -->
127+
<Button
128+
Classes="transparent-full"
129+
Command="{Binding DismissCommand}"
130+
IsVisible="{Binding CanDismiss}"
131+
ToolTip.Tip="Dismiss and clean up">
132+
<ui:SymbolIcon Symbol="Delete" />
133+
</Button>
116134
</StackPanel>
117135

118136
<ProgressBar

0 commit comments

Comments
 (0)