refactor: deduplicate and consolidate extension install/update/uninstall system - #243
Merged
macery12 merged 1 commit intoApr 29, 2026
Conversation
- 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: macery12 <57544649+macery12@users.noreply.github.com>
Copilot created this pull request from a session on behalf of
macery12
April 28, 2026 07:03
View session
macery12
marked this pull request as ready for review
April 29, 2026 00:24
Merged
macery12
added a commit
that referenced
this pull request
May 6, 2026
* Add Extension Framework with Minecraft Player Manager (#110) * 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> * Fix order review JSX grouping and free-flow handling (#214) * bimbab fixes Co-Authored-By: bimbab189 <79527589+bimbab189@users.noreply.github.com> * add release-manifest generation system (#217) * chore: update release-manifest.json [skip ci] * Fix empty billing cycles save + NaN% display on free products (#218) * 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> * chore: update release-manifest.json [skip ci] * Reimplement JGuard (#219) * 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> * chore: update release-manifest.json [skip ci] * Fix Email verification links + 8 security issues (#220) * 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> * Add a completely modular system with on demand installs * Small mistake * Bug fix * feat: rename Allow User Registration to Allow Email Registration, remove 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 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> * fix: replace doc.write() with srcdoc for email template iframe preview (#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> * impliment email blade template editor (#224) * 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> * Implement .custom format for customized email templates (#225) * 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> * Fix Discord SSO registration & implement discord SSO linking to existing 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> * plan vite 5 upgrade + optimize build (#226) * 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> * Vite 4 → 5 upgrade + dependency audit with upgrade plans (#228) * 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> * Add manual email verification option (#229) * 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> * fix: update Everest store after jGuard settings save (#230) 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> * Add discord/link-choice route to AuthenticationRouter (#231) 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> * feat: add logout button to suspended user screen (#232) 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> * jGuard: Improve suspended message, remove immediate mode, polish disable 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> * fix: custom email templates never used on send — EmailManager had no 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> * New Version Inbound (Alpha) * New Version inbound (typo fix) * fix: resolve ReferenceError Icon is not defined in server routes (#237) 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> * Improve extension install flow + Add progress indicator (#238) * 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> * Add "Check for updates" button & update logic to update extensions (#241) * 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> * Extensions page: multi extension selection + unified progress indicator (#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> * refactor: clean up extension install/update/uninstall system (#243) - 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> * update Extension System progress UI for better clairity (#244) * 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> * Add vite:preloadError handler to entry point (#245) 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> * remove unused Docker configuration and update issue templates * cleanup documentation * fix: use predefined cycle price instead of base × multiplier in SubtotalCard (#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> * fix(security): guard open-redirect sinks in Processing.tsx with UUID 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> * merge * Fix All typescript errors (#246) * 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> * fix: run custom domain DNS cleanup before server cascade-delete (#247) 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> * Harden wings-RS security (#250) * 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> --------- Co-authored-by: bimbab189 <79527589+bimbab189@users.noreply.github.com> Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: bimbab189 <slenyslukas@gmail.com> Co-authored-by: root <root@testpanel.macery12.xyz>
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.
This pull request refactors the extension installation command to improve code reuse and maintainability by extracting the logic for resolving extension package sources into a shared trait. The main effect is to centralize and standardize how extension packages are resolved for both installation and update commands, reducing duplication and potential inconsistencies.
Key changes include:
Refactoring and Code Reuse
HandlesExtensionPackagesinapp/Console/Commands/Extensions/Concerns/HandlesExtensionPackages.php, which encapsulates all logic for resolving extension package sources, handling user prompts, debug output, and ownership reporting. This trait is designed to be shared between install and update commands.InstallExtensionCommandto use the newHandlesExtensionPackagestrait, removing the previously duplicated resolution logic from this command. The command now callsresolveResolutionfrom the trait instead of its own local method. [1] [2]Code Cleanup
resolveInstallResolution,resolveFileModeSelection,selectDiscoveredArtifact,createFileResolution,renderDebugResolution,renderDebugException,renderOwnershipReport, andisDebug) fromInstallExtensionCommand, as these are now provided by the trait.InstallExtensionCommandto remove the unused dependency onExtensionPackageArtifactService, since artifact handling is now encapsulated in the trait.These changes make the codebase more modular and easier to maintain, ensuring consistent behavior across extension-related commands.~540 lines of near-identical logic were duplicated across
InstallService,UpdateService, and the three command classes. This extracts the shared code into proper shared services and a command trait, and fixes two silent bugs found during the audit.Shared services introduced
ExtensionPackageArtifactService— promoted from private helpers to public API:downloadArchive(),verifyChecksum(),extractArchive(),readPackageManifest(),normalizeManifest(),assertCompatiblePanelVersions(),normalizeTargetPath(). Also now ownsPACKAGE_ARTIFACT_FILENAMEconstant (was duplicated in both install and update services).ExtensionPackageFileService—assertFilesUnmodified(),createRollbackSnapshot(),restoreRollbackSnapshot()extracted from uninstall/update services.Commands consolidated
HandlesExtensionPackagestrait absorbs what was ~270 lines of copy-pasted code inInstallExtensionCommandandUpdateExtensionCommand:resolveResolution()— repository vs. local-file mode selection with interactive fallbackrenderDebugResolution(),renderDebugException(),renderOwnershipReport(),isDebug()Result: both commands shrink from ~358 lines to 87 lines each.
Bug fixes
ExtensionPackageBatchServicefinallyblocks were not callingrepairStandardPaths()— root-run batch operations could leave paths with wrong ownership on failure.ExtensionInstallProgressServicematchdefaulted unrecognised actions toUNINSTALL_STAGESsilently. Now'uninstall'is an explicit arm and unknown actions throw\InvalidArgumentException.ExtensionOperationLockServiceblocked-message builder replaced 20-line repetitive match with a singlesprintf.Line count delta (modified files only)
ExtensionPackageInstallServiceExtensionPackageUpdateServiceExtensionPackageUninstallServiceInstallExtensionCommandUpdateExtensionCommandExtensionPackageArtifactService(expanded)ExtensionPackageFileServiceHandlesExtensionPackagestrait