Extension System Merge - #249
Merged
Merged
Conversation
* 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>
* 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>
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>
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: |
…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>
…into Extension-System
* 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
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>
Collaborator
|
yay! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
M12 Labs — Changelog | May 5, 2026
Major Changes
Extension System
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:
registry.jsonfrom the extensions repository.M12LabsExtensionpackage artifactExtensions are sandboxed. Package files may only install into:
app/Extensions/Packages/<extension-id>/...— backend PHP, controllers, routes, servicesresources/scripts/extensions/packages/<extension-id>/...— frontend React/TypeScript pagesAny package that attempts to write outside these paths is rejected by the panel.
What admins can do from the UI:
What contributors can do:
.M12LabsExtensionarchive, and updatesregistry.jsonautomaticallySee the full contributor guide: docs/creating-an-extension.md
PRs:
Wings-RS Support
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:
New capabilities unlocked by Calagopus Wings:
.zip,.7z, and.dduparchives 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 supportddup-bak,btrfs,zfs, andrestic;zipand7zsupport on the Wings driver; ability to browse backups directlycheck-file,copy-file,space-available,hardlink,fsync,lsetstat, and more.wingsCLI for basic server power actions over SSHbtrfs_subvolume,zfs_dataset,xfs_quota, orfuse_quota; inotify-based incremental disk checks to reduce full scan overheadSecurity hardening applied in this release:
script.runrestrictions, rate limiting, TLS hardening, and operation ID validationCustom Domain System (Cloudflare Integration)
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:
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:
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:
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:preloadErrorauto-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:
vite:preloadError— fixes blank screen after deploysFixes & Improvements
Billing
base × multiplierinstead of using the predefined cycle priceSecurity
Processing.tsxwith a UUID allowlist to prevent redirect abusehappy-dom(8.7.2 → 20.8.9) andvitest(0.28.5 → 1.6.0) to resolve 3 CVEsEmail System
EmailManagerwas missing the override lookup entirely.customformat for admin-customized email templatesDiscord SSO
/auth/discord/link-choiceroute inAuthenticationRouterCurrency
Code Quality
Contributors
Full Changelog
View all pull requests: https://github.com/macery12/M12Labs/pulls?q=is%3Apr+is%3Aclosed