Skip to content

Releases: rolling-codes/LSPDFRManager

v3.7.23 - Bug Fix Marathon

Choose a tag to compare

@rolling-codes rolling-codes released this 22 May 19:59

Release v3.7.23 - Bug Fix Marathon

This release consolidates a large round of static-analysis-driven bug fixes across the backend API layer, the React frontend, and the install workflow. No new features — every change is a correctness or reliability fix.

Critical Fixes

Install workflow now routes through the full install queue

Previously the /api/v1/install endpoint called FileInstaller directly, bypassing the install queue entirely. This meant installs triggered from the UI skipped pre-install backups, transaction tracking, and library registration. The endpoint now delegates to ExecuteInstallCallback which routes through InstallQueue — the same path the WPF install tab uses. Running in standalone/dev mode returns an explicit error instead of silently half-installing.

Safe-mode restore no longer re-enables unrelated plugins

The safe-mode apply endpoint now writes a safe_mode_state.json manifest recording only the files it actually renamed to .disabled. The restore endpoint reads that manifest and re-enables only those exact paths. Previously it re-enabled every .disabled file in the GTA directory, including files the user had manually disabled before entering safe mode.

API Fixes

Cleanup endpoint surfaces delete failures

When CleanupApplyService succeeded overall but failed to delete individual files, the error field in the response was always null. It now synthesizes a message listing the failed paths (e.g. "Failed to delete 2 item(s): Plugins/mod.asi…") when AbortReason is null but FailedPaths is non-empty.

Profile DELETE clears ActiveProfileId

Deleting the currently active profile left AppConfig.ActiveProfileId pointing at a non-existent profile. The DELETE endpoint now clears and saves ActiveProfileId when the deleted ID matches.

Profile PUT rejects ID mismatch in body

The PUT endpoint now validates that the profile ID in the URL matches the Id in the deserialized profile JSON, rejecting mismatches with 400 Bad Request.

Browse API URL validation tightened

PUT /api/v1/config now validates BrowseApiBaseUrl more strictly: must be http://, loopback host only (localhost or 127.0.0.1), explicit port, no path, no query, no fragment. Normalizes to scheme://host:port before persisting.

GtaPathValid included in config responses

GET /api/v1/config and PUT /api/v1/config now return gtaPathValid: bool — the result of checking that the path exists and contains a GTA5 executable. The setup redirect in the React shell uses this to avoid redirecting when the path is set but temporarily unmounted.

Missing endpoints registered

LocalApiHost and the standalone Program.cs were missing registrations for MapProfiles, MapInstall, MapCleanup, MapDiagnostics, and MapSafeMode. All five are now registered.

204 No Content responses parsed correctly

The API client now returns undefined for 204 No Content responses (and zero-length bodies) instead of attempting to parse an empty string as JSON, which caused delete/disable operations to throw in the frontend.

Frontend Fixes

Backup progress bar no longer disappears mid-job

After adding staged progress strings to the backup endpoint ("Validating paths", "Creating backup…", etc.), the isRunning check in BackupsPage was only matching the literal strings "Running" and "Pending". Progress bars vanished the moment the first staged message arrived. Detection is now terminal-state-based: a job is running unless its state is Completed, Failed, or Cancelled.

Backup list invalidated after job and when path changes

  • The queryClient.invalidateQueries after a backup job completes is now inside a useEffect instead of running in the render body (which caused an infinite re-render loop in React strict mode).
  • Changing the backup folder path in Settings now invalidates the ['backups'] query so the list reflects the new folder immediately.

Library notes input no longer shows stale value

The notes <textarea> in the mod library row held its own local state initialised once at mount. After a background query refresh returned updated notes, the input continued showing the pre-refresh value. A useEffect now syncs the local state whenever mod.id or mod.notes changes.

UI Redesign (v3.7.22)

  • Dashboard — launch readiness hero card with LSPDFR component status, quick-action links, improved component cards with icon + state badge.
  • Library — disabled/issues count badges in header, smart empty state with contextual guidance, Clear Filters button, issue-row highlight, useEffect-synced notes input.
  • Settings — section icons, toggle descriptions, NaN-safe numeric inputs, sticky save footer with unsaved-changes indicator.

Quality

  • Version bumped to 3.7.23.
  • Build: 0 errors.
  • Tests: 1012/1012 passing.
  • TypeScript: 0 errors.
  • Frontend production build passes.

Full Changelog: v3.7.21...v3.7.23

Full Changelog: v3.7.21...v3.7.23

LSPDFR Manager v3.7.21

Choose a tag to compare

@rolling-codes rolling-codes released this 22 May 18:28

v3.7.21 — Reliability & Bug Fix Release

This release fixes several critical and high-severity bugs discovered through automated code review, including concurrency issues that could cause silent data loss, UI freezes, and missing endpoint registration.


Critical Fixes

Library sync: TOCTOU race eliminated
SyncWithDirectory previously took a snapshot of orphaned mods before acquiring the mutation lock, then removed them after acquiring it. A concurrent mod reinstall during that gap could be silently deleted. The snapshot and removal now happen inside a single lock acquisition — the detection and the removal are atomic.

Library sync: dual write path removed
The /api/v1/mods/sync API endpoint had its own independent disk read-modify-write path (reading library.json directly) that operated outside of ModLibraryService's in-memory collection and locking model. The two paths shared only file-write atomicity, not read-modify-write atomicity, which could allow stale reads to silently restore pruned entries. The endpoint now delegates to ModLibraryService.SyncWithDirectory directly, so both the WPF layer and the API layer share one locking model.

Library endpoints missing from production host
app.MapLibrary() was never called in LocalApiHost. All library endpoints (GET /api/v1/mods, POST /api/v1/mods/:id/enable, PUT /api/v1/mods/:id/notes, POST /api/v1/mods/sync) were only registered in the standalone dev-server path (Program.cs) and were completely absent from the in-process WPF host. All library endpoints now work correctly in the shipped application.


High Severity Fixes

UI thread freeze on library refresh
LibraryViewModel.Refresh called SyncWithDirectory synchronously on the UI thread. On large libraries or network drives this runs hundreds of File.Exists checks and blocks the UI. The Refresh command is now async — the directory scan runs on a thread-pool thread with an IsRefreshing guard to prevent overlapping refreshes.


Improvements

RageLogScanner: compiled regex patterns
Detection logic refactored from .ToLowerInvariant() / .Contains() chains to named [GeneratedRegex] partial methods with IgnoreCase | CultureInvariant options. Patterns are source-generated at compile time (zero runtime allocation). ProduceFindings now reads as a clean rule engine.


Tests

8 new regression tests added (1012 total):

  • SyncWithDirectory_RemovesOrphanedMod_ReturnsCount
  • SyncWithDirectory_LeavesModWithExistingFile
  • SyncWithDirectory_LeavesModWithDisabledVariant
  • SyncWithDirectory_IgnoresModWithEmptyFileList
  • SyncWithDirectory_RemovesOnlyOrphanedMods_LeavesLiveModsIntact
  • SyncWithDirectory_CalledFromBackgroundThread_DoesNotDeadlock
  • RefreshCommand_PrunesOrphanedMod_AfterAsyncSync
  • RefreshCommand_IsRefreshingFalse_AfterCompletion

Full Changelog: v3.7.20...v3.7.21

LSPDFR Manager v3.7.19

Choose a tag to compare

@rolling-codes rolling-codes released this 19 May 22:23

Release v3.7.19 - Full TypeScript Stack and UI Polish

Highlights

Full TypeScript frontend stack

  • The React preview has moved to a full TypeScript stack for the frontend workflow.
  • Route metadata, shared UI primitives, page components, API types, and migrated feature surfaces are now typed end-to-end.
  • The production TypeScript build is part of the release gate and refreshes the packaged wwwroot assets.

More professional React UI

  • Reworked the React shell with a polished desktop-tool layout, grouped navigation, top status bar, and responsive mobile route selector.
  • Added shared Page, Panel, StateMessage, and StatusBadge primitives for consistent page structure and state handling.
  • Polished Dashboard, Library, Install, Logs, History, Settings, Cleanup, Patrol Readiness, and migration-placeholder pages.
  • Added Lucide icons for navigation, status, actions, toggles, and workflow feedback.

Cleanup

  • Removed unused Vite starter styles and sample assets from the frontend.
  • Rebuilt bundled LocalApi static assets for the updated React UI.

Quality

  • Version bumped to 3.7.19.
  • Frontend lint passes.
  • Frontend production build passes.
  • Build: Release build completed with 0 errors.
  • Tests: 914/914 passing in Debug and Release.

Full Changelog: v3.7.18...v3.7.19

Full Changelog: v3.7.18...v3.7.19

LSPDFR Manager v3.7.18

Choose a tag to compare

@rolling-codes rolling-codes released this 19 May 22:06

Release v3.7.18 - React Preview and Shared Core Extraction

Highlights

Shared core library extraction

  • Moved shared domain models, services, command contracts, feature contracts, and car-install planning code into LSPDFRManager.Shared.
  • Updated the WPF app and tests to reference the shared project directly, keeping the existing desktop workflows available while making the core logic reusable.

Local API host

  • Added LSPDFRManager.LocalApi, an in-process local API host for desktop-backed frontend integration.
  • Added localhost-only middleware, job queue support, DTOs, and endpoints for the existing app areas including backups, browse, cleanup, config, diagnostics, history, install, library, logs, patrol readiness, profiles, and safe mode.

React UI preview

  • Added the React frontend scaffold and bundled static web assets.
  • Added a WPF React UI preview navigation entry and view model so the desktop app can host the new preview path.

Quality

  • Version bumped to 3.7.18.
  • Frontend production build completed successfully.
  • Build: Release build completed with 0 errors.
  • Tests: 914/914 passing in Debug and Release.

Full Changelog: v3.7.17...v3.7.18

Full Changelog: v3.7.17...v3.7.18

v3.7.17 - Cleanup Tab Crash Fix

Choose a tag to compare

@rolling-codes rolling-codes released this 18 May 22:26

Release v3.7.17 - Cleanup Tab Crash Fix

Bug Fixes

Cleanup tab crash on open (v3.7.16 regression)

  • Fixed crash when navigating to the Cleanup tab. A Run.Text binding to the read-only ConfirmPhrase property defaulted to TwoWay mode, causing WPF to throw an unhandled exception during layout.

Cleanup confirmation UX simplified

  • Removed typed confirmation phrase requirement from all cleanup modes. The confirmation screen no longer requires typing a phrase before the Delete button is enabled.
  • Confirm button is now enabled as soon as at least one item is selected, matching standard destructive-action UX patterns.
  • All other safety measures remain: preview before delete, backup before delete, abort on backup failure, explicit Confirm button click required.

Quality

  • Build: 0 errors.
  • Tests: 914/914 passing (includes 32 navigation smoke tests and cleanup regression tests).

Full Changelog: v3.7.16...v3.7.17

v3.7.16 - Setup, Safe Mode, and Cleanup Fixes

Choose a tag to compare

@rolling-codes rolling-codes released this 18 May 21:53

Release v3.7.16 - Setup, Safe Mode, and Cleanup Fixes

What's New

First-Launch Setup Wizard

  • Fixed first-launch setup flow so users can select and scan their GTA V root before the main UI loads.
  • Wizard is shown automatically on first run or when no GTA path is configured; skipped on subsequent launches.

Navigation

  • Added scrollable sidebar navigation so all nav buttons remain accessible at any window height.

LSPDFR / RPH Detection Fixes

  • Fixed LSPDFR core detection to correctly identify Plugins/LSPD First Response.dll.
  • Fixed RAGE Plugin Hook detection to include RagePluginHook.dll alongside RAGEPluginHook.exe.
  • Added Albo1125.Common.dll as a recognised shared dependency (not classified as a removable plugin).

Safe Mode Builder

  • Fixed Safe Mode Builder navigation so the wizard pages advance and return correctly.
  • Hardened apply safety: config backups are always written before any patch is applied.

Safe LSPDFR Cleanup Tool

  • New Cleanup tab with a four-screen wizard: mode select → preview → confirm → result.
  • Safe Core Reset mode: default-selects only the LSPDFR core DLL; third-party plugins are never selected.
  • Third-Party Plugin Cleanup mode: nothing selected by default; requires typing DELETE SELECTED PLUGINS to confirm.
  • Preview shows every candidate grouped by plugin with risk labels before any deletion occurs.
  • A timestamped ZIP backup is created before any file is deleted; the operation is aborted if the backup fails.
  • GTA executables and paths outside the GTA root are always blocked from deletion.

Quality

  • Build: 0 errors, 0 warnings.
  • Tests: all tests passing.

Full Changelog: v3.7.15...v3.7.16

v3.7.15 - LSPDFR/RPH Detection and Safe Mode Fixes

Choose a tag to compare

@rolling-codes rolling-codes released this 18 May 19:48

Release v3.7.15 - LSPDFR/RPH Detection and Safe Mode Fixes


Changes

  • Fixed LSPDFR core detection to recognize canonical Plugins/LSPD First Response.dll while tolerating the legacy plugins/LSPDFR.dll path.
  • Fixed RAGE Plugin Hook detection to require root-level RAGEPluginHook.exe only (subdirectory candidates removed).
  • Fixed RPH readiness and recipe validation to require RagePluginHook.dll alongside RAGEPluginHook.exe.
  • Added Albo1125.Common.dll shared-dependency handling for the Albo1125 plugin family install ordering.
  • Wired Safe Mode Builder into sidebar navigation and App.xaml DataTemplate.
  • Fixed dashboard Safe Launch quick action to navigate to the Safe Mode Builder instead of applying changes silently.
  • Hardened Safe Mode apply flow: backup failure now aborts before any file changes occur.
  • Improved Safe Mode verification mismatch reporting: mismatches now set Success=false and surface a specific user message.
  • Added focused regression tests for installer, locator, planner, and recipe validation.

Verified

  • Build: 0 errors.
  • Tests: all pass.

v3.7.14 - Uninstall Delete Safety Patch

Choose a tag to compare

@rolling-codes rolling-codes released this 17 May 17:53

Release v3.7.14 - Uninstall Delete Safety Patch

Urgent patch release for uninstall flows that could remove the library record even when detected files were not actually deleted.


Fixes

  • Track uninstall outcomes for deleted, missing, shared, and failed files.
  • Delete both active and .disabled detected files during uninstall.
  • Keep the mod in the library when one or more files cannot be deleted.
  • Surface a clear uninstall error on the mod card when deletion fails.
  • Preserve shared files used by other installed mods and report them as skipped, not failed.

Verification

dotnet build LSPDFRManager.sln --no-restore /m:1
dotnet test LSPDFRManager.Tests/LSPDFRManager.Tests.csproj --no-build

Result: 811 passing.

Packaged EXE startup smoke passed from the release folder.

Full Changelog: v3.7.13...v3.7.14

Full Changelog: v3.7.13...v3.7.14

v3.7.13 - Urgent Button Crash Patch

Choose a tag to compare

@rolling-codes rolling-codes released this 17 May 17:37

Release v3.7.13 - Urgent Button Crash Patch

Urgent patch release for UI button crashes discovered during the button press validation pass.


Fixes

  • Fixed crashes when opening Patrol Readiness and Developer Diagnostics caused by missing shared XAML resource aliases.
  • Fixed a Patrol Readiness binding crash on read-only text properties.
  • Fixed Dashboard launch buttons so invalid or unlaunchable GTA5.exe / RAGEPluginHook.exe targets log a friendly error instead of crashing the UI.
  • Added an in-process WPF button wiring smoke test that renders the changed views and executes key commands.

Verification

dotnet test LSPDFRManager.Tests/LSPDFRManager.Tests.csproj

Result: 807 passing.

Full Changelog: v3.7.12...v3.7.13

Full Changelog: v3.7.12...v3.7.13

v3.7.12 - Smart Foundation + Patrol Readiness Dashboard

Choose a tag to compare

@rolling-codes rolling-codes released this 17 May 17:17

Release v3.7.12 - Smart Foundation + Patrol Readiness Dashboard

Feature release adding rule-based diagnostics, a feature flag system, and the Patrol Readiness Dashboard, the first user-facing surface of the smart-feature platform.


Headline Feature

Patrol Readiness Dashboard

A pre-flight check that tells you whether your LSPDFR setup is ready to launch and what to fix if it is not.

Status levels:

Status Meaning
Ready for Patrol No blocking issues, no warnings
Needs Attention Warnings present but nothing blocking
Not Ready One or more blocking issues must be resolved

What it checks:

  • GTA V path, GTA5.exe, RAGEPluginHook.exe, and LSPDFR.dll presence
  • Mod health per mod
  • Duplicate shared DLLs
  • Config file lint errors in .ini, .xml, .json, .cfg, and .meta files
  • Plugin and config changes since the last known-good launch
  • ScriptHookV and ScriptHookVDotNet version drift warnings

Actions on the dashboard:

  • Scan Now - runs all checks and scores the result from 0 to 100
  • Mark as Known-Good - snapshots plugin list and config hashes as a reference baseline
  • Export Support Bundle - produces a sanitized ZIP for troubleshooting

Smart-Feature Foundation

  • FeatureFlagService provides file-backed feature overrides at %APPDATA%\LSPDFRManager\feature-flags.json
  • Rule engine primitives support deterministic, testable checks with suggested fixes
  • IniLinterService validates common LSPDFR configuration file formats
  • DllDuplicateScanner finds duplicate shared dependencies across install locations
  • ModHealthScoringService produces per-mod health verdicts
  • SupportBundleService exports sanitized diagnostics for triage
  • PatrolReadinessController orchestrates readiness scoring and issue aggregation

UI Changes

  • Patrol Ready nav item added above Diagnostics in the sidebar
  • Dev Diagnostics nav item added at the bottom of the sidebar
  • Settings includes UI scale RadioButtons
  • Config tab shows mod name above the file name in parsed and raw editor headers

Fixes

  • RAGE Plugin Hook archives are detected with a dedicated rule instead of low-confidence miscellaneous detection.
  • ASI archive detection remains covered for plain trainer-style .asi packages.
  • Uninstall confirmation dialogs now use the main window as owner so they do not appear behind the app.

Architecture

Layer Added
Domain InstallIssue, PatrolReadinessSummary, FeatureManifest, FeatureStage, rule models, lint results, DLL duplicate results, mod health results, known-good diff support
Services FeatureFlagService, FeatureRegistry, IniLinterService, DllDuplicateScanner, ModHealthScoringService, InstallReceiptService, SupportBundleService, RageLogParser, RageLogScanner
Features PatrolReadiness/IPatrolReadinessController, PatrolReadiness/PatrolReadinessController
ViewModels PatrolReadinessDashboardViewModel, DevDiagnosticsViewModel
Views PatrolReadinessDashboardView.xaml, DevDiagnosticsView.xaml
Tests 806 passing

Verification

dotnet build LSPDFRManager.sln
dotnet test LSPDFRManager.Tests/LSPDFRManager.Tests.csproj

Full Changelog: v3.7.11...v3.7.12

Full Changelog: v3.7.11...v3.7.12