Commit Graph

77 Commits

Author SHA1 Message Date
kitbyte 2cac40558d feat(launcher): write startup diagnostics to launcher.log
Records spawned processes and their fuse state, exit and unhandled
exception codes, detach timing and reason, and the exit code after detach.
2026-08-29 21:49:29 +03:00
kitbyte ff0c8615f8 docs(changelog): note the failed-patch rollback 2026-08-29 18:45:26 +03:00
kitbyte 9bcb4bb991 fix(patch): roll back the installation when patching fails
Patching mutated the install in place with no recovery, so a failure left a
partly patched Wand behind: rewritten bundles in app.asar.unpacked, or a patched
app.asar with no launcher deployed, which cannot clear the fuse and fails with
-36861. Restore both backups on any failure and rethrow the original error.

Pack the archive into a sibling file and swap it in at the end. Writing straight
into app.asar truncated it when the stream opened, so a failed pack destroyed
the archive it was replacing.
2026-08-29 18:44:24 +03:00
kitbyte 8b83750bf2 chore(release): prepare 2.0.0.0 and support pre-release tags
Bump AssemblyInfo to 2.0.0.0 and add the 2.0.0.0 changelog section.
Resolve a tag suffix (2.0.0.0-rc.1) to its base version so release metadata
validation and changelog extraction accept pre-release tags.
Publish suffixed tags as a pre-release and keep them off "Latest release".
2.0.0.0-rc.1
2026-08-29 17:34:16 +03:00
kitbyte 43e898c66c feat(panel): add IconButton primitive and fix input, reconnect and a11y gaps
Extract IconButton into shared/ui and reuse it across the drawers, top bar and
cheat tiles instead of repeating the glass button markup.

Render the app even when the locale catalog fails to load; a rejected import
previously left a blank page.
Keep a draft string while a number input is focused so typing a decimal point
survives formatting, and snap stepper results to the step precision.
Let IncrementalControl step forward from an unrecognised value.
Back off reconnect attempts and stop reconnecting after an explicit disconnect.
Route locale storage through shared/storage.

Give the drawers dialog semantics, Escape and focus containment; add listbox
semantics plus click-away and Escape to the selection dropdown; add
aria-expanded to category headers and accessible names to the controls.
Add a pin button to cheat tiles, which were previously pin-by-swipe only.
Compare handler props in the CategorySection memo comparator.
Clear the swipe settle timer on unmount.
2026-08-29 16:57:00 +03:00
kitbyte f2e88e9247 fix(renderer-scripts): await the bridge bind and retry it on poll
ipcRenderer.invoke rejects asynchronously, so marking the bridge bound before
awaiting left set-value dead for the session while the log reported success.

Compare installed-app snapshots structurally instead of by an explicit field
list, which had already drifted from the bridge copy and hid location changes.
2026-08-29 16:56:51 +03:00
kitbyte 5d1aa69a97 refactor(bridge): type the bridge and harden the websocket and file server
Type every module under bridge/src against a shared types.ts vocabulary and the
protocol payload types; narrow Wand IPC input as unknown instead of any.
Keep the Electron port types out of the CommonJS runtime files, where an export
statement makes esbuild treat the module as ESM and drop module.exports.

Reject unmasked client frames, enforce control-frame length and fragmentation
limits, and echo the peer close code.
Resolve static requests inside the panel root and serve the whole root, not
only assets/.
Ignore value-changed events that name a different trainer.
Validate envelopes through the shared protocol validator.
Bind the renderer destroyed listener once per sender.
Handle https response errors while fetching trainer strings.
Compare installed-app snapshots structurally so no field is missed.
2026-08-29 16:56:45 +03:00
kitbyte e04e313fa3 refactor(wpf): decouple the view model from the window and localize its output
Introduce IShellView and IFileDialogs so MainWindowVm no longer holds the
concrete window or reaches through MainWindow.Instance, and file pickers are
injectable.

Run Restore off the UI thread like Patch and gate both buttons on IsBusy.
Gate the log commands on a non-empty log.

Move runtime log messages into the locale dictionaries and add the 14 new keys
to all 12 languages.
Track the injected locale dictionary so switching language replaces it instead
of appending a new one each time.

Remove the unused InfoItem control, ToVisibilityInvertedConverter, mw_title and
the popup placeholder title.
2026-08-29 16:56:36 +03:00
kitbyte 572b61ac25 feat(launcher): clear the ASAR fuse from a debugger instead of a proxy DLL
Launch Wand with DEBUG_PROCESS and patch the integrity fuse byte in every
process Electron spawns, then detach once the startup burst settles. Electron
respawns children from its own on-disk exe, so patching only the main process
left renderers crashing with -36861.

Remove the version.dll proxy project and its CMake build step; the launcher no
longer ships a native helper. Update the README to describe the debugger-based
mechanism and drop CMake from the build requirements.

Time the detach with Stopwatch instead of Environment.TickCount, which wraps.
Check the PatchFuse result and surface a failure to the startup log.
Scan for the fuse sentinel byte by byte rather than assuming 8-byte alignment.
Close the image handle the kernel hands over with each process event.
Name the DEBUG_EVENT and fuse wire offsets.
Re-quote forwarded argv so Squirrel paths containing spaces survive.
Keep an unobserved task exception from terminating the process.
2026-08-29 16:56:25 +03:00
kitbyte 6716da5c80 feat(patch-engine): locate patches structurally instead of by signature
Anchor each patch on a stable string (API endpoint, IPC channel, method name)
and walk the delimiter structure via JsCursor to the edit site, reading
minified identifiers out of the located region.

Move injected JavaScript into WandEnhancer/Patches/*.js as embedded resources.
Declare patches as PatchEntry rows in EnhancerConfig with CandidateFileNames,
SearchHints and optional CapabilityHints.

Recognise keyword-preceded regex literals in JsCursor so `return/re/.test(x)`
no longer desynchronises the scan.
Require the remote setValue anchor to match exactly once; Wand ships sibling
call sites for other sources.
Require both backup halves in IsPatched so a partial backup no longer blocks
patch and restore at the same time.
Chain inner exceptions when unpack or pack fails.
Rename Common to ProcessTerminator and Utils.Extensions to WeModInstalls.
2026-08-29 16:56:09 +03:00
kitbyte 20956c3228 fix(asar): correct archive tree lookups and fail loudly on unreadable input
InsertFile resolved the grandparent node instead of the parent.
Reads no longer create phantom directories in the header.
Bound symlink traversal and skip reparse points when crawling.
Locked or unreadable files now abort packing instead of being dropped.
Read headers and integrity blocks with a full-read loop.
Assert the header keeps its size before overwriting the placeholder.
Validate Pickle buffer sizes, payload overflow and negative lengths.
Check CreateSymbolicLink and external tool exit codes.
Drop unused Pickle accessors, TransformedFile and FilesystemFilesAndLinks.Links.
2026-08-29 16:55:55 +03:00
kitbyte f798714f8d chore(build): enforce lint, type-check and dist invariants in build and CI
Add verify-dist.mjs (node --check on bundles, dev-only payload guard).
Wire lint into build.ps1 and type-check both web and bridge in pnpm build.
Drop noImplicitAny override and switch bridge to Bundler resolution.
Run CI on pull_request and push to master.
2026-08-29 16:55:07 +03:00
kitbyte 643c8f8b62 fix: bump version to 1.0.9.4, update changelog 1.0.9.4 2026-07-22 00:03:38 +03:00
k1tbyte e7c7beb621 Merge pull request #143 from divya0795/fix/asar-extraction-safety-and-process-kill
fix(asar): path traversal (zip-slip) on extract + Pickle buffer overrun
2026-07-21 23:22:42 +03:00
k1tbyte 710e717677 Merge pull request #145 from divya0795/fix/trykillprocess-retry-loop
fix: correct TryKillProcess retry loop condition
2026-07-21 23:22:04 +03:00
dchukkapalli-dev 7e8cadff24 fix: correct TryKillProcess retry loop condition
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>
2026-07-13 20:21:07 +00:00
dchukkapalli-dev 7d28eb7d52 fix(asar): correct Pickle payload buffer allocation
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>
2026-07-13 19:59:06 +00:00
dchukkapalli-dev 413c38dbcb fix(asar): prevent path traversal (zip-slip) during extraction
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>
2026-07-13 19:59:06 +00:00
kitbyte 3b776c52fc fix: bump version to 1.0.9.3 and update changelog with recent fixes 1.0.9.3 2026-07-04 11:36:51 +03:00
k1tbyte 9c88caf49b Update CHANGELOG for version 1.0.9.2
Updated changelog to reflect changes in version 1.0.9.2, including removal of downloadable .exe files and the built-in updater.
2026-06-28 20:14:43 +03:00
kitbyte 537608c381 fix: update version to 1.0.9.2, remove updater functionality, and adjust bug report template 1.0.9.2 2026-06-28 13:20:36 +03:00
kitbyte b0279ee812 docs: update README with important notices and instructions for building executables, disable auto updates 2026-06-28 12:58:43 +03:00
kitbyte c007e11cce refactor(build): remove self-signing code from build script and update release notes process 2026-06-28 12:08:19 +03:00
kitbyte a7f0eae670 fix: Assignment to constant variable error in the enhancer patcher, bump version to 1.0.9.1 1.0.9.1 2026-06-24 22:13:57 +03:00
k1tbyte 1c9a8fb780 Merge pull request #110 from Kava-4/fix/pro-account-reducer-guard
fix(pro): guard ACTION_SET_ACCOUNT reducer against subscription loss
2026-06-24 21:52:36 +03:00
kava4 ec07dc63f0 fix(pro): guard ACTION_SET_ACCOUNT reducer against subscription loss
Periodic refreshAccount and other store writes could replace the account without subscription, causing Pro to drop after a day or two (#106).
2026-06-24 18:00:42 +03:00
kitbyte 88556ec70f feat(funding): add funding options to README and create FUNDING.yml 2026-06-16 18:00:18 +03:00
kitbyte c02bad919d fix(build): use CMake default VS generator instead of a derived name
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.
1.0.9.0
2026-06-15 01:08:16 +03:00
kitbyte b9faf80f86 fix(build): resolve Visual Studio version-agnostically
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.
2026-06-15 00:54:43 +03:00
kitbyte 6395ca3a27 release: 1.0.9.0 — panel i18n + self-signed build signing
- 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.
2026-06-15 00:49:47 +03:00
kitbyte 4ce47dc6d2 feat(web-panel): multi-locale i18n with selector + browser autodetect
- 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.
2026-06-15 00:49:47 +03:00
kitbyte 8c6d87671c Merge origin/master: cheat i18n already ported into refactored structure (-s ours) 2026-06-15 00:10:59 +03:00
kitbyte a0b3968d33 refactor(web-panel): update architecture + cheat i18n
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).
2026-06-15 00:10:49 +03:00
k1tbyte 6906a67a2e Merge pull request #98 from YifePlayte/master
feat: initial i18n support for cheat information strings in remote web panel
2026-06-14 22:18:42 +03:00
YifePlayte 37ce6b3f4a feat: initial i18n support for cheat information in remote web panel 2026-06-15 00:33:41 +08:00
kitbyte 8756e41fb9 feat: bump version to 1.0.8.4 - fix QR code pairing and post-update hang 2026-06-10 17:07:04 +03:00
kitbyte 544b9f0fb0 feat: update changelog for version 1.0.8.3, enhance Pro activation handling, minor fixes and improve renderer script management 1.0.8.3 2026-06-06 10:56:29 +03:00
kitbyte a4f3a57f97 feat: revert patch config regex, update changelog for version 1.0.8.2 1.0.8.2 2026-05-15 19:43:48 +03:00
kitbyte 1f5ba9fc95 patch: fix a syntax error in the Disable Updates, websocket connection wouldn't automatically reconnect, ui rerender optimizations
bump version to 1.0.8.1
1.0.8.1
2026-05-15 14:46:04 +03:00
kitbyte 710d014e6d fix build script 1.0.8.0 2026-05-06 13:30:17 +03:00
kitbyte a810e5b549 Merge remote-tracking branch 'origin/master' 2026-05-06 13:07:24 +03:00
kitbyte 13759b1db6 feat: ship 1.0.8.0 release automation and runtime overhaul
- 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
2026-05-06 13:07:09 +03:00
kitbyte 3b2f373946 feat(web-panel): Add ipc-logger script to intercept WeMod Electron IPC traffic 2026-05-02 11:39:54 +03:00
k1tbyte f78f9609b5 Add VirusTotal badge to README 2026-05-01 23:27:10 +03:00
k1tbyte 633984ed3b Add GitLab mirror badge to README
Added a GitLab mirror badge to the README.
2026-05-01 22:57:12 +03:00
kitbyte fa753b4a34 Release 1.0.7.0: Remote Web Panel & Stability Fixes 1.0.7.0 2026-05-01 22:39:15 +03:00
kitbyte 5273930eef refactor: rebrand project to WandEnhancer 2026-03-30 21:39:06 +03:00
kitbyte 9a5d3799bf bump version to 1.0.6.0 1.0.6.0 2025-12-14 18:58:17 +02:00
kitbyte d02b84a414 feat: implement localization support and add language settings 2025-12-14 18:57:30 +02:00
kitbyte a943b91f5f feat: add support for DevTools hotkey, fix patching logic 2025-12-14 18:52:53 +02:00