Sync from development - prepare for v0.5.0.2

This commit is contained in:
Omni
2026-03-15 11:03:28 +00:00
parent c294431a35
commit e52e1427f6
48 changed files with 348 additions and 256 deletions

View File

@@ -1,5 +1,12 @@
# Jackify Changelog # Jackify Changelog
## v0.5.0.2 - Hotfix
**Release Date:** 15/03/26
- Disk space warning at install start is no longer a hard block. If the pre-flight check fires before any download or install progress has started, Jackify now shows a warning dialog with the required and available space, a note that modlist updates typically need far less space than a fresh install, and a "Continue Anyway" option. Cancelling still aborts normally.
- Engine: fixed a false-positive in the pre-flight filename length check that could incorrectly trigger on modlist paths using backslash separators.
- Engine: temp folder cleanup at the end of install no longer crashes an otherwise successful installation if a BSA or temp directory is still locked.
## v0.5.0.1 - Hotfix ## v0.5.0.1 - Hotfix
**Release Date:** 13/03/26 **Release Date:** 13/03/26

View File

@@ -5,4 +5,4 @@ This package provides both CLI and GUI interfaces for managing
Wabbajack modlists natively on Linux systems. Wabbajack modlists natively on Linux systems.
""" """
__version__ = "0.5.0.1" __version__ = "0.5.0.2"

View File

@@ -50,20 +50,10 @@ class ModlistConfigurationMixin:
return True return True
def _execute_configuration_steps(self, status_callback=None, manual_steps_completed=False, skip_manual_for_existing=False): def _execute_configuration_steps(self, status_callback=None, manual_steps_completed=False, skip_manual_for_existing=False):
""" """Run the configuration steps for the selected modlist."""
Runs the actual configuration steps for the selected modlist.
Args:
status_callback (callable, optional): A function to call with status updates during configuration.
manual_steps_completed (bool): If True, skip the manual steps prompt (used for new modlist flow).
skip_manual_for_existing (bool): If True, always skip manual steps (for existing modlists that are already configured).
"""
try: try:
# Store status_callback for Configuration Summary
self._current_status_callback = status_callback self._current_status_callback = status_callback
self.logger.info("Executing configuration steps...") self.logger.info("Executing configuration steps...")
# Ensure required context is set
if not all([self.modlist_dir, self.appid, self.game_var, self.steamdeck is not None]): if not all([self.modlist_dir, self.appid, self.game_var, self.steamdeck is not None]):
self.logger.error("Cannot execute configuration steps: Missing required context (modlist_dir, appid, game_var, steamdeck status).") self.logger.error("Cannot execute configuration steps: Missing required context (modlist_dir, appid, game_var, steamdeck status).")
self.logger.error("Missing required information to start configuration.") self.logger.error("Missing required information to start configuration.")
@@ -89,14 +79,10 @@ class ModlistConfigurationMixin:
return False # Abort on failure return False # Abort on failure
self.logger.info("Step 1: Setting Protontricks permissions... Done") self.logger.info("Step 1: Setting Protontricks permissions... Done")
# Step 2: Prompt user for manual steps and wait for compatdata
skip_manual_prompt = skip_manual_for_existing # Existing modlists skip manual steps skip_manual_prompt = skip_manual_for_existing # Existing modlists skip manual steps
if not manual_steps_completed and not skip_manual_for_existing: if not manual_steps_completed and not skip_manual_for_existing:
# Check if Proton Experimental is already set and compatdata exists
proton_ok = False proton_ok = False
compatdata_ok = False compatdata_ok = False
# Check Proton version
self.logger.debug(f"[MANUAL STEPS DEBUG] Checking Proton version for AppID {self.appid}") self.logger.debug(f"[MANUAL STEPS DEBUG] Checking Proton version for AppID {self.appid}")
if self._detect_proton_version(): if self._detect_proton_version():
self.logger.debug(f"[MANUAL STEPS DEBUG] Detected Proton version: {self.proton_ver}") self.logger.debug(f"[MANUAL STEPS DEBUG] Detected Proton version: {self.proton_ver}")
@@ -106,7 +92,6 @@ class ModlistConfigurationMixin:
else: else:
self.logger.debug("[MANUAL STEPS DEBUG] Could not detect Proton version") self.logger.debug("[MANUAL STEPS DEBUG] Could not detect Proton version")
# Check compatdata/prefix
prefix_path_str = self.path_handler.find_compat_data(str(self.appid)) prefix_path_str = self.path_handler.find_compat_data(str(self.appid))
self.logger.debug(f"[MANUAL STEPS DEBUG] Compatdata path search result: {prefix_path_str}") self.logger.debug(f"[MANUAL STEPS DEBUG] Compatdata path search result: {prefix_path_str}")
@@ -173,6 +158,24 @@ class ModlistConfigurationMixin:
self.logger.error(f"Failed to download or apply curated user.reg.modlist or system.reg.modlist: {e}") self.logger.error(f"Failed to download or apply curated user.reg.modlist or system.reg.modlist: {e}")
self.logger.error(f"Failed to download or apply curated user.reg.modlist or system.reg.modlist. {e}") self.logger.error(f"Failed to download or apply curated user.reg.modlist or system.reg.modlist. {e}")
return False return False
special_game_type = self.detect_special_game_type(self.modlist_dir)
if special_game_type in ["fnv", "fo3", "enderal"]:
self.logger.info(
"Re-injecting %s game registry entries after curated registry overwrite",
special_game_type.upper(),
)
try:
from jackify.backend.services.automated_prefix_service import AutomatedPrefixService
AutomatedPrefixService()._inject_game_registry_entries(prefix_path_str, special_game_type)
except Exception as e:
self.logger.error(
"Failed to restore %s registry entries after curated registry overwrite: %s",
special_game_type.upper(),
e,
)
self.logger.error("Could not restore required game registry entries after applying curated registry files.")
return False
self.logger.info("Step 3: Curated user.reg.modlist and system.reg.modlist applied successfully.") self.logger.info("Step 3: Curated user.reg.modlist and system.reg.modlist applied successfully.")
# Step 4: Install Wine Components # Step 4: Install Wine Components
@@ -543,9 +546,7 @@ class ModlistConfigurationMixin:
status_callback("") # Blank line after final Prefix Configuration step status_callback("") # Blank line after final Prefix Configuration step
self.logger.info("Step 12: Checking for modlist-specific steps...") self.logger.info("Step 12: Checking for modlist-specific steps...")
# Step 13: Launch options for special games are now set during automated prefix workflow (before Steam restart) # Step 13: Launch options for special games are now set during automated workflow
# Avoids a second Steam restart
special_game_type = self.detect_special_game_type(self.modlist_dir)
if special_game_type: if special_game_type:
self.logger.info(f"Step 13: Launch options for {special_game_type.upper()} were set during automated workflow") self.logger.info(f"Step 13: Launch options for {special_game_type.upper()} were set during automated workflow")
else: else:
@@ -568,18 +569,12 @@ class ModlistConfigurationMixin:
return True # Return True on success return True # Return True on success
def run_modlist_configuration_phase(self, context: dict = None) -> bool: def run_modlist_configuration_phase(self, context: dict = None) -> bool:
""" """Run the full modlist configuration sequence."""
Main entry point to run the full modlist configuration sequence.
This orchestrates all the individual steps.
"""
self.logger.info(f"Starting configuration phase for modlist: {self.game_name}") self.logger.info(f"Starting configuration phase for modlist: {self.game_name}")
# Call the private method that contains the actual steps
# Pass along the status_callback if it was provided in the context
status_callback = context.get('status_callback') if context else None status_callback = context.get('status_callback') if context else None
return self._execute_configuration_steps(status_callback=status_callback) return self._execute_configuration_steps(status_callback=status_callback)
def _prompt_or_set_resolution(self): def _prompt_or_set_resolution(self):
# If on Steam Deck, set 1280x800 automatically
if self._is_steam_deck(): if self._is_steam_deck():
self.selected_resolution = "1280x800" self.selected_resolution = "1280x800"
self.logger.info("Steam Deck detected: setting resolution to 1280x800.") self.logger.info("Steam Deck detected: setting resolution to 1280x800.")

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -7,7 +7,7 @@
"targets": { "targets": {
".NETCoreApp,Version=v8.0": {}, ".NETCoreApp,Version=v8.0": {},
".NETCoreApp,Version=v8.0/linux-x64": { ".NETCoreApp,Version=v8.0/linux-x64": {
"jackify-engine/0.5.0": { "jackify-engine/0.5.1": {
"dependencies": { "dependencies": {
"Markdig": "0.40.0", "Markdig": "0.40.0",
"Microsoft.Extensions.Configuration.Json": "9.0.1", "Microsoft.Extensions.Configuration.Json": "9.0.1",
@@ -22,16 +22,16 @@
"SixLabors.ImageSharp": "3.1.6", "SixLabors.ImageSharp": "3.1.6",
"System.CommandLine": "2.0.0-beta4.22272.1", "System.CommandLine": "2.0.0-beta4.22272.1",
"System.CommandLine.NamingConventionBinder": "2.0.0-beta4.22272.1", "System.CommandLine.NamingConventionBinder": "2.0.0-beta4.22272.1",
"Wabbajack.CLI.Builder": "0.5.0", "Wabbajack.CLI.Builder": "0.5.1",
"Wabbajack.Downloaders.Bethesda": "0.5.0", "Wabbajack.Downloaders.Bethesda": "0.5.1",
"Wabbajack.Downloaders.Dispatcher": "0.5.0", "Wabbajack.Downloaders.Dispatcher": "0.5.1",
"Wabbajack.Hashing.xxHash64": "0.5.0", "Wabbajack.Hashing.xxHash64": "0.5.1",
"Wabbajack.Networking.Discord": "0.5.0", "Wabbajack.Networking.Discord": "0.5.1",
"Wabbajack.Networking.GitHub": "0.5.0", "Wabbajack.Networking.GitHub": "0.5.1",
"Wabbajack.Paths.IO": "0.5.0", "Wabbajack.Paths.IO": "0.5.1",
"Wabbajack.Server.Lib": "0.5.0", "Wabbajack.Server.Lib": "0.5.1",
"Wabbajack.Services.OSIntegrated": "0.5.0", "Wabbajack.Services.OSIntegrated": "0.5.1",
"Wabbajack.VFS": "0.5.0", "Wabbajack.VFS": "0.5.1",
"MegaApiClient": "1.0.0.0", "MegaApiClient": "1.0.0.0",
"runtimepack.Microsoft.NETCore.App.Runtime.linux-x64": "8.0.23" "runtimepack.Microsoft.NETCore.App.Runtime.linux-x64": "8.0.23"
}, },
@@ -1781,7 +1781,7 @@
} }
} }
}, },
"Wabbajack.CLI.Builder/0.5.0": { "Wabbajack.CLI.Builder/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.Configuration.Json": "9.0.1", "Microsoft.Extensions.Configuration.Json": "9.0.1",
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
@@ -1791,109 +1791,109 @@
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"System.CommandLine": "2.0.0-beta4.22272.1", "System.CommandLine": "2.0.0-beta4.22272.1",
"System.CommandLine.NamingConventionBinder": "2.0.0-beta4.22272.1", "System.CommandLine.NamingConventionBinder": "2.0.0-beta4.22272.1",
"Wabbajack.Paths": "0.5.0" "Wabbajack.Paths": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.CLI.Builder.dll": {} "Wabbajack.CLI.Builder.dll": {}
} }
}, },
"Wabbajack.Common/0.5.0": { "Wabbajack.Common/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"System.Reactive": "6.0.1", "System.Reactive": "6.0.1",
"Wabbajack.DTOs": "0.5.0", "Wabbajack.DTOs": "0.5.1",
"Wabbajack.Networking.Http": "0.5.0", "Wabbajack.Networking.Http": "0.5.1",
"Wabbajack.Paths.IO": "0.5.0" "Wabbajack.Paths.IO": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Common.dll": {} "Wabbajack.Common.dll": {}
} }
}, },
"Wabbajack.Compiler/0.5.0": { "Wabbajack.Compiler/0.5.1": {
"dependencies": { "dependencies": {
"F23.StringSimilarity": "6.0.0", "F23.StringSimilarity": "6.0.0",
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Newtonsoft.Json": "13.0.3", "Newtonsoft.Json": "13.0.3",
"SixLabors.ImageSharp": "3.1.6", "SixLabors.ImageSharp": "3.1.6",
"Wabbajack.Downloaders.Dispatcher": "0.5.0", "Wabbajack.Downloaders.Dispatcher": "0.5.1",
"Wabbajack.Installer": "0.5.0", "Wabbajack.Installer": "0.5.1",
"Wabbajack.VFS": "0.5.0", "Wabbajack.VFS": "0.5.1",
"ini-parser-netstandard": "2.5.2" "ini-parser-netstandard": "2.5.2"
}, },
"runtime": { "runtime": {
"Wabbajack.Compiler.dll": {} "Wabbajack.Compiler.dll": {}
} }
}, },
"Wabbajack.Compression.BSA/0.5.0": { "Wabbajack.Compression.BSA/0.5.1": {
"dependencies": { "dependencies": {
"K4os.Compression.LZ4.Streams": "1.3.8", "K4os.Compression.LZ4.Streams": "1.3.8",
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"SharpZipLib": "1.4.2", "SharpZipLib": "1.4.2",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.DTOs": "0.5.0" "Wabbajack.DTOs": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Compression.BSA.dll": {} "Wabbajack.Compression.BSA.dll": {}
} }
}, },
"Wabbajack.Compression.Zip/0.5.0": { "Wabbajack.Compression.Zip/0.5.1": {
"dependencies": { "dependencies": {
"Wabbajack.IO.Async": "0.5.0" "Wabbajack.IO.Async": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Compression.Zip.dll": {} "Wabbajack.Compression.Zip.dll": {}
} }
}, },
"Wabbajack.Configuration/0.5.0": { "Wabbajack.Configuration/0.5.1": {
"runtime": { "runtime": {
"Wabbajack.Configuration.dll": {} "Wabbajack.Configuration.dll": {}
} }
}, },
"Wabbajack.Downloaders.Bethesda/0.5.0": { "Wabbajack.Downloaders.Bethesda/0.5.1": {
"dependencies": { "dependencies": {
"LibAES-CTR": "1.1.0", "LibAES-CTR": "1.1.0",
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"SharpZipLib": "1.4.2", "SharpZipLib": "1.4.2",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.Downloaders.Interfaces": "0.5.0", "Wabbajack.Downloaders.Interfaces": "0.5.1",
"Wabbajack.Networking.BethesdaNet": "0.5.0" "Wabbajack.Networking.BethesdaNet": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.Bethesda.dll": {} "Wabbajack.Downloaders.Bethesda.dll": {}
} }
}, },
"Wabbajack.Downloaders.Dispatcher/0.5.0": { "Wabbajack.Downloaders.Dispatcher/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Newtonsoft.Json": "13.0.3", "Newtonsoft.Json": "13.0.3",
"SixLabors.ImageSharp": "3.1.6", "SixLabors.ImageSharp": "3.1.6",
"Wabbajack.Downloaders.Bethesda": "0.5.0", "Wabbajack.Downloaders.Bethesda": "0.5.1",
"Wabbajack.Downloaders.GameFile": "0.5.0", "Wabbajack.Downloaders.GameFile": "0.5.1",
"Wabbajack.Downloaders.GoogleDrive": "0.5.0", "Wabbajack.Downloaders.GoogleDrive": "0.5.1",
"Wabbajack.Downloaders.Http": "0.5.0", "Wabbajack.Downloaders.Http": "0.5.1",
"Wabbajack.Downloaders.IPS4OAuth2Downloader": "0.5.0", "Wabbajack.Downloaders.IPS4OAuth2Downloader": "0.5.1",
"Wabbajack.Downloaders.Interfaces": "0.5.0", "Wabbajack.Downloaders.Interfaces": "0.5.1",
"Wabbajack.Downloaders.Manual": "0.5.0", "Wabbajack.Downloaders.Manual": "0.5.1",
"Wabbajack.Downloaders.MediaFire": "0.5.0", "Wabbajack.Downloaders.MediaFire": "0.5.1",
"Wabbajack.Downloaders.Mega": "0.5.0", "Wabbajack.Downloaders.Mega": "0.5.1",
"Wabbajack.Downloaders.ModDB": "0.5.0", "Wabbajack.Downloaders.ModDB": "0.5.1",
"Wabbajack.Downloaders.Nexus": "0.5.0", "Wabbajack.Downloaders.Nexus": "0.5.1",
"Wabbajack.Downloaders.VerificationCache": "0.5.0", "Wabbajack.Downloaders.VerificationCache": "0.5.1",
"Wabbajack.Downloaders.WabbajackCDN": "0.5.0", "Wabbajack.Downloaders.WabbajackCDN": "0.5.1",
"Wabbajack.Networking.WabbajackClientApi": "0.5.0" "Wabbajack.Networking.WabbajackClientApi": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.Dispatcher.dll": {} "Wabbajack.Downloaders.Dispatcher.dll": {}
} }
}, },
"Wabbajack.Downloaders.GameFile/0.5.0": { "Wabbajack.Downloaders.GameFile/0.5.1": {
"dependencies": { "dependencies": {
"GameFinder.StoreHandlers.EADesktop": "4.5.0", "GameFinder.StoreHandlers.EADesktop": "4.5.0",
"GameFinder.StoreHandlers.EGS": "4.5.0", "GameFinder.StoreHandlers.EGS": "4.5.0",
@@ -1903,361 +1903,361 @@
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"SixLabors.ImageSharp": "3.1.6", "SixLabors.ImageSharp": "3.1.6",
"Wabbajack.Downloaders.Interfaces": "0.5.0", "Wabbajack.Downloaders.Interfaces": "0.5.1",
"Wabbajack.VFS": "0.5.0" "Wabbajack.VFS": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.GameFile.dll": {} "Wabbajack.Downloaders.GameFile.dll": {}
} }
}, },
"Wabbajack.Downloaders.GoogleDrive/0.5.0": { "Wabbajack.Downloaders.GoogleDrive/0.5.1": {
"dependencies": { "dependencies": {
"HtmlAgilityPack": "1.11.72", "HtmlAgilityPack": "1.11.72",
"Microsoft.AspNetCore.Http.Extensions": "2.3.0", "Microsoft.AspNetCore.Http.Extensions": "2.3.0",
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.DTOs": "0.5.0", "Wabbajack.DTOs": "0.5.1",
"Wabbajack.Downloaders.Interfaces": "0.5.0", "Wabbajack.Downloaders.Interfaces": "0.5.1",
"Wabbajack.Networking.Http": "0.5.0", "Wabbajack.Networking.Http": "0.5.1",
"Wabbajack.Networking.Http.Interfaces": "0.5.0" "Wabbajack.Networking.Http.Interfaces": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.GoogleDrive.dll": {} "Wabbajack.Downloaders.GoogleDrive.dll": {}
} }
}, },
"Wabbajack.Downloaders.Http/0.5.0": { "Wabbajack.Downloaders.Http/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.DTOs": "0.5.0", "Wabbajack.DTOs": "0.5.1",
"Wabbajack.Downloaders.Interfaces": "0.5.0", "Wabbajack.Downloaders.Interfaces": "0.5.1",
"Wabbajack.Networking.BethesdaNet": "0.5.0", "Wabbajack.Networking.BethesdaNet": "0.5.1",
"Wabbajack.Networking.Http.Interfaces": "0.5.0", "Wabbajack.Networking.Http.Interfaces": "0.5.1",
"Wabbajack.Paths.IO": "0.5.0" "Wabbajack.Paths.IO": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.Http.dll": {} "Wabbajack.Downloaders.Http.dll": {}
} }
}, },
"Wabbajack.Downloaders.Interfaces/0.5.0": { "Wabbajack.Downloaders.Interfaces/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Wabbajack.Compression.Zip": "0.5.0", "Wabbajack.Compression.Zip": "0.5.1",
"Wabbajack.DTOs": "0.5.0", "Wabbajack.DTOs": "0.5.1",
"Wabbajack.Paths.IO": "0.5.0" "Wabbajack.Paths.IO": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.Interfaces.dll": {} "Wabbajack.Downloaders.Interfaces.dll": {}
} }
}, },
"Wabbajack.Downloaders.IPS4OAuth2Downloader/0.5.0": { "Wabbajack.Downloaders.IPS4OAuth2Downloader/0.5.1": {
"dependencies": { "dependencies": {
"F23.StringSimilarity": "6.0.0", "F23.StringSimilarity": "6.0.0",
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.Downloaders.Interfaces": "0.5.0", "Wabbajack.Downloaders.Interfaces": "0.5.1",
"Wabbajack.Networking.Http": "0.5.0", "Wabbajack.Networking.Http": "0.5.1",
"Wabbajack.Networking.Http.Interfaces": "0.5.0" "Wabbajack.Networking.Http.Interfaces": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.IPS4OAuth2Downloader.dll": {} "Wabbajack.Downloaders.IPS4OAuth2Downloader.dll": {}
} }
}, },
"Wabbajack.Downloaders.Manual/0.5.0": { "Wabbajack.Downloaders.Manual/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.Downloaders.Interfaces": "0.5.0" "Wabbajack.Downloaders.Interfaces": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.Manual.dll": {} "Wabbajack.Downloaders.Manual.dll": {}
} }
}, },
"Wabbajack.Downloaders.MediaFire/0.5.0": { "Wabbajack.Downloaders.MediaFire/0.5.1": {
"dependencies": { "dependencies": {
"HtmlAgilityPack": "1.11.72", "HtmlAgilityPack": "1.11.72",
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.Downloaders.Interfaces": "0.5.0", "Wabbajack.Downloaders.Interfaces": "0.5.1",
"Wabbajack.Networking.Http.Interfaces": "0.5.0" "Wabbajack.Networking.Http.Interfaces": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.MediaFire.dll": {} "Wabbajack.Downloaders.MediaFire.dll": {}
} }
}, },
"Wabbajack.Downloaders.Mega/0.5.0": { "Wabbajack.Downloaders.Mega/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Newtonsoft.Json": "13.0.3", "Newtonsoft.Json": "13.0.3",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.Downloaders.Interfaces": "0.5.0", "Wabbajack.Downloaders.Interfaces": "0.5.1",
"Wabbajack.Paths.IO": "0.5.0" "Wabbajack.Paths.IO": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.Mega.dll": {} "Wabbajack.Downloaders.Mega.dll": {}
} }
}, },
"Wabbajack.Downloaders.ModDB/0.5.0": { "Wabbajack.Downloaders.ModDB/0.5.1": {
"dependencies": { "dependencies": {
"HtmlAgilityPack": "1.11.72", "HtmlAgilityPack": "1.11.72",
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Newtonsoft.Json": "13.0.3", "Newtonsoft.Json": "13.0.3",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.Downloaders.Interfaces": "0.5.0", "Wabbajack.Downloaders.Interfaces": "0.5.1",
"Wabbajack.Networking.Http": "0.5.0", "Wabbajack.Networking.Http": "0.5.1",
"Wabbajack.Networking.Http.Interfaces": "0.5.0" "Wabbajack.Networking.Http.Interfaces": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.ModDB.dll": {} "Wabbajack.Downloaders.ModDB.dll": {}
} }
}, },
"Wabbajack.Downloaders.Nexus/0.5.0": { "Wabbajack.Downloaders.Nexus/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Wabbajack.DTOs": "0.5.0", "Wabbajack.DTOs": "0.5.1",
"Wabbajack.Downloaders.Interfaces": "0.5.0", "Wabbajack.Downloaders.Interfaces": "0.5.1",
"Wabbajack.Hashing.xxHash64": "0.5.0", "Wabbajack.Hashing.xxHash64": "0.5.1",
"Wabbajack.Networking.Http": "0.5.0", "Wabbajack.Networking.Http": "0.5.1",
"Wabbajack.Networking.Http.Interfaces": "0.5.0", "Wabbajack.Networking.Http.Interfaces": "0.5.1",
"Wabbajack.Networking.NexusApi": "0.5.0", "Wabbajack.Networking.NexusApi": "0.5.1",
"Wabbajack.Paths": "0.5.0" "Wabbajack.Paths": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.Nexus.dll": {} "Wabbajack.Downloaders.Nexus.dll": {}
} }
}, },
"Wabbajack.Downloaders.VerificationCache/0.5.0": { "Wabbajack.Downloaders.VerificationCache/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Stub.System.Data.SQLite.Core.NetStandard": "1.0.119", "Stub.System.Data.SQLite.Core.NetStandard": "1.0.119",
"Wabbajack.DTOs": "0.5.0", "Wabbajack.DTOs": "0.5.1",
"Wabbajack.Paths.IO": "0.5.0" "Wabbajack.Paths.IO": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.VerificationCache.dll": {} "Wabbajack.Downloaders.VerificationCache.dll": {}
} }
}, },
"Wabbajack.Downloaders.WabbajackCDN/0.5.0": { "Wabbajack.Downloaders.WabbajackCDN/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Microsoft.Toolkit.HighPerformance": "7.1.2", "Microsoft.Toolkit.HighPerformance": "7.1.2",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.Downloaders.Interfaces": "0.5.0", "Wabbajack.Downloaders.Interfaces": "0.5.1",
"Wabbajack.Networking.Http": "0.5.0", "Wabbajack.Networking.Http": "0.5.1",
"Wabbajack.RateLimiter": "0.5.0" "Wabbajack.RateLimiter": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.WabbajackCDN.dll": {} "Wabbajack.Downloaders.WabbajackCDN.dll": {}
} }
}, },
"Wabbajack.DTOs/0.5.0": { "Wabbajack.DTOs/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Wabbajack.Hashing.xxHash64": "0.5.0", "Wabbajack.Hashing.xxHash64": "0.5.1",
"Wabbajack.Paths": "0.5.0" "Wabbajack.Paths": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.DTOs.dll": {} "Wabbajack.DTOs.dll": {}
} }
}, },
"Wabbajack.FileExtractor/0.5.0": { "Wabbajack.FileExtractor/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"OMODFramework": "3.0.1", "OMODFramework": "3.0.1",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.Compression.BSA": "0.5.0", "Wabbajack.Compression.BSA": "0.5.1",
"Wabbajack.Hashing.PHash": "0.5.0", "Wabbajack.Hashing.PHash": "0.5.1",
"Wabbajack.Paths": "0.5.0" "Wabbajack.Paths": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.FileExtractor.dll": {} "Wabbajack.FileExtractor.dll": {}
} }
}, },
"Wabbajack.Hashing.PHash/0.5.0": { "Wabbajack.Hashing.PHash/0.5.1": {
"dependencies": { "dependencies": {
"BCnEncoder.Net.ImageSharp": "1.1.1", "BCnEncoder.Net.ImageSharp": "1.1.1",
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Shipwreck.Phash": "0.5.0", "Shipwreck.Phash": "0.5.0",
"SixLabors.ImageSharp": "3.1.6", "SixLabors.ImageSharp": "3.1.6",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.DTOs": "0.5.0", "Wabbajack.DTOs": "0.5.1",
"Wabbajack.Paths": "0.5.0", "Wabbajack.Paths": "0.5.1",
"Wabbajack.Paths.IO": "0.5.0" "Wabbajack.Paths.IO": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Hashing.PHash.dll": {} "Wabbajack.Hashing.PHash.dll": {}
} }
}, },
"Wabbajack.Hashing.xxHash64/0.5.0": { "Wabbajack.Hashing.xxHash64/0.5.1": {
"dependencies": { "dependencies": {
"Wabbajack.Paths": "0.5.0", "Wabbajack.Paths": "0.5.1",
"Wabbajack.RateLimiter": "0.5.0" "Wabbajack.RateLimiter": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Hashing.xxHash64.dll": {} "Wabbajack.Hashing.xxHash64.dll": {}
} }
}, },
"Wabbajack.Installer/0.5.0": { "Wabbajack.Installer/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Newtonsoft.Json": "13.0.3", "Newtonsoft.Json": "13.0.3",
"Octopus.Octodiff": "2.0.548", "Octopus.Octodiff": "2.0.548",
"SixLabors.ImageSharp": "3.1.6", "SixLabors.ImageSharp": "3.1.6",
"Wabbajack.DTOs": "0.5.0", "Wabbajack.DTOs": "0.5.1",
"Wabbajack.Downloaders.Dispatcher": "0.5.0", "Wabbajack.Downloaders.Dispatcher": "0.5.1",
"Wabbajack.Downloaders.GameFile": "0.5.0", "Wabbajack.Downloaders.GameFile": "0.5.1",
"Wabbajack.FileExtractor": "0.5.0", "Wabbajack.FileExtractor": "0.5.1",
"Wabbajack.Networking.NexusApi": "0.5.0", "Wabbajack.Networking.NexusApi": "0.5.1",
"Wabbajack.Networking.WabbajackClientApi": "0.5.0", "Wabbajack.Networking.WabbajackClientApi": "0.5.1",
"Wabbajack.Paths": "0.5.0", "Wabbajack.Paths": "0.5.1",
"Wabbajack.Paths.IO": "0.5.0", "Wabbajack.Paths.IO": "0.5.1",
"Wabbajack.VFS": "0.5.0", "Wabbajack.VFS": "0.5.1",
"ini-parser-netstandard": "2.5.2" "ini-parser-netstandard": "2.5.2"
}, },
"runtime": { "runtime": {
"Wabbajack.Installer.dll": {} "Wabbajack.Installer.dll": {}
} }
}, },
"Wabbajack.IO.Async/0.5.0": { "Wabbajack.IO.Async/0.5.1": {
"runtime": { "runtime": {
"Wabbajack.IO.Async.dll": {} "Wabbajack.IO.Async.dll": {}
} }
}, },
"Wabbajack.Networking.BethesdaNet/0.5.0": { "Wabbajack.Networking.BethesdaNet/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Wabbajack.DTOs": "0.5.0", "Wabbajack.DTOs": "0.5.1",
"Wabbajack.Networking.Http": "0.5.0", "Wabbajack.Networking.Http": "0.5.1",
"Wabbajack.Networking.Http.Interfaces": "0.5.0" "Wabbajack.Networking.Http.Interfaces": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Networking.BethesdaNet.dll": {} "Wabbajack.Networking.BethesdaNet.dll": {}
} }
}, },
"Wabbajack.Networking.Discord/0.5.0": { "Wabbajack.Networking.Discord/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Wabbajack.Networking.Http.Interfaces": "0.5.0" "Wabbajack.Networking.Http.Interfaces": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Networking.Discord.dll": {} "Wabbajack.Networking.Discord.dll": {}
} }
}, },
"Wabbajack.Networking.GitHub/0.5.0": { "Wabbajack.Networking.GitHub/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Octokit": "14.0.0", "Octokit": "14.0.0",
"Wabbajack.DTOs": "0.5.0", "Wabbajack.DTOs": "0.5.1",
"Wabbajack.Networking.Http.Interfaces": "0.5.0" "Wabbajack.Networking.Http.Interfaces": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Networking.GitHub.dll": {} "Wabbajack.Networking.GitHub.dll": {}
} }
}, },
"Wabbajack.Networking.Http/0.5.0": { "Wabbajack.Networking.Http/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Http": "9.0.1", "Microsoft.Extensions.Http": "9.0.1",
"Microsoft.Extensions.Logging": "9.0.1", "Microsoft.Extensions.Logging": "9.0.1",
"Wabbajack.Configuration": "0.5.0", "Wabbajack.Configuration": "0.5.1",
"Wabbajack.Downloaders.Interfaces": "0.5.0", "Wabbajack.Downloaders.Interfaces": "0.5.1",
"Wabbajack.Hashing.xxHash64": "0.5.0", "Wabbajack.Hashing.xxHash64": "0.5.1",
"Wabbajack.Networking.Http.Interfaces": "0.5.0", "Wabbajack.Networking.Http.Interfaces": "0.5.1",
"Wabbajack.Paths": "0.5.0", "Wabbajack.Paths": "0.5.1",
"Wabbajack.Paths.IO": "0.5.0" "Wabbajack.Paths.IO": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Networking.Http.dll": {} "Wabbajack.Networking.Http.dll": {}
} }
}, },
"Wabbajack.Networking.Http.Interfaces/0.5.0": { "Wabbajack.Networking.Http.Interfaces/0.5.1": {
"dependencies": { "dependencies": {
"Wabbajack.Hashing.xxHash64": "0.5.0" "Wabbajack.Hashing.xxHash64": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Networking.Http.Interfaces.dll": {} "Wabbajack.Networking.Http.Interfaces.dll": {}
} }
}, },
"Wabbajack.Networking.NexusApi/0.5.0": { "Wabbajack.Networking.NexusApi/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Wabbajack.DTOs": "0.5.0", "Wabbajack.DTOs": "0.5.1",
"Wabbajack.Networking.Http": "0.5.0", "Wabbajack.Networking.Http": "0.5.1",
"Wabbajack.Networking.Http.Interfaces": "0.5.0", "Wabbajack.Networking.Http.Interfaces": "0.5.1",
"Wabbajack.Networking.WabbajackClientApi": "0.5.0" "Wabbajack.Networking.WabbajackClientApi": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Networking.NexusApi.dll": {} "Wabbajack.Networking.NexusApi.dll": {}
} }
}, },
"Wabbajack.Networking.WabbajackClientApi/0.5.0": { "Wabbajack.Networking.WabbajackClientApi/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Octokit": "14.0.0", "Octokit": "14.0.0",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.DTOs": "0.5.0", "Wabbajack.DTOs": "0.5.1",
"Wabbajack.Paths.IO": "0.5.0", "Wabbajack.Paths.IO": "0.5.1",
"Wabbajack.VFS.Interfaces": "0.5.0", "Wabbajack.VFS.Interfaces": "0.5.1",
"YamlDotNet": "16.3.0" "YamlDotNet": "16.3.0"
}, },
"runtime": { "runtime": {
"Wabbajack.Networking.WabbajackClientApi.dll": {} "Wabbajack.Networking.WabbajackClientApi.dll": {}
} }
}, },
"Wabbajack.Paths/0.5.0": { "Wabbajack.Paths/0.5.1": {
"runtime": { "runtime": {
"Wabbajack.Paths.dll": {} "Wabbajack.Paths.dll": {}
} }
}, },
"Wabbajack.Paths.IO/0.5.0": { "Wabbajack.Paths.IO/0.5.1": {
"dependencies": { "dependencies": {
"Wabbajack.Paths": "0.5.0", "Wabbajack.Paths": "0.5.1",
"shortid": "4.0.0" "shortid": "4.0.0"
}, },
"runtime": { "runtime": {
"Wabbajack.Paths.IO.dll": {} "Wabbajack.Paths.IO.dll": {}
} }
}, },
"Wabbajack.RateLimiter/0.5.0": { "Wabbajack.RateLimiter/0.5.1": {
"runtime": { "runtime": {
"Wabbajack.RateLimiter.dll": {} "Wabbajack.RateLimiter.dll": {}
} }
}, },
"Wabbajack.Server.Lib/0.5.0": { "Wabbajack.Server.Lib/0.5.1": {
"dependencies": { "dependencies": {
"FluentFTP": "52.0.0", "FluentFTP": "52.0.0",
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
@@ -2265,58 +2265,58 @@
"Nettle": "3.0.0", "Nettle": "3.0.0",
"Newtonsoft.Json": "13.0.3", "Newtonsoft.Json": "13.0.3",
"SixLabors.ImageSharp": "3.1.6", "SixLabors.ImageSharp": "3.1.6",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.Networking.Http.Interfaces": "0.5.0", "Wabbajack.Networking.Http.Interfaces": "0.5.1",
"Wabbajack.Services.OSIntegrated": "0.5.0" "Wabbajack.Services.OSIntegrated": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Server.Lib.dll": {} "Wabbajack.Server.Lib.dll": {}
} }
}, },
"Wabbajack.Services.OSIntegrated/0.5.0": { "Wabbajack.Services.OSIntegrated/0.5.1": {
"dependencies": { "dependencies": {
"DeviceId": "6.8.0", "DeviceId": "6.8.0",
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Newtonsoft.Json": "13.0.3", "Newtonsoft.Json": "13.0.3",
"SixLabors.ImageSharp": "3.1.6", "SixLabors.ImageSharp": "3.1.6",
"Wabbajack.Compiler": "0.5.0", "Wabbajack.Compiler": "0.5.1",
"Wabbajack.Downloaders.Dispatcher": "0.5.0", "Wabbajack.Downloaders.Dispatcher": "0.5.1",
"Wabbajack.Installer": "0.5.0", "Wabbajack.Installer": "0.5.1",
"Wabbajack.Networking.BethesdaNet": "0.5.0", "Wabbajack.Networking.BethesdaNet": "0.5.1",
"Wabbajack.Networking.Discord": "0.5.0", "Wabbajack.Networking.Discord": "0.5.1",
"Wabbajack.VFS": "0.5.0" "Wabbajack.VFS": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Services.OSIntegrated.dll": {} "Wabbajack.Services.OSIntegrated.dll": {}
} }
}, },
"Wabbajack.VFS/0.5.0": { "Wabbajack.VFS/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"SixLabors.ImageSharp": "3.1.6", "SixLabors.ImageSharp": "3.1.6",
"System.Data.SQLite.Core": "1.0.119", "System.Data.SQLite.Core": "1.0.119",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.FileExtractor": "0.5.0", "Wabbajack.FileExtractor": "0.5.1",
"Wabbajack.Hashing.PHash": "0.5.0", "Wabbajack.Hashing.PHash": "0.5.1",
"Wabbajack.Hashing.xxHash64": "0.5.0", "Wabbajack.Hashing.xxHash64": "0.5.1",
"Wabbajack.Paths": "0.5.0", "Wabbajack.Paths": "0.5.1",
"Wabbajack.Paths.IO": "0.5.0", "Wabbajack.Paths.IO": "0.5.1",
"Wabbajack.VFS.Interfaces": "0.5.0" "Wabbajack.VFS.Interfaces": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.VFS.dll": {} "Wabbajack.VFS.dll": {}
} }
}, },
"Wabbajack.VFS.Interfaces/0.5.0": { "Wabbajack.VFS.Interfaces/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Wabbajack.DTOs": "0.5.0", "Wabbajack.DTOs": "0.5.1",
"Wabbajack.Hashing.xxHash64": "0.5.0", "Wabbajack.Hashing.xxHash64": "0.5.1",
"Wabbajack.Paths": "0.5.0" "Wabbajack.Paths": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.VFS.Interfaces.dll": {} "Wabbajack.VFS.Interfaces.dll": {}
@@ -2333,7 +2333,7 @@
} }
}, },
"libraries": { "libraries": {
"jackify-engine/0.5.0": { "jackify-engine/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
@@ -3022,202 +3022,202 @@
"path": "yamldotnet/16.3.0", "path": "yamldotnet/16.3.0",
"hashPath": "yamldotnet.16.3.0.nupkg.sha512" "hashPath": "yamldotnet.16.3.0.nupkg.sha512"
}, },
"Wabbajack.CLI.Builder/0.5.0": { "Wabbajack.CLI.Builder/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Common/0.5.0": { "Wabbajack.Common/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Compiler/0.5.0": { "Wabbajack.Compiler/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Compression.BSA/0.5.0": { "Wabbajack.Compression.BSA/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Compression.Zip/0.5.0": { "Wabbajack.Compression.Zip/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Configuration/0.5.0": { "Wabbajack.Configuration/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.Bethesda/0.5.0": { "Wabbajack.Downloaders.Bethesda/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.Dispatcher/0.5.0": { "Wabbajack.Downloaders.Dispatcher/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.GameFile/0.5.0": { "Wabbajack.Downloaders.GameFile/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.GoogleDrive/0.5.0": { "Wabbajack.Downloaders.GoogleDrive/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.Http/0.5.0": { "Wabbajack.Downloaders.Http/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.Interfaces/0.5.0": { "Wabbajack.Downloaders.Interfaces/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.IPS4OAuth2Downloader/0.5.0": { "Wabbajack.Downloaders.IPS4OAuth2Downloader/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.Manual/0.5.0": { "Wabbajack.Downloaders.Manual/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.MediaFire/0.5.0": { "Wabbajack.Downloaders.MediaFire/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.Mega/0.5.0": { "Wabbajack.Downloaders.Mega/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.ModDB/0.5.0": { "Wabbajack.Downloaders.ModDB/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.Nexus/0.5.0": { "Wabbajack.Downloaders.Nexus/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.VerificationCache/0.5.0": { "Wabbajack.Downloaders.VerificationCache/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.WabbajackCDN/0.5.0": { "Wabbajack.Downloaders.WabbajackCDN/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.DTOs/0.5.0": { "Wabbajack.DTOs/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.FileExtractor/0.5.0": { "Wabbajack.FileExtractor/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Hashing.PHash/0.5.0": { "Wabbajack.Hashing.PHash/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Hashing.xxHash64/0.5.0": { "Wabbajack.Hashing.xxHash64/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Installer/0.5.0": { "Wabbajack.Installer/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.IO.Async/0.5.0": { "Wabbajack.IO.Async/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Networking.BethesdaNet/0.5.0": { "Wabbajack.Networking.BethesdaNet/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Networking.Discord/0.5.0": { "Wabbajack.Networking.Discord/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Networking.GitHub/0.5.0": { "Wabbajack.Networking.GitHub/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Networking.Http/0.5.0": { "Wabbajack.Networking.Http/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Networking.Http.Interfaces/0.5.0": { "Wabbajack.Networking.Http.Interfaces/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Networking.NexusApi/0.5.0": { "Wabbajack.Networking.NexusApi/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Networking.WabbajackClientApi/0.5.0": { "Wabbajack.Networking.WabbajackClientApi/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Paths/0.5.0": { "Wabbajack.Paths/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Paths.IO/0.5.0": { "Wabbajack.Paths.IO/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.RateLimiter/0.5.0": { "Wabbajack.RateLimiter/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Server.Lib/0.5.0": { "Wabbajack.Server.Lib/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Services.OSIntegrated/0.5.0": { "Wabbajack.Services.OSIntegrated/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.VFS/0.5.0": { "Wabbajack.VFS/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.VFS.Interfaces/0.5.0": { "Wabbajack.VFS.Interfaces/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""

Binary file not shown.

View File

@@ -34,7 +34,8 @@ class InstallerThread(QThread):
non_premium_detected = Signal() non_premium_detected = Signal()
def __init__(self, modlist, install_dir, downloads_dir, api_key, modlist_name, def __init__(self, modlist, install_dir, downloads_dir, api_key, modlist_name,
install_mode='online', progress_state_manager=None, auth_service=None, oauth_info=None): install_mode='online', progress_state_manager=None, auth_service=None,
oauth_info=None, skip_disk_check=False):
super().__init__() super().__init__()
self.modlist = modlist self.modlist = modlist
self.install_dir = install_dir self.install_dir = install_dir
@@ -47,6 +48,7 @@ class InstallerThread(QThread):
self.progress_state_manager = progress_state_manager self.progress_state_manager = progress_state_manager
self.auth_service = auth_service self.auth_service = auth_service
self.oauth_info = oauth_info self.oauth_info = oauth_info
self.skip_disk_check = skip_disk_check
self._premium_signal_sent = False self._premium_signal_sent = False
self._non_premium_info_sent = False self._non_premium_info_sent = False
self._engine_output_buffer = [] self._engine_output_buffer = []
@@ -56,6 +58,8 @@ class InstallerThread(QThread):
self._raw_stdout_lines: list = [] # bounded ring buffer for non-JSON stdout self._raw_stdout_lines: list = [] # bounded ring buffer for non-JSON stdout
self._pending_manual_downloads: list = [] # accumulates items until list_complete self._pending_manual_downloads: list = [] # accumulates items until list_complete
self._resource_limit_hint: Optional[str] = None self._resource_limit_hint: Optional[str] = None
self._install_progress_started = False # True once any [FILE_PROGRESS] output seen
self._last_error_raw_context: dict = {} # raw context dict from structured engine errors
@staticmethod @staticmethod
def _is_generic_failure_text(message: Optional[str]) -> bool: def _is_generic_failure_text(message: Optional[str]) -> bool:
@@ -136,6 +140,12 @@ class InstallerThread(QThread):
error = parse_engine_error_line(line) error = parse_engine_error_line(line)
if error and self.last_error is None: if error and self.last_error is None:
self.last_error = error self.last_error = error
try:
obj = json.loads(line)
if obj.get("type") == "disk_full":
self._last_error_raw_context = obj.get("context") or {}
except (json.JSONDecodeError, ValueError):
pass
else: else:
if self.last_error is None and is_cc_content_error(line): if self.last_error is None and is_cc_content_error(line):
self.last_error = cc_content_missing(extract_cc_filename(line) or "") self.last_error = cc_content_missing(extract_cc_filename(line) or "")
@@ -265,6 +275,9 @@ class InstallerThread(QThread):
if debug_mode: if debug_mode:
cmd.append('--debug') cmd.append('--debug')
logger.debug("DEBUG: Added --debug flag to jackify-engine command") logger.debug("DEBUG: Added --debug flag to jackify-engine command")
if self.skip_disk_check:
cmd.append('--skip-disk-check')
logger.debug("DEBUG: Added --skip-disk-check flag to jackify-engine command")
logger.debug(f"DEBUG: FULL Engine command: {' '.join(cmd)}") logger.debug(f"DEBUG: FULL Engine command: {' '.join(cmd)}")
logger.debug(f"DEBUG: modlist value being passed: '{self.modlist}'") logger.debug(f"DEBUG: modlist value being passed: '{self.modlist}'")
from jackify.backend.handlers.subprocess_utils import get_clean_subprocess_env from jackify.backend.handlers.subprocess_utils import get_clean_subprocess_env
@@ -361,6 +374,7 @@ class InstallerThread(QThread):
logger.debug(f"DEBUG: Parser detected {len(progress_state.active_files)} active files from line: {decoded[:80]}") logger.debug(f"DEBUG: Parser detected {len(progress_state.active_files)} active files from line: {decoded[:80]}")
self.progress_updated.emit(progress_state) self.progress_updated.emit(progress_state)
if '[FILE_PROGRESS]' in decoded: if '[FILE_PROGRESS]' in decoded:
self._install_progress_started = True
parts = decoded.split('[FILE_PROGRESS]', 1) parts = decoded.split('[FILE_PROGRESS]', 1)
if parts[0].strip(): if parts[0].strip():
self.progress_received.emit(parts[0].rstrip()) self.progress_received.emit(parts[0].rstrip())
@@ -427,6 +441,7 @@ class InstallerThread(QThread):
continue continue
self._remember_stdout_line(decoded) self._remember_stdout_line(decoded)
if '[FILE_PROGRESS]' in decoded: if '[FILE_PROGRESS]' in decoded:
self._install_progress_started = True
parts = decoded.split('[FILE_PROGRESS]', 1) parts = decoded.split('[FILE_PROGRESS]', 1)
if parts[0].strip(): if parts[0].strip():
self.output_received.emit(parts[0].rstrip()) self.output_received.emit(parts[0].rstrip())

View File

@@ -406,6 +406,18 @@ class ProgressHandlersMixin:
if self._premium_failure_active: if self._premium_failure_active:
message = "Installation stopped because Nexus Premium is required for automated downloads." message = "Installation stopped because Nexus Premium is required for automated downloads."
if not self._premium_failure_active and not cancellation_detected:
thread = getattr(self, 'install_thread', None)
if (thread
and not getattr(thread, '_install_progress_started', False)
and getattr(getattr(thread, 'last_error', None), 'title', '') == "Disk Full"):
ctx = getattr(thread, '_last_error_raw_context', {})
if self._handle_preflight_disk_space(ctx):
return
self._installation_cancelled = True
self.process_finished(130, QProcess.NormalExit)
return
if not self._premium_failure_active: if not self._premium_failure_active:
engine_error = getattr(self.install_thread, 'last_error', None) engine_error = getattr(self.install_thread, 'last_error', None)
if engine_error: if engine_error:
@@ -417,6 +429,68 @@ class ProgressHandlersMixin:
self._safe_append_text(f"\nError: {message}") self._safe_append_text(f"\nError: {message}")
self.process_finished(1, QProcess.CrashExit) # Simulate error self.process_finished(1, QProcess.CrashExit) # Simulate error
def _handle_preflight_disk_space(self, ctx: dict) -> bool:
"""Show pre-flight disk space warning dialog. Returns True if user chose Continue Anyway."""
required_bytes = ctx.get('required_bytes', 0)
available_bytes = ctx.get('available_bytes', 0)
def _fmt(b):
if b >= 1024 ** 3:
return f"{b / 1024 ** 3:.1f} GB"
if b >= 1024 ** 2:
return f"{b / 1024 ** 2:.1f} MB"
return f"{b} bytes" if b else "unknown"
required_str = _fmt(required_bytes)
available_str = _fmt(available_bytes)
body = (
f"The disk space check reports that there may not be enough free space to complete "
f"this installation.\n\n"
f"Required: {required_str}\n"
f"Available: {available_str}\n\n"
f"If this is a modlist update, the actual space needed is likely far less — most files "
f"are already present and will be reused rather than re-downloaded.\n\n"
f"You can continue and free up space while downloads are running, "
f"or cancel to resolve the space issue first."
)
from PySide6.QtWidgets import QMessageBox
dlg = QMessageBox(self)
dlg.setWindowTitle("Disk Space Warning")
dlg.setText("Not enough free disk space detected.")
dlg.setInformativeText(body)
dlg.setIcon(QMessageBox.Warning)
continue_btn = dlg.addButton("Continue Anyway", QMessageBox.AcceptRole)
dlg.addButton("Cancel", QMessageBox.RejectRole)
dlg.setDefaultButton(continue_btn)
dlg.exec()
if dlg.clickedButton() is not continue_btn:
return False
thread = getattr(self, 'install_thread', None)
if not thread:
return False
modlist = getattr(thread, 'modlist', None)
install_dir = getattr(thread, 'install_dir', None)
downloads_dir = getattr(thread, 'downloads_dir', None)
api_key = getattr(thread, 'api_key', None)
install_mode = getattr(thread, 'install_mode', 'online')
oauth_info = getattr(thread, 'oauth_info', None)
if not (modlist and install_dir and downloads_dir and api_key):
return False
logger.info("Pre-flight disk space check bypassed by user — restarting with --skip-disk-check")
self._safe_append_text("\n[WARN] Disk space check bypassed. Continuing installation...\n")
self.run_modlist_installer(
modlist, install_dir, downloads_dir, api_key,
install_mode, oauth_info, skip_disk_check=True,
)
return True
def process_finished(self, exit_code, exit_status): def process_finished(self, exit_code, exit_status):
logger.debug(f"DEBUG: process_finished called with exit_code={exit_code}, exit_status={exit_status}") logger.debug(f"DEBUG: process_finished called with exit_code={exit_code}, exit_status={exit_status}")
# Reset button states # Reset button states

View File

@@ -384,7 +384,7 @@ class InstallWorkflowExecutionMixin:
self.cancel_install_btn.setVisible(False) self.cancel_install_btn.setVisible(False)
logger.debug(f"DEBUG: Controls re-enabled in exception handler") logger.debug(f"DEBUG: Controls re-enabled in exception handler")
def run_modlist_installer(self, modlist, install_dir, downloads_dir, api_key, install_mode='online', oauth_info=None): def run_modlist_installer(self, modlist, install_dir, downloads_dir, api_key, install_mode='online', oauth_info=None, skip_disk_check=False):
logger.debug('DEBUG: run_modlist_installer called - USING THREADED BACKEND WRAPPER') logger.debug('DEBUG: run_modlist_installer called - USING THREADED BACKEND WRAPPER')
# Rotate log file at start of each workflow run (keep 5 backups) # Rotate log file at start of each workflow run (keep 5 backups)
@@ -408,7 +408,8 @@ class InstallWorkflowExecutionMixin:
modlist, install_dir, downloads_dir, api_key, self.modlist_name_edit.text().strip(), install_mode, modlist, install_dir, downloads_dir, api_key, self.modlist_name_edit.text().strip(), install_mode,
progress_state_manager=self.progress_state_manager, # R&D: Pass progress state manager progress_state_manager=self.progress_state_manager, # R&D: Pass progress state manager
auth_service=self.auth_service, # Fix Issue #127: Pass auth_service for Premium detection diagnostics auth_service=self.auth_service, # Fix Issue #127: Pass auth_service for Premium detection diagnostics
oauth_info=oauth_info # Pass OAuth state for auto-refresh oauth_info=oauth_info, # Pass OAuth state for auto-refresh
skip_disk_check=skip_disk_check,
) )
self.install_thread.output_received.connect(self.on_installation_output) self.install_thread.output_received.connect(self.on_installation_output)
self.install_thread.progress_received.connect(self.on_installation_progress) self.install_thread.progress_received.connect(self.on_installation_progress)