Skip to content

Extension System Merge - #249

Merged
macery12 merged 46 commits into
developfrom
Extension-System
May 6, 2026
Merged

Extension System Merge#249
macery12 merged 46 commits into
developfrom
Extension-System

Conversation

@macery12

@macery12 macery12 commented May 4, 2026

Copy link
Copy Markdown
Owner

M12 Labs — Changelog | May 5, 2026

PRs Merged: 30+ | Files Changed: 417+ | Additions: 26,796 | Deletions: 2,139


Major Changes


Extension System

Originally developed from scratch by @bimbab189 — introduced in #110. Completed, refined, and merged into the panel in this release.

M12 Labs now ships with a complete Extension System — one of the largest features ever added to the panel. Extensions allow admins to install, update, and uninstall modular packages directly from the admin panel UI without touching the server manually.

How it works:

Extensions are self-contained installable packages hosted in the M12Labs-Extensions repository. Each extension includes a backend PHP layer, a frontend React/TypeScript layer, and a signed package manifest.

When an admin installs an extension:

  1. The panel reads the central registry.json from the extensions repository
  2. It downloads the selected .M12LabsExtension package artifact
  3. It verifies the archive SHA-256 checksum and every individual file checksum declared in the manifest
  4. It copies files into their sandboxed install paths inside the panel
  5. It rebuilds the panel frontend
  6. It records all installed files so uninstall can fully reverse the operation

Extensions are sandboxed. Package files may only install into:

  • app/Extensions/Packages/<extension-id>/... — backend PHP, controllers, routes, services
  • resources/scripts/extensions/packages/<extension-id>/... — frontend React/TypeScript pages

Any package that attempts to write outside these paths is rejected by the panel.

What admins can do from the UI:

  • Browse available extensions from the official registry
  • Install or uninstall individual extensions with a progress indicator
  • Select and act on multiple extensions at once
  • Check for updates and apply them with one click

What contributors can do:

  • Fork the M12Labs-Extensions repo, build an extension source tree, run the publisher tool, and open a PR
  • The publisher hashes all files, generates the package manifest, builds the .M12LabsExtension archive, and updates registry.json automatically
  • Extensions can also be installed or uninstalled manually via Artisan:
php artisan install <extension-id>
php artisan uninstall <extension-id> --force

See the full contributor guide: docs/creating-an-extension.md

PRs:

  • #110 — Add Extension Framework with Minecraft Player Manager (original implementation by @bimbab189)
  • #249 — Extension System Merge (46 commits, 417 files)
  • #244 — Updated Extension System progress UI for better clarity
  • #243 — Refactored and deduplicated the install/update/uninstall pipeline
  • #242 — Multi-extension selection + unified progress indicator
  • #241 — "Check for Updates" button with full update logic
  • #238 — Improved install flow with real-time progress feedback
  • #237 — Vite 5 compatibility fixes for extensions

Wings-RS Support

Initial Wings-RS integration developed by @bimbab189 in #110.

M12 Labs now supports Calagopus Wings — a complete rewrite of Pterodactyl Wings in the Rust programming language. It is 100% API compatible with the original Wings daemon while delivering substantially improved performance, lower resource usage, and a significant set of new capabilities.

Why Wings-RS?

The original Wings daemon is written in Go. Calagopus Wings rewrites the entire daemon in Rust, which brings:

  • Lower memory footprint and CPU overhead under load
  • Better concurrency handling for high-traffic nodes
  • More predictable performance under sustained use

New capabilities unlocked by Calagopus Wings:

Area What's New
File Manager Browse .zip, .7z, and .ddup archives directly; download directories on-the-fly as archives; multi-threaded compression and decompression; file search by name or content; pagination and sorting on directory listings; real folder size support
Backups Four new backup drivers: ddup-bak, btrfs, zfs, and restic; zip and 7z support on the Wings driver; ability to browse backups directly
SFTP Extended OpenSSH SFTP protocol support including check-file, copy-file, space-available, hardlink, fsync, lsetstat, and more
Shell Connect via SSH directly to server console; .wings CLI for basic server power actions over SSH
API New endpoints: node stats, remote Wings upgrade, custom async script execution, live permission updates, install abort, file fingerprints, and more
Disk Real disk quota support via btrfs_subvolume, zfs_dataset, xfs_quota, or fuse_quota; inotify-based incremental disk checks to reduce full scan overhead
Performance Configurable thread pools for file copy, search, compression, decompression, disk checks, and backups

Security hardening applied in this release:

  • #250 — RBAC enforcement on all endpoints, script.run restrictions, rate limiting, TLS hardening, and operation ID validation

Custom Domain System (Cloudflare Integration)

Custom domain system originally built by @bimbab189 in #110.

M12 Labs supports automatic Cloudflare DNS record management for custom domains assigned to servers. Admins can configure custom domains that are automatically provisioned as Cloudflare DNS records when a server is created.

This release ships a bug fix to the cleanup side of the system: when a server with a custom domain is deleted, the associated Cloudflare DNS records are now automatically removed. Previously, deleting a server would cascade-delete the server database records but leave Cloudflare DNS entries intact, requiring manual cleanup. The DNS cleanup now runs before the server cascade-delete to ensure complete removal.

PRs:

  • #247 — Fix orphaned Cloudflare DNS records on server delete — run DNS cleanup before cascade-delete

jGuard Reimplementation

jGuard is M12 Labs' registration control system. It has been fully reimplemented from the ground up this release.

jGuard gives admins control over what happens when a new user registers:

  • Approve mode — New registrations are held in a pending state until an admin manually approves them
  • Delay mode — New users are allowed to register but are placed in a delayed state before gaining full panel access, giving admins a window to review without fully blocking registration

This is a full rewrite — the previous implementation had sync bugs, a broken "immediate mode", and schema upgrade issues that caused incorrect default states. All of these have been resolved.

PRs:

  • #219 — Reimplement jGuard
  • #236 — Fix jguard_delay defaulting to wrong status on schema upgrade
  • #233 — Improve suspended message, remove immediate mode, polish UI
  • #232 — Add logout button to suspended user screen
  • #230 — Fix jGuard not syncing correctly on save/update

Vite 4 → 5 Migration

M12 Labs has upgraded from Vite 4 to Vite 5 — the first step in a broader milestone toward updating the panel to current dependency standards, including upcoming PHP version upgrades, Laravel version upgrades, and further frontend toolchain modernisation.

This migration included a full dependency audit, upgrade planning, and compatibility fixes across the codebase including the extension system. A vite:preloadError auto-reload handler was also added to eliminate the blank screen issue users previously experienced after a panel deploy when their browser held stale cached chunks.

PRs:

  • #228 — Vite 4 → 5 upgrade + full dependency audit
  • #245 — Auto-reload on vite:preloadError — fixes blank screen after deploys
  • #237 — Extensions: Vite 4 → 5 compatibility fix

Fixes & Improvements

Billing

  • #248 — Fixed billing order summary displaying incorrect cycle price — was calculating base × multiplier instead of using the predefined cycle price

Security

  • #239 — Guarded open-redirect sinks in Processing.tsx with a UUID allowlist to prevent redirect abuse
  • #220 — Fixed email verification links + patched 8 separate security issues
  • Updated happy-dom (8.7.2 → 20.8.9) and vitest (0.28.5 → 1.6.0) to resolve 3 CVEs

Email System

  • #234 — Fixed custom email templates never being used on send — EmailManager was missing the override lookup entirely
  • #225 — Implemented .custom format for admin-customized email templates
  • #224 — Implemented Blade email template editor in the admin panel
  • #223 — Implemented email template viewer in the admin panel
  • #222 — Fixed email footer support address — now pulls from the settings-configured reply-to address
  • #221 — Decoupled the email registration toggle from Discord SSO registration so they can be controlled independently
  • #229 — Added a manual email verification option for admins

Discord SSO

  • #227 — Fixed Discord SSO registration flow and implemented Discord account linking to existing panel accounts
  • #231 — Registered the missing /auth/discord/link-choice route in AuthenticationRouter

Currency

  • #233 — Re-added DKK (Danish Krone) currency support that was dropped in a prior refactor

Code Quality

  • #246 — Fixed all TypeScript errors across the codebase

Contributors

Contributor Contributions
@bimbab189 Primary author of the Extension System, Wings-RS integration, and Custom Domain system — all introduced in #110
@macery12 Additional Extension system development, completion & merge; jGuard rewrite; major feature testing and validation; Wings-RS security hardening; and all other changes in this release

Full Changelog

View all pull requests: https://github.com/macery12/M12Labs/pulls?q=is%3Apr+is%3Aclosed

bimbab189 and others added 30 commits March 25, 2026 15:32
* Adding a playermanager and an extensions module for future extensions(other games and stuff)

* Adding a playermanager and an extensions module for future extensions(other games and stuff)

* fixed a minor issue from coupon db migrations

* some more bug fixes

* bug fixes

* bug fixes

* bug fixes

* Final minecraft player manager update

* MC player manager v1.0.1 yay

* Items now properly render, enchants are listed properly, armor now shows up

* mod support, and minor fixes

* Better?

* Minor player manager extension changes

* some more fixes for the extensions/extension module permission changes

* fix git typo

* merge newer networking fixes

* DiscordSrv helper extension, extension module improvements, server resource rendering bug fix

* fixes

* fork bugfix

* DiscordSrv helper small ui change

* floating windows: use theme colors for background and editor

* Floating Windows yippe, extensions are bugged pls fix

* idk

* Custom domains yippe

* Custom Domains support for Cname and srv records with multiple cf api keys, script that restarts services everytime you build the panel

* Custom domain bug fixes

* Small bug fix

* Final custom domain fixes

* Custom Domains now can be limited and show up in user billing

* fixes

* Unfinished wings-rs implementation,works overall only ssh activity logging is missing both in the panel and wings, minor bug found in custom domains not patched yet

* Minor activity changes

* Fixing stuff

* Fixing stuff

---------

Co-authored-by: macery12 <macen.elliott@gmail.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
Co-Authored-By: bimbab189 <79527589+bimbab189@users.noreply.github.com>
* feat: enforce default billing cycle and reseed on settings change

- Fix BillingCycleService::validateBillingCycle() to reject billing days
  that do not match the global default when a product has no custom cycles,
  eliminating the 1-365 day open door for products without configured cycles
- Add BillingCycleService::reseedDefaultBillingCycle() which, when the admin
  changes the default_billing_days setting, updates products that have exactly
  one billing cycle matching the old default to the new default, preserving all
  manually configured multi-cycle products unchanged
- Inject BillingCycleService into BillingValidationService and call
  validateBillingCycle() inside calculatePriceWithCoupon() for new-order flows
  (orderType != 'ren'), covering Stripe, Mollie, PayPal, and free checkout
- Hook reseedDefaultBillingCycle() into BillingController::settings() when the
  renewal:default_billing_days key is saved; the old value is captured before
  persisting so that the reseed knows which products to update
- Update BillingValidationServiceTest to supply the new BillingCycleService mock
- Add BillingCycleServiceTest with 7 unit tests covering both the validation
  enforcement and the no-op early-return of reseed

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/d38de8c9-1581-44bc-93ad-b2a5014fc57d

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* perf: use eager loading in reseedDefaultBillingCycle to avoid N+1 queries

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/d38de8c9-1581-44bc-93ad-b2a5014fc57d

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: return default billing cycle in getAllCycles when no custom cycles configured

When a product has no billing cycles in the database, getAllCycles() was
returning an empty array, causing the admin server billing UI to display
"No billing cycles configured. Please configure billing cycles first."

Apply the same fallback already present in getAvailableCycles(): return a
synthetic entry for the global default_billing_days setting value so the
endpoint always returns at least one selectable option.

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/ebd16b1b-88c8-4952-a986-cf91f5b1e94e

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: always sync billing cycles on update and filter synthetic defaults on load

- Filter out synthetic default entries (no id) from getBillingCycles response so
  virtual fallbacks don't get saved as real DB rows when a product is saved
- Always call syncBillingCycles on product update regardless of cycle count so
  deleting all cycles (empty array) properly removes them from the database

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/6db647a0-587c-4f5b-aa81-985a26d20466

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: allow empty cycles array in SyncBillingCyclesRequest

Change 'required' to 'present' so saving a product with no billing cycles
no longer fails validation. An empty array correctly clears all custom cycles
and the service falls back to the global default billing days.

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/4e819767-6006-4c25-9068-dcfb503c4acc

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: NaN% for free products + remove debug logs from billing cycle code

- Guard getDiscountPercent against division-by-zero when basePrice is 0
  (free products displayed NaN% premium/discount label)
- Remove console.log debug calls from billingCycles.ts API client
- Remove \Log::info debug calls from BillingCycleController
- Remove unused getMultiplierRanges export, MultiplierRanges interface,
  and the corresponding unused import in ProductForm.tsx

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/f88b8957-324a-4a89-a72a-f7041188dbea

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
* feat: implement jGuard admin-controlled registration service

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/1e58dd75-81ed-4f56-868c-3d72b5d37900

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* chore: improve pending table column header clarity

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/1e58dd75-81ed-4f56-868c-3d72b5d37900

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: jGuard settings use local state, add time remaining to pending table

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/ffb1e7d5-601b-41c2-a81e-1956e547aae1

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* feat: webhook on jGuard pending registration with approval mode/time info

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/4934a11e-557d-4027-9997-9a01c5ba544c

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* feat: webhook on jGuard pending registration with approval mode/time info

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/4934a11e-557d-4027-9997-9a01c5ba544c

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* style: simplify verbose comments across jGuard changes

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/0d1d9d07-144a-44dc-8198-d9f9ebf29c12

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: show pending approval screen immediately after jGuard registration/SSO

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/54c86c1e-18f6-42f4-8737-b96a02f3f200

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* Changes before error encountered

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/8d46cd6c-7fbc-4441-9102-f2b2f665437f

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* revert: go back to 2fe2a8d state + logout with alert on pending registration

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/b9be2897-7031-46ad-a8a7-8d083666fb17

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
* fix: use relative signed URL for email verification to prevent 403 on HTTPS

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/94bd0399-aa08-483d-a68a-4013e61a314e

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: robustly join app URL and signed path with single slash

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/94bd0399-aa08-483d-a68a-4013e61a314e

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* security: fix email verification and password reset abuse vectors

- Fix #1 (critical): recovery-code verify used password_verify() on an
  encrypted (not hashed) value, making the flow always fail. Replace with
  Crypt::decryptString() + hash_equals() for a correct, timing-safe check.

- Fix #2 (critical): UserUpdateService::handle() now nulls email_verified_at
  when the email address changes, preventing the verification bypass where a
  user could change to an unowned address and keep their verified status.

- Fix #3 (medium): add throttle:6,1 to GET /email/verify/{id}/{hash} to
  prevent automated replay of captured verification links.

- Fix #4 (medium): add throttle:password-reset-ip + throttle:password-reset-email
  to the legacy POST /password/reset (ResetPasswordController) route, which
  previously had no rate limiting.

- Fix #5 (medium): add throttle:10,1 to GET /password-reset/method to
  prevent high-frequency probing of the system's reset configuration.

- Fix #6 (medium): rotate the recovery code (generate + persist a fresh
  Crypt::encryptString value) immediately after a successful recovery-code
  reset so the code cannot be replayed.

- Fix #8 (low): upgrade email hash in verification URL from SHA-1 to SHA-256
  in both EmailVerificationService (link generation) and VerifyEmailController
  (link validation).

- Fix #9 (low): replace url() helper in PasswordResetService::sendResetLink()
  with config('app.url') concatenation to produce correct HTTPS links when
  the panel is behind a TLS-terminating proxy.

- Harden verify(): add full input validation (email, code, password/confirmed
  with Password::min rules) that was missing from the recovery-code path.

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/64163633-adf0-4f34-a66d-bdc6112d43f6

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
…ove OAuth warning (#221)

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/beb5b451-46cc-4b39-a989-e43a8785398f

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
* fix: read support email in footer from settings reply_to/from_email instead of hardcoded config

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/ba03eb79-8a68-4cec-94ec-9f907a5e089e

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: pass resolved replyTo into view data so footer reads correct support email

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/8338a677-9a07-4767-a8b1-4bba1f8f5894

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
#223)

* feat: add email template viewer to admin email section

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/61c69990-a92b-4b6c-993b-3fefd8199443

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* chore: address code review comments - document iframe sandbox intent

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/61c69990-a92b-4b6c-993b-3fefd8199443

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: use srcdoc for iframe preview and add CSP header to backend

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/240bd7bb-d93d-4bd4-a2de-c1afde803db6

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix

* Fix email footer support address to use settings-driven reply-to (#222)

* fix: read support email in footer from settings reply_to/from_email instead of hardcoded config

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/ba03eb79-8a68-4cec-94ec-9f907a5e089e

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: pass resolved replyTo into view data so footer reads correct support email

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/8338a677-9a07-4767-a8b1-4bba1f8f5894

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
Co-authored-by: macery12 <macen.elliott@gmail.com>
* Add email template editor with source editing, variable docs, and preview

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/07c6b71a-5785-49b1-992c-90e832058168

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* Address review feedback: consolidate duplicate buttons, fix backup error handling

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/07c6b71a-5785-49b1-992c-90e832058168

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* Redesign template editor: 3-panel layout, view mode toggles, auto-load source

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/5c8c2870-d8d6-452a-9f35-e834bbb2e068

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* Fix split view: change editor/preview ratio to 50/50

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/47325f56-343f-4e09-846d-ae22af70f3f1

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* test layout

* Fix editor/preview layout: fixed height container so panes scroll independently

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/577aed83-640e-4a8e-adbc-a5ce878a28fe

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* Fix preview cutoff: use flex grow/shrink ratios instead of percentage basis

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/a4d33c57-3bc1-4547-9247-2865bbc7bab6

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* Remove Discard button; adjust editor/preview split to 30/70

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/36f8ca18-9d66-4ca4-b3f2-dada38f36ed6

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
Co-authored-by: macery12 <macen.elliott@gmail.com>
* feat: add custom blade email override support to template editor

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/3f6c6ea6-b85e-492f-8c05-faf6578a6e0e

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: address code review feedback on custom template override

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/3f6c6ea6-b85e-492f-8c05-faf6578a6e0e

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: use dedicated request class for template revert to avoid 422 error

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/b27bf79d-78de-4782-9c38-e9fc314e5c5b

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
…ing accounts (#227)

* Add Discord SSO password validation, link-choice page, and account linking

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/b14f53eb-e922-4893-a255-c31c068add42

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* Fix review issues: remove duplicate Values interface and console.error

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/b14f53eb-e922-4893-a255-c31c068add42

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* Fix handleReset crash on link-choice page and constrain Discord card width

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/3f9aa29c-5746-4ac7-a8a8-1049c0c9cb69

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* Fix Discord SSO registration password confirmation validation

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/5518a589-3682-477c-bddc-0c1ef6dbec9b

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
* perf: split vendor chunks, fix heroicons wildcard imports, lazy-load preset and auth sub-routes

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/31f1976a-c1a1-4dc3-9763-c7bcc19afe51

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* perf: split vendor-editor chunk from 1683kB into on-demand pieces; largest editor chunk is now 287kB

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/99d78601-a5d9-47e0-9ef7-d9647e71cadd

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* update pnpm lock

* fix: merge @FortAwesome into vendor-react chunk to fix forwardRef crash at init time

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/c7b99343-16f9-40f4-b46a-a236b5068bb3

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: merge @codemirror/view into vendor-editor-core to fix TDZ crash at init time

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/3b9a04e8-ded8-4823-9d13-a51ed89a9837

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* docs: add VITE5_UPGRADE.md with phased migration guide

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/5341b90d-19da-49f4-be2e-1a7b9583d8c8

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
Co-authored-by: root <root@testpanel.macery12.xyz>
* chore: upgrade Vite 4 to Vite 5 with companion package upgrades

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/d6619c9e-371a-4bdf-a08e-2b059f9bf821

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: upgrade happy-dom to 20.8.9 to patch three security vulnerabilities

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/d6619c9e-371a-4bdf-a08e-2b059f9bf821

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* docs: add package audit and upgrade plan documents

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/88af3728-0f25-441d-9e17-c0d822ca50a7

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
* feat: add admin manual email verification in user settings

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/894429db-0234-4f1d-84cc-0ec1ef27341d

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: address code review feedback on email verification

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/894429db-0234-4f1d-84cc-0ec1ef27341d

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: use Button.Warn for unverify email to distinguish from verify

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/65c05364-3f84-4a11-b913-182d18eddf49

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/bb51bcc0-1f5f-4f41-8cae-ee2d38321c5e

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/25ee3d6d-6b8d-485e-8ae9-783c8595b093

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/f4dc922b-7ea3-424c-b4e7-9962e4177bc1

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
…ble button, Re-Add DKK currency (#233)

* feat: Improve JGuard user-facing messaging and error presentation

- Add configurable pending_message to JGuard settings (backend + frontend)
- Replace browser alert popups with styled ScreenBlock error pages
- Replace plain suspended div with branded ScreenBlock component
- Remove window.alert from RegisterContainer and DiscordRegistrationContainer
- Expose pending_message via EverestComposer and SettingsServiceProvider

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/46f18eeb-6737-4350-b428-01007c05461c

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: match textarea background to Input style, remove immediate approval mode

- Replace raw <textarea> with Textarea styled component from @/elements/Input
  so the pending message field matches the Activation Delay input styling
- Remove 'immediate' approval mode from Select, Alert block, type unions,
  backend validation, and config comment across all affected files

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/666e81b9-48dc-4044-85f0-ba72892807ac

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* style: give Disable jGuard module button a proper outlined red appearance

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/de2d7874-c770-4a71-9b93-9f704960eb51

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* merge: resolve conflicts with origin/main

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/121baaea-5439-48d4-82e9-617f2505b570

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: revert bad main merge, keep DKK, add logout button to suspended screen

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/fa82fb83-8f72-453c-abfe-33c4f3a69da0

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
…override lookup (#234)

* fix: use custom email template overrides when sending emails

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/40c694b0-8651-474c-8fea-25f3f844f020

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: guard renderViewWithCustomOverride against path traversal

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/40c694b0-8651-474c-8fea-25f3f844f020

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: clear PHP stat cache in custom email template read/write paths

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/d2901688-17e3-442a-aa89-313d8a63b789

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: tighten regex to reject consecutive dots in view path guard

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/d2901688-17e3-442a-aa89-313d8a63b789

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* revert: remove clearstatcache additions from previous session

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/cded546c-c8e1-4d7d-b0f4-268988edae66

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/631dc42f-034f-4250-b38b-629392408275

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
Copilot AI and others added 9 commits April 26, 2026 00:38
* feat: add install step tracking and fix 20s timeout for extension installs

- Increase HTTP request timeout for installExtension and uninstallExtension
  from the default 20s to 5 minutes (300000ms), preventing premature timeout
  failures on slower systems
- Add PackageStep type system (install: queued→downloading→installing→
  registering→finalizing→completed/failed; uninstall: queued→removing→
  rebuilding→finalizing→completed/failed)
- Display real-time progress indicator inside each CatalogCard during
  install/uninstall with step dots, active step label, spinner, and
  success/failure icons
- Auto-advance steps via time-based schedule using clearable timeouts
- Clean up all pending timeouts on component unmount

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/90623781-ec9d-4b33-92b1-22578aaa701e

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* refactor: address code review feedback on step indicator

- Extract magic number 6000 to COMPLETION_DISPLAY_DURATION constant
- Replace Infinity sentinel with explicit sequence.length comparison

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/90623781-ec9d-4b33-92b1-22578aaa701e

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* feat: replace timer-based stage guessing with real backend-driven install progress

Backend:
- Add ExtensionInstallProgressService: Cache-backed progress tracker that stores
  the current stage (action, extension_id, stage, updated_at) during operations
- Instrument ExtensionPackageInstallService with real stage reports:
  downloading → extracting → validating → copying → optimizing → building →
  registering → completed; clears on completion or failure
- Instrument ExtensionPackageUninstallService with real stage reports:
  validating → removing → optimizing → building → registering → completed
- Add GET /api/application/extensions/progress endpoint that returns current
  stage for frontend polling
- Register route in api-application.php

Frontend:
- Add InstallProgress interface and getInstallProgress() API function
- Remove all timer-based step scheduling (INSTALL_STEP_DELAYS, UNINSTALL_STEP_DELAYS,
  stepTimeoutsRef, startPackageProgress())
- Replace with setInterval polling (every 1.5s) of the /progress endpoint while
  an operation is running; stop polling when the main request resolves
- Add activeActionType state to track install vs uninstall for step sequence after
  activePackageAction is cleared
- Update step sequences to match real backend stages including extracting,
  optimizing, building, and copying

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/f5fe00cb-3660-4b3a-bcfd-6769fb302772

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* refactor: address code review feedback on install progress polling

- Filter polled progress by extension.id to prevent cross-extension state
  leakage when multiple operations are being tracked
- Extract step sequence into a single variable before the map to avoid
  computing the same expression twice

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/f5fe00cb-3660-4b3a-bcfd-6769fb302772

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: progress endpoint returns null because optimize:clear wipes cache

Root cause: rebuild() runs `php artisan optimize:clear` as its first
sub-command, which calls cache:clear and deletes the progress key. During
the subsequent pnpm build (which can take 5-30 minutes), GET /progress
returned null because the Cache store was empty.

Fix:
1. Rewrite ExtensionInstallProgressService to store progress in a JSON
   file at storage/app/extensions/.progress.json instead of Cache. This
   path is never touched by optimize:clear, cache:clear, or any artisan
   command, so progress survives the full rebuild pipeline.

2. Add optional $onCommandStart callback to rebuild() so callers can
   report stages at the precise moment before each sub-command runs.
   This means 'optimizing' is written to the file BEFORE optimize:clear
   runs (and would overwrite it if we were still using Cache), and
   'building' is written AFTER optimize:clear but BEFORE pnpm build.

3. Update ExtensionPackageInstallService and ExtensionPackageUninstallService
   to use the new callback pattern instead of two pre-rebuild report() calls.

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/1fa76618-6155-4f83-8a6c-8ac3475c4127

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* refactor: improve ExtensionInstallProgressService

- Extract progressFilePath() helper; replace all three inline storage_path() calls
- Validate $stage against INSTALL_STAGES / UNINSTALL_STAGES in report(); throw InvalidArgumentException on bad input
- Atomic write in report(): write to .tmp file then rename() into place
- Carry started_at timestamp forward across report() calls; set on first call
- Simplify clear(): remove redundant File::exists() guard before File::delete()

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/e70dc2f6-ec05-47c0-ade4-0bdd1967ef81

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* feat: validate build workspace ownership before rebuild step

- Add 'ownership' stage to INSTALL_STAGES and UNINSTALL_STAGES
- Add validateBuildWorkspaceOwnership() to ExtensionFilesystemOwnershipService:
  checks base_path(), vendor/, node_modules/, public/build/, runtime-home;
  auto-repairs when running as root, throws clear DisplayException otherwise
- Report 'ownership' stage + run validation in install and uninstall services
  before rebuild() is called so ownership problems surface early

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/8a7bad89-98ae-4b50-96a3-0fe0576f1767

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* feat: show 'Permission check' stage in extension progress UI

Add 'ownership' to PackageStep union, INSTALL_STEP_SEQUENCE (after
'copying'), UNINSTALL_STEP_SEQUENCE (after 'removing'), and
STEP_LABELS with label 'Permission check'.

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/a96b0f01-17b1-4154-bb9d-e9077b9be97f

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: remove 'ownership' stage, merge permission check into 'building', fix public/build EACCES

- Remove 'ownership' PackageStep from CatalogCard.tsx (union, sequences, labels)
- Remove 'ownership' from INSTALL_STAGES/UNINSTALL_STAGES in ExtensionInstallProgressService
- Remove report('ownership') + validateBuildWorkspaceOwnership() from install/uninstall services
- Inject ExtensionFilesystemOwnershipService into ExtensionPanelRebuildService and call
  validateBuildWorkspaceOwnership() just before the pnpm/npm command (index 1), after
  the 'building' stage is reported — so the check runs silently under "Building panel"
- Fix validateBuildWorkspaceOwnership(): remove root-uid skip that caused EACCES on
  public/build/assets to go undetected; use is_writable() for non-root check so
  root-owned files from previous root-run builds are caught; add public/build/assets
  to candidates list

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/41ce758d-c847-4314-a0f9-c4d32dd2320d

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
)

* feat: add extension package update support (backend + Artisan command + UI button)

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/ec943876-0370-4df1-84c0-496c87d8548d

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: initialize resolution as array to prevent null access in UpdateExtensionCommand finally block

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/ec943876-0370-4df1-84c0-496c87d8548d

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* feat: add Check for Updates button that force-refreshes all repo manifests

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/bb50aa09-4be8-4f4b-aeaa-be16b2cf6318

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
…or (#242)

* feat: multi-select batch extension operations (install, uninstall, update)

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/df889ac0-a4d3-4cbf-b922-a24b0d36ce5c

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: address code review feedback on batch extension operations

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/df889ac0-a4d3-4cbf-b922-a24b0d36ce5c

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* feat: unified persistent extension operation progress banner

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/c235cf1c-c059-4e55-bba3-23414fa57f28

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: remove extra whitespace in batch extension sub-label

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/c235cf1c-c059-4e55-bba3-23414fa57f28

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* feat: silent refresh of extension list after all operations complete

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/a40cdeb5-e570-469e-8fc9-dba8279055ef

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* feat: batch enable/disable for selected extensions

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/776712c0-08d6-4d85-b000-f612e7977c7a

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* refactor: use Promise.allSettled for batch enable/disable with partial failure reporting

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/776712c0-08d6-4d85-b000-f612e7977c7a

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
- Extract shared archive helpers into ExtensionPackageArtifactService
- Create ExtensionPackageFileService for snapshot/validation helpers
- Simplify Install/Update/UninstallService by injecting shared services
- Create HandlesExtensionPackages trait for commands
- Slim Install/Update/UninstallExtensionCommand via shared trait
- Fix batch service finally blocks to repair ownership per extension
- Fix ExtensionInstallProgressService: explicit uninstall arm + throw on unknown
- Simplify ExtensionOperationLockService blocked message builder

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/ae2f180c-c7a2-4741-a6e9-967921fe1477

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
* refactor: show per-extension list with step dots for batch operations

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/7992716b-8cf5-47ea-86c4-42992fcd0445

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* chore: remove unused primary prop from StepDots interface

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/7992716b-8cf5-47ea-86c4-42992fcd0445

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: remove line-through on done extensions; block new operations when one is running

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/69e6d2ce-93fc-4e10-bb03-d40b44ab2e3c

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* refactor: flatten nested ternary in packageActionNotice (CatalogCard)

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/69e6d2ce-93fc-4e10-bb03-d40b44ab2e3c

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/ccc9f99d-2645-49cd-909d-4465ba0cd88b

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
…talCard (#248)

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/0317626f-604e-44bc-8000-7bff88822e18

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
@macery12

macery12 commented May 4, 2026

Copy link
Copy Markdown
Owner Author

@copilot resolve the merge conflicts in this pull request, Extension-System into develop branch

…sion for all conflicts)

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

Copilot AI commented May 4, 2026

Copy link
Copy Markdown

@copilot resolve the merge conflicts in this pull request, Extension-System into develop branch

Done — resolved all merge conflicts (migration default, admin routes, server routes, vite config, and TODO.md) by keeping the Extension-System version for everything. Develop-only additions (upgrade docs, helpers test, Processing.tsx security patch) were also dropped. Merge commit: e578b0f.

Copilot AI and others added 5 commits May 4, 2026 00:57
…allowlist (#239)

* Initial plan

* fix: validate server UUID before open redirect in Processing.tsx (security)

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/efbd7d70-1eac-452b-ae5c-7ff43b26b687

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
* chore: upgrade TypeScript to 5.x, run prettier formatting

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/4f544466-349c-41e5-a5b1-26507bfbdab8

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: resolve TypeScript errors across account and admin scripts

- billing/models.d.ts: add allowEggChanges to Product interface
- billing/transformers.ts: add allowPlanChanges to toCategory
- modpacks.ts: remove unused CurseForgeModpack import (TS6133)
- getEgg.ts: uncomment configFrom, copyScriptFrom, scriptIsPrivileged in Egg interface
- server/index.ts: add 'offline' to ServerStatus union type
- AccountApiContainer.tsx, CredentialsContainer.tsx: fix import path from @definitions/user to @definitions/account
- AccountOverviewContainer.tsx, EmailVerificationGate.tsx, EmailVerificationNotice.tsx, DashboardRouter.tsx: fix email.resend?.enabled access on boolean|object union type
- AlertHistoryModal.tsx: remove unused getTypeColor function (TS6133)
- DashboardAlert.tsx, ScopedAlert.tsx: cast position as string for 'notification' comparison (TS2367)
- DashboardRouter.tsx: prefix unused refreshUser with _ (TS6133)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: resolve TypeScript errors across 10 billing/donation/modpack files

- CheckoutPaymentContainer: add non-null assertion and optional chaining for checkoutState
- OrderContainer: add missing imports (PaymentMethodSelector, Stripe, StripeIntent,
  getStripeIntent, getStripeKey, processUnpaidOrder, loadStripeOnce), add intent/stripe state,
  remove unused Input/Select imports, prefix/remove unused declarations, fix array index access
- PaymentMethodSelector: use 'as const' for PaymentMethod literals, remove unused @ts-expect-error
- PaymentContainer (server): use 'as const' for PaymentMethod literals, remove unused @ts-expect-error
- Processing: add payment_status? to MolliePaymentStatus interface
- OrdersContainer: remove unused faSearch import
- DonationHistoryContainer: remove unused React import
- DonationPaymentForm: remove unused React import and unused colors destructuring
- ModpackList: add non-null assertion for array index accesses
- ModpackInstallModal: remove invalid 'large' prop from Modal
- products.ts: add label? to BillingCycle interface

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* Fix TypeScript errors in 11 admin component files

- Remove unused variables (AdminIndicators, NewServerContainer, ServerBillingContainer)
- Add Formik<Values> type param to fix onSubmit type mismatch (CreateAllocationForm)
- Use WithRelationships<Egg,'variables'> instead of LoadedEgg (ServerConfigurationContainer, ServerStartupContainer)
- Fix threads null coalescing (ServerConfigurationContainer)
- Use useFlash() directly for addFlash (ServerOverviewContainer)
- Fix camelCase billing cycle props: isDefault, discountPercent (EditServerBillingDialog, EditServerBillingModal)
- Fix possibly-undefined array access with ! (EditServerBillingDialog, EditServerBillingModal)
- Fix type mismatch: compare c.id instead of c.uuid to product.categoryUuid (EditServerBillingModal)
- Fix pages[page]! non-null assertion (EditServerBillingModal)
- Fix catch block variables and allocation id access (TransferServerBox)
- Fix Dialog.Icon type loading->info (NetworkingBox)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: resolve TypeScript errors across account, billing, and admin files

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/4f544466-349c-41e5-a5b1-26507bfbdab8

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* chore: remove leftover patch artifacts (already merged)

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/e8b594da-506b-4752-9371-ffbe58793e81

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* Fix TS6133/TS6192/TS6198 unused import and variable errors

Remove unused imports and variables across 27 files to resolve
TypeScript TS6133 (unused declaration), TS6192 (all imports unused),
and TS6198 (all destructured elements unused) errors.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* Fix TypeScript errors across multiple files

- SelectField.tsx: Update react-select v4→v5 types (IndicatorsContainerProps,
  ClearIndicatorProps, DropdownIndicatorProps, IndicatorSeparatorProps,
  MenuListProps, OnChangeValue), rename unused props params to _props,
  fix menuPortal signature to use any for v5 PortalStyleArgs
- everest.ts: Add bottom-right/bottom-left to AlertPosition, add title
  to alert type, add captcha (with site_key/secret_key) to auth, add
  immediate to jguard approval_mode, add spiget_enabled to mods,
  add extensions property, add suspension_threshold_percentage/
  min_suspension_threshold_days/max_suspension_threshold_days to renewal
- settings.ts: Add translations property to SiteSettings
- server/models.d.ts: Add modsEnabled to Server interface
- account/billing/models.d.ts: Add basePrice to Product interface
- useFlash.ts: Add addFlash to KeyedFlashStore interface and implementation
- modpacks.ts: Add gameVersion and modLoaderType to ModpackSearchParams
- account/billing/products.ts: Re-export Product type

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: resolve TypeScript errors - reduce from 16,546 to 58 remaining errors

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/ea5523a7-2681-4e54-9a20-b4d5b6afbf37

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* Changes before error encountered

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/fd5b565d-3b43-43a8-b95c-7d3549c9d824

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: resolve all TypeScript errors - 0 errors remaining

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/1ec1d53a-aae9-45bd-afd4-3175ec61a749

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/044232b6-0b10-4a99-be7c-8190643f32ae

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
@macery12
macery12 marked this pull request as ready for review May 5, 2026 03:45
* security: harden Wings-RS endpoints — RBAC, upgrade, script.run, rate limits, TLS, opId validation

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* fix: update happy-dom 8.7.2 → ^20.8.9 and vitest 0.28.5 → ^1.6.0 to fix 3 CVEs

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/58d6dc65-a98e-49b6-8916-1b503714d55a

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

* revert: restore guzzle verify to environment('production') check, remove GUZZLE_VERIFY config key

Agent-Logs-Url: https://github.com/macery12/M12Labs/sessions/cf876f9d-b3ed-4ed6-9865-30f7e2e1eeb9

Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: macery12 <57544649+macery12@users.noreply.github.com>
Co-authored-by: macery12 <macen.elliott@gmail.com>
@macery12
macery12 merged commit b5ebf8c into develop May 6, 2026
@macery12
macery12 deleted the Extension-System branch May 14, 2026 02:59
@bimbab189

Copy link
Copy Markdown
Collaborator

yay!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants