Skip to content

refactor: deduplicate and consolidate extension install/update/uninstall system - #243

Merged
macery12 merged 1 commit into
Extension-Systemfrom
copilot/audit-extension-install-uninstall-update
Apr 29, 2026
Merged

refactor: deduplicate and consolidate extension install/update/uninstall system#243
macery12 merged 1 commit into
Extension-Systemfrom
copilot/audit-extension-install-uninstall-update

Conversation

Copilot AI commented Apr 28, 2026

Copy link
Copy Markdown

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

  • Introduced a new trait HandlesExtensionPackages in app/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.
  • Updated InstallExtensionCommand to use the new HandlesExtensionPackages trait, removing the previously duplicated resolution logic from this command. The command now calls resolveResolution from the trait instead of its own local method. [1] [2]

Code Cleanup

  • Removed the now-redundant private methods (resolveInstallResolution, resolveFileModeSelection, selectDiscoveredArtifact, createFileResolution, renderDebugResolution, renderDebugException, renderOwnershipReport, and isDebug) from InstallExtensionCommand, as these are now provided by the trait.
  • Updated the constructor for InstallExtensionCommand to remove the unused dependency on ExtensionPackageArtifactService, 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 owns PACKAGE_ARTIFACT_FILENAME constant (was duplicated in both install and update services).
  • ExtensionPackageFileServiceassertFilesUnmodified(), createRollbackSnapshot(), restoreRollbackSnapshot() extracted from uninstall/update services.

Commands consolidated

HandlesExtensionPackages trait absorbs what was ~270 lines of copy-pasted code in InstallExtensionCommand and UpdateExtensionCommand:

  • resolveResolution() — repository vs. local-file mode selection with interactive fallback
  • renderDebugResolution(), renderDebugException(), renderOwnershipReport(), isDebug()

Result: both commands shrink from ~358 lines to 87 lines each.

Bug fixes

  • ExtensionPackageBatchService finally blocks were not calling repairStandardPaths() — root-run batch operations could leave paths with wrong ownership on failure.
  • ExtensionInstallProgressService match defaulted unrecognised actions to UNINSTALL_STAGES silently. Now 'uninstall' is an explicit arm and unknown actions throw \InvalidArgumentException.
  • ExtensionOperationLockService blocked-message builder replaced 20-line repetitive match with a single sprintf.

Line count delta (modified files only)

File Before After
ExtensionPackageInstallService 619 459
ExtensionPackageUpdateService 765 533
ExtensionPackageUninstallService 275 207
InstallExtensionCommand 357 87
UpdateExtensionCommand 358 87
New: ExtensionPackageArtifactService (expanded) 164 299
New: ExtensionPackageFileService 97
New: HandlesExtensionPackages trait 294

- 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>
@macery12
macery12 marked this pull request as ready for review April 29, 2026 00:24
@macery12 macery12 assigned Copilot and unassigned Copilot Apr 29, 2026
@macery12
macery12 merged commit f229434 into Extension-System Apr 29, 2026
1 check passed
@macery12 macery12 mentioned this pull request May 6, 2026
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>
@macery12
macery12 deleted the copilot/audit-extension-install-uninstall-update branch May 11, 2026 06:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants