The loop "for (int i = 0; processes.Length > i || i < 5; i++)" compared the
process count to the loop index and, because of the "|| i < 5", always ran
at least 5 iterations of Thread.Sleep(250) -- stalling ~1.25s before every
patch/restore even when WeMod was not running.
Use "processes.Length > 0 && i < 5" so it retries only while a target
process is still alive, capped at 5 attempts.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Pickle.Resize allocated the backing array as _header.Length + newCapacity
but advertised _capacityAfterHeader = newCapacity. On the first growth
_header is still empty, so the array ended up _headerSize (4) bytes short of
the header + capacity it claimed. A write that fills the payload then
overran the buffer, throwing an ArgumentException when the serialised asar
header was 4089-4092 bytes.
Allocate _headerSize + newCapacity instead, matching Chromium's
realloc(header_size_ + new_capacity).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
AsarExtractor's path-traversal guard called Extensions.GetRelativePath,
whose fast path strips the destination prefix literally without resolving
".." segments. A crafted archive entry such as "a/../../evil" produced a
relative path that did not start with "..", so the guard passed and the
file was written outside the extraction directory once the OS resolved the
"..". The out-of-package symlink guard shared the same weakness.
Add Extensions.IsPathInside, which normalises both paths with
Path.GetFullPath before the containment check, and use it for both the
file/directory and symlink guards.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
vswhere catalog_productLineVersion returns the major (e.g. 18) on the
new runner, so the derived '-G Visual Studio 18 18' was rejected. Drop
-G entirely and let CMake select its default Visual Studio generator
(-A x64 still pins the architecture); clear CMAKE_GENERATOR so a non-VS
override can't break the architecture flag. MSBuild stays version-agnostic.
The runner's windows-latest image bumped Visual Studio past 2022, so the
hardcoded vswhere range [17.0,18.0) and the 'Visual Studio 17 2022' CMake
generator no longer matched, failing the release build. Pick the latest
installed VS and derive the generator from its version/product line.
- Bump AssemblyInfo to 1.0.9.0 and add the CHANGELOG section.
- build.ps1 now code-signs the Release exe with a self-signed
certificate (reused across builds, generated on first use, no env
or secrets needed) to lower false-positive AV/VirusTotal detections.
- Add 6 locales (en-US source + ru-RU, de-DE, fr-FR, es-ES, zh-CN)
matching the patcher's WPF UI; full .po catalogs incl. plural forms.
- Language selector in the left settings drawer; persist choice and
auto-detect from navigator language on first load.
- Load .po directly via @lingui/vite-plugin (drop the compile step);
gitignore generated catalog .js as build artifacts.
Reorganize the panel around product capabilities and integrate the
remote i18n feature from origin/master into the new structure.
- Restructure src into capability features (app, trainer, library,
remote-session, appearance, shared); move the bridge to bridge/src.
- Add lingui-based UI localization and wrap remaining user-facing
strings (Trans / msg macros); fix the 'END В·' mojibake.
- Port WeMod cheat-metadata i18n: capture the access token from the
snapshot's renderer in the bridge and fetch localized trainer_meta
in remote-session.i18n; guarantee snapshot sync on token failure.
- Wire vitest to the app's lingui/preact pipeline (mergeConfig).
- reduce ASAR IO overhead with streamed archive reads, buffered copies, faster relative-path handling and placeholder integrity records
- fix in-place app.asar.unpacked packing/extraction self-copy cases that caused locked-file failures
- tighten JS patch discovery with candidate bundle filters and search hints
- require prebuilt remote-panel dist artifacts and clean up embedded bridge/script packaging
- add unified build entrypoints for PowerShell, cmd and bash and move native CMake output under .tmp
- add release metadata validation, changelog section extraction, pre-commit hook and GitHub Actions validation/release pipelines
- make CHANGELOG the source of truth for release notes and document the tag-driven release flow
- add updater release notes UI with latest/full changelog loading and localize the new update strings
- modularize bridge renderer scripts, add installed apps and game status sync, and support remote launch/stop commands
- centralize bridge protocol, IPC and WebSocket constants and improve LAN IP selection for QR pairing
- refactor remote panel controls/state enums, persist accent color, polish library/session UI and refresh assets