Skip to content

feat(web): slice 2a — Servers list and Server Detail on HeroUI (feature 014, T066-T089) - #364

Merged
ValgulNecron merged 28 commits into
masterfrom
014b-shell-login
Sep 8, 2026
Merged

feat(web): slice 2a — Servers list and Server Detail on HeroUI (feature 014, T066-T089)#364
ValgulNecron merged 28 commits into
masterfrom
014b-shell-login

Conversation

@ValgulNecron

@ValgulNecron ValgulNecron commented Sep 8, 2026

Copy link
Copy Markdown
Owner

Summary

Lands feature 014 slice 2a — Servers list and Server Detail on HeroUI — into master. This is exactly the content of #351 (014c-servers-core → 014b-shell-login, merged 2026-09-08) plus its merge commit; 014b carries nothing else beyond what #349 already merged.

  • feat(design): Pencil frames and design-export/ snapshots for slices 2a–5
  • feat(web): Servers list + ServerDetail shell (T066–T067); detail tabs Overview/Events/Console/Logs/Files/Players (T068–T073); server cards, actions menu and dialogs (T074–T083)
  • test(web)/docs(web): e2e role selectors and page objects, web/specs.md Slice 2a section, tasks T066–T089 marked done
  • CI-driven fixes: HeroUI v3 API updates, lint, vitest/Playwright selectors, and the Modal/AlertDialog/Drawer backdrop-unmount latch fixes

Spec: specs/014-heroui-web-rebuild/ (tasks T066–T089). Downstream slices 2b/3/4/5 (#363, #352, #362, #353) are stacked on 014c and will be rebased onto master once this lands.

Test plan

🤖 Generated with Claude Code

https://claude.ai/code/session_01Euoj6Jxu2a2gBVqSM6VjcB

ValgulNecron and others added 28 commits September 6, 2026 21:19
…server, modules, backups, admin, share links (feature 014, T062-T065 T090-T096 T122-T125 T141-T144 T164-T171)

design.pen: every remaining screen, dialog and composition redrawn from the HeroUI
definitions; zero lunaris c: refs remain outside the lunaris library root; c:Mode axis
dropped document-wide (OD-10); dQV9N disabled table removed (OD-11); placeholder buttons
relabelled (OD-12: Add port override / Remove / Discard / Restore / Refresh / Download /
Delete / overflow); HeroUI tabs bar height kept (OD-13); Create server button keeps the
leading check icon (OD-14). Three dialog definitions recreated with new ids
(T1LzpU->Jpl8j Clone Server, rdlrx->NVN2r Transfer Ownership, t9irnv->FhrUm Wipe World);
iGBIs->F9pUrx, mQ1zB->Hy9r0.

CodeRabbit PR #349 design findings applied here: z9ShNE/rNhll wrap HeroUI button refs,
DWztv/tooKB labels on $typography/font-sans, N1GkB/ljdA5 license text below the SSO
buttons, FyV6E separator fill cleared.

design-export: JSON (depth 20, no elisions, no c: refs, no c:Mode) and 2x screenshots
re-exported for every touched node; MANIFEST sections for slices 2a-5 and the fix waves.
specs: component-map/plan/tasks reference the new node ids; design tasks marked done.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012eNzkxWht6owTjFzMKWr98
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…, T066-T067)

Servers: HeroUI Table/Tabs/Input/Chip with hero PhaseChip, FilterPopover, StatCard, GameIcon; data hooks and lifecycle mutations unchanged; all 24 test cases kept on role queries.
ServerDetail: header on HeroUI Button + PhaseChip, tab bar on HeroUI Tabs; tunnel tests untouched.
Design: F9pUrx, EZFW0, S4k0x, I9kvlZ (design commit 3c40edb).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012eNzkxWht6owTjFzMKWr98
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…Logs, Files, Players (feature 014, T068-T073)

Overview: HeroUI Card/Alert with hero StatCard/Sparkline, PVC provisioning-failure alert (o4LH8W).
Console/Logs: xterm and virtualised engines untouched, chrome only (ConsoleShell toolbar on HeroUI Button/Input).
Files: HeroUI Table/Breadcrumbs and Modal compound parts for new file/folder.
Design: EZFW0 Hy9r0 IzuY2 TE2jI o4LH8W P08Uw Xn5ns kPmoo FtdkI Burtr dPP50.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012eNzkxWht6owTjFzMKWr98
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…014, T074-T083)

ServerStatusCard/ServerSleepCard/ServerActionsCard on HeroUI Card/Chip/Button/Modal/Select; ServerActionsMenu on Dropdown; Clone/Transfer/Wipe/Delete dialogs on Modal and AlertDialog/Danger with new co-located tests; EventList and PortOverridesEditor rebuilt.
Design: EZFW0 Hy9r0 IzuY2 F9pUrx Jpl8j NVN2r FhrUm P08Uw J5pjJ3.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012eNzkxWht6owTjFzMKWr98
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…e objects, live servers-core spec, slice2a screenshot spec (feature 014, T084-T086)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012eNzkxWht6owTjFzMKWr98
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…vers and ServerDetail (feature 014, T087)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012eNzkxWht6owTjFzMKWr98
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012eNzkxWht6owTjFzMKWr98
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…sts, awaited option clicks in TransferServerDialog.test, escaped apostrophe in Overview alert (CI ESLint on fe90a64)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012eNzkxWht6owTjFzMKWr98
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
Tabs = Tabs.List + Tab id/children (Servers, ServerDetail; tablist aria-labels on the list); Table.Root/ScrollContainer/Content compound with renderEmptyState (Servers); Input/Button without startContent, icons in children (Servers, Files, Players, Logs, ConsoleShell, Overview); Button variants outline/ghost/secondary/danger and no color prop; icon-only buttons carry aria-label with a span title for the tooltip (Servers, Players, PortOverridesEditor); ServerActionsCard Select compound; Breadcrumbs current item aria-current; unused imports dropped; DeleteServerDialog.test typing.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012eNzkxWht6owTjFzMKWr98
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…, tablist names, drawer-scoped queries (CI mock+live on a9dc498)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012eNzkxWht6owTjFzMKWr98
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
Use vi.hoisted() to allow mock functions to be used in vi.mock factory.
Vitest requires mocks to be declared in hoisted scope when referenced in
vi.mock calls; wrap with vi.hoisted() and destructure for proper ordering.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0179Kk2kNC9XQD8n8nKG2fsZ
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
… on 6868e0f)

- Remove inner span wrapper with aria-current from Breadcrumbs: HeroUI v3's
  Breadcrumbs.Item automatically applies aria-current="page" when href is
  undefined (current item), so the extra span was creating duplicate attributes.
  Playwright strict mode requires exactly one matching element.

- Update e2e selectors in consolePTY, dataScreens, liveAgentScreens: use
  getByRole("tablist") and getByRole("tab") instead of generic nav/button
  queries for better semantics and robustness.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0179Kk2kNC9XQD8n8nKG2fsZ
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
- CloneServerDialog: wrap Input in TextField with Label and FieldError for
  proper v3 field compound structure.

- ServerActionsCard: use Checkbox.Control + Checkbox.Content instead of Label
  wrapper for HeroUI v3 checkbox compound API.

- ServerActionsMenu: unchanged structure (kept as-is from prior commit).

- ServerDetail: wrap Tabs in <nav> to apply scrollbar-thin styling consistently.

- Overview, Players: minor updates for v3 component API.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0179Kk2kNC9XQD8n8nKG2fsZ
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…k+live on 6868e0f)

Update unit and integration tests to work with HeroUI v3 component changes:

- Use userEvent.click instead of fireEvent.click: HeroUI v3's Button/Trigger
  components use react-aria's onPress handler, which requires full pointer
  sequence (not just bare click event). userEvent simulates complete user
  interaction.

- Update dialog/modal selectors: Modal, ModalDialog, and related elements have
  updated roles and attributes in v3.

- Update select/listbox queries: adapt to v3 Select compound structure.

- Preserve all test assertions and counts; fix only the element selection
  queries and interaction methods.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0179Kk2kNC9XQD8n8nKG2fsZ
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…est's Filter button query matches once (review of f9b8a83)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0179Kk2kNC9XQD8n8nKG2fsZ
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…ismatch (CI vitest on 9923a96)

- TransferServerDialog: the owner-picker ListBox never set
  selectionMode, so HeroUI/react-aria's onSelectionChange never fired on
  click — the popover never closed and userId never updated. Set
  selectionMode="single" and read the selected key out of the Selection
  set/"all" value instead of stringifying it directly.
- FilterPopover: Apply/Clear buttons used onClick (not wired for a
  react-aria Button, which listens on onPress) and set aria-label text
  ("Apply filters"/"Clear all filters") that diverged from their visible
  label, so clicks never fired and role queries for "Apply"/"Clear"
  never matched. Switch to onPress and drop the diverging aria-label;
  update FilterPopover.test.tsx's own name queries to match.
- ServerActionsMenu.test.tsx: three tests call
  vi.mocked(can).mockReturnValue(false), which vi.clearAllMocks() in
  beforeEach does not undo (it clears call history, not
  implementations) — the override leaked into every later test in the
  file, disabling Clone/Transfer/etc. Restore the default can()
  implementation in beforeEach.
- ServerActionsCard.test.tsx: "cancels dialog without running action"
  asserted queryByText("Test") was gone after Cancel, but the action
  button underneath is permanently labeled "Test" too — scope the
  assertion to queryByRole("dialog") instead.
- DeleteServerDialog.test.tsx: asserted the fallback text ("delete
  failed") that errorText() only uses for non-Error rejections; a real
  Error's own message ("API error") is what actually renders. Assert
  the real message.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0179Kk2kNC9XQD8n8nKG2fsZ
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
… console seed (CI live on 9923a96)

- servers-core.spec.ts: scope the clone/transfer/wipe/delete dialog
  locator to getByRole("dialog", { name: dialogHeading }) — a bare
  getByRole("dialog") is a Playwright strict-mode violation once the
  Server Actions dropdown's own role="dialog" popover is still
  data-exiting when the modal opens.
- servers-core.spec.ts: FilterPopover's Apply/Clear buttons dropped
  their diverging aria-label ("Apply filters"/"Clear all filters") in
  the matching vitest fix — update the live spec's button name queries
  to the plain visible text, and force the facet checkbox .check()
  calls through HeroUI's Checkbox label (which visually covers the
  native input and fails Playwright's actionability check, though a
  real click on the label toggles the associated input natively).
- _seed.ts: seedTemplate declared no console capability, so
  resolveConsoleMode() defaulted to "none" and ServerDetail hid the
  Console tab outright — "all six core tabs render" clicks it. Add
  consoleMode: "pty" to the shared seed template.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0179Kk2kNC9XQD8n8nKG2fsZ
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…button, alertdialog role for wipe/delete live spec (review of 1b91f0c)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0179Kk2kNC9XQD8n8nKG2fsZ
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…CI on 6f13e3b)

The Servers table's Table.Header had no Column with isRowHeader set,
which react-aria-components' TableCollection.updateColumns requires.
Every render of the servers table (46 renders across Servers.test.tsx)
threw a synchronous-recovery exception from inside react-aria's
CollectionBuilder that vitest reported as an unhandled error, even
though the visible assertions all passed. Add isRowHeader to the
"name" column to satisfy the collection invariant.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0179Kk2kNC9XQD8n8nKG2fsZ
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
"server detail: all six core tabs render" asserted getByText(/players
online/i) on the Players tab, but Players.tsx has never rendered that
phrase — it renders "<online> online" or "<online> / <max> online".
Match the actual dynamic text instead. Also wait for
domcontentloaded after ServerDetailPage.goto's navigation, mirroring
every other live spec's beforeEach, so the first assertion isn't
racing the navigation.

"clone/transfer/wipe/delete dialogs open and cancel..." timed out
clicking the "Server actions" trigger between dialogs: HeroUI's
ModalBackdrop is a DOM sibling of the dialog with its own exit
animation, and can still be a pointer-events-opaque
data-slot="modal-backdrop" layer over the page after the dialog's own
role element already reports hidden. Wait for every modal backdrop to
fully detach before the helper hands control back to the next
openMenuAndDialog call.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0179Kk2kNC9XQD8n8nKG2fsZ
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…e, Overview selected explicitly with retry (review of ef6e551)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0179Kk2kNC9XQD8n8nKG2fsZ
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…ot unmount (CI live on 2180f45)

HeroUI v3's Modal backdrop animates out with opacity 0 rather than immediately
unmounting from the DOM. The exit animation takes 100ms. Updated the wait condition
to check that all backdrops are either removed from the DOM or have opacity 0,
instead of waiting for complete removal which never happens.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0179Kk2kNC9XQD8n8nKG2fsZ
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…ug + raf polling (CI live on cf1891d)

Trace from run 34162882945 (job 101869389019) showed the failing
waitForFunction call carried arg.value = {timeout: 5000} — the second
positional parameter of page.waitForFunction(fn, arg, options) is the
function's *argument*, not its options, so no five prior attempts at
this wait (dialog toBeHidden, backdrop count 0, backdrop opacity 0)
ever actually applied a 5s timeout. The wait silently fell back to
Playwright's default polling with no timeout of its own, then died
with the surrounding test's 30s timeout — exactly the "Test timeout of
30000ms exceeded" (not a waitForFunction-specific timeout) reported on
every run.

Also switch off the default raf polling to a numeric interval: raf
polling re-checks the predicate once per requestAnimationFrame
callback on the page, which can be throttled far below real-time on a
backgrounded (never-foregrounded) live-mode tab, stalling a predicate
that may already be true. An explicit polling interval re-checks on a
plain interval independent of the page's own animation-frame loop.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0179Kk2kNC9XQD8n8nKG2fsZ
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
… a real HeroUI backdrop-leak bug (CI live on cf1891d)

A second trace (run 34167471686, job 101882626929, after the
arg/options + polling fix) showed the wait now correctly reports its
own "TimeoutError: page.waitForFunction: Timeout 10000ms exceeded" —
and querying the reconstructed DOM at that exact moment (via the
trace's snapshot iframes) shows the [data-slot="modal-backdrop"]
element is still present, data-exiting="true", opacity back at its
resting value of 1, pointer-events: auto, 10+ real seconds after
Cancel. It never goes away.

Reading react-aria-components' ModalOverlay
(node_modules/react-aria-components/dist/private/Modal.mjs) explains
why: it tracks isExiting = isOverlayExiting || isModalExiting, where
isModalExiting comes from a second useExitAnimation bound to an
internal `modalRef` meant to be attached by *nested* modal content.
HeroUI v3.2.4's ModalBackdrop/ModalContainer (and the equivalent
AlertDialogBackdrop/AlertDialogContainer used by the wipe/delete
AlertDialogs) are composed as *siblings* under <Modal> — the pattern
every dialog in this codebase already uses — so that modalRef is never
attached to anything. useAnimation's `if (isActive && ref.current)`
guard (react-aria/dist/private/utils/animation.mjs) then never fires
for it, isModalExiting latches true the first time any dialog closes,
and the backdrop's "should I unmount" check is permanently disabled
for the rest of that component instance's life — a real HeroUI/
react-aria-components bug, not a test timing issue, reachable from any
dialog in the app.

Fixing the composition itself touches production markup for six
components and is out of scope here; tracked as a follow-up. This test
works around it the way a real user would recover: reload for a fresh,
never-yet-closed component instance before opening the next dialog, so
one dialog's stuck backdrop can't block the next one's trigger click.
No assertion is weakened — every dialog still gets its own open/
visible-heading/cancel/hidden/still-exists checks.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0179Kk2kNC9XQD8n8nKG2fsZ
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
… the backdrop unmounts after close (HeroUI v3 exit-state latch)

HeroUI v3.2.4's ModalBackdrop/ModalContainer (and the equivalent
AlertDialogBackdrop/AlertDialogContainer) wrap react-aria-components'
ModalOverlay and Modal respectively. ModalOverlay's exit state is
`isOverlayExiting || isModalExiting`, where isModalExiting tracks an
internal modalRef that react-aria-components only attaches when the
Modal (ModalContainer) is rendered as a descendant of the ModalOverlay
(ModalBackdrop), via InternalModalContext
(react-aria-components/dist/private/Modal.mjs).

All six dialog components in this codebase composed the backdrop and
container as siblings under <Modal>/<AlertDialog> instead, so that
modalRef was never attached and isModalExiting latched true the first
time any dialog closed, permanently disabling the backdrop's "should I
unmount" check for the rest of that component instance's life — a
full-viewport position:fixed backdrop left in the DOM blocking every
later interaction on the page.

Fix: nest ModalContainer/AlertDialogContainer inside
ModalBackdrop/AlertDialogBackdrop in CloneServerDialog,
TransferServerDialog, WipeServerDialog, ConfirmDialog (used by
DeleteServerDialog), ServerActionsCard, and Files.tsx — matching
HeroUI's own type composition (ModalContainerProps/
AlertDialogContainerProps wrap react-aria-components' Modal, which
ModalBackdrop/AlertDialogBackdrop's ModalOverlay expects as a nested
child).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0179Kk2kNC9XQD8n8nKG2fsZ
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…ge again; backdrop must unmount

Now that the six dialog components nest ModalContainer/
AlertDialogContainer inside their backdrop, the backdrop actually
unmounts once its exit animation completes — so the reload-between-
dialogs workaround from 02b1f47 is no longer needed. Restore a single
page load exercising all four dialogs (clone/transfer/wipe/delete) in
sequence, keeping every existing assertion (visible, heading, cancel,
hidden, server still exists), and add the assertion that proves the
fix: the backdrop element ([data-slot="modal-backdrop"] /
[data-slot="alert-dialog-backdrop"]) has count 0 after each dialog is
cancelled.

Also fixes the comment's inverted description of the root cause:
react-aria-components expects the container nested inside the
backdrop; composing them as siblings (this codebase's prior pattern,
now fixed) is what leaked the backdrop.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0179Kk2kNC9XQD8n8nKG2fsZ
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…debar so the backdrop unmounts after close (same HeroUI v3 latch as d51de9d)

HeroUI v3's DrawerBackdrop (wrapping react-aria's ModalOverlay) tracks exit
state as isOverlayExiting || isDrawerExiting. The isDrawerExiting flag only
gets set when DrawerContent is rendered as a descendant of DrawerBackdrop
(via InternalModalContext). Before the fix, they were siblings under
Drawer.Root, so isDrawerExiting never attached to anything and latched true
on first close, permanently disabling the backdrop's unmount check. Nesting
DrawerContent inside DrawerBackdrop matches HeroUI's type composition and
fixes the exit-state latch. Also extends the e2e backdrop-count locator to
include [data-slot="drawer-backdrop"] so all three backdrop types (modal,
alertdialog, drawer) are verified to unmount after close.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0179Kk2kNC9XQD8n8nKG2fsZ
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
feat(web): slice 2a — Servers list and Server Detail on HeroUI (feature 014, T066-T087)
@ValgulNecron ValgulNecron added area: web React dashboard type: feature New capability or user-facing addition labels Sep 8, 2026
@coderabbitai

coderabbitai Bot commented Sep 8, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 195 files, which is 95 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: af87cedd-a404-47e1-8b94-5857b387bc3e

📥 Commits

Reviewing files that changed from the base of the PR and between f863014 and 48cc512.

⛔ Files ignored due to path filters (122)
  • design-export/screenshots/B89TO.png is excluded by !**/*.png
  • design-export/screenshots/BX0XM.png is excluded by !**/*.png
  • design-export/screenshots/Bbnga.png is excluded by !**/*.png
  • design-export/screenshots/Bq2Yg.png is excluded by !**/*.png
  • design-export/screenshots/Burtr.png is excluded by !**/*.png
  • design-export/screenshots/C2LQE4.png is excluded by !**/*.png
  • design-export/screenshots/CqaSq.png is excluded by !**/*.png
  • design-export/screenshots/DMnEi.png is excluded by !**/*.png
  • design-export/screenshots/DPrYX.png is excluded by !**/*.png
  • design-export/screenshots/DWztv.png is excluded by !**/*.png
  • design-export/screenshots/Dpb9f.png is excluded by !**/*.png
  • design-export/screenshots/DxKOh.png is excluded by !**/*.png
  • design-export/screenshots/DxsT3.png is excluded by !**/*.png
  • design-export/screenshots/E0ypH.png is excluded by !**/*.png
  • design-export/screenshots/E9EEv0.png is excluded by !**/*.png
  • design-export/screenshots/ECbbo.png is excluded by !**/*.png
  • design-export/screenshots/EZFW0.png is excluded by !**/*.png
  • design-export/screenshots/EcoGD.png is excluded by !**/*.png
  • design-export/screenshots/F9pUrx.png is excluded by !**/*.png
  • design-export/screenshots/FhrUm.png is excluded by !**/*.png
  • design-export/screenshots/FtdkI.png is excluded by !**/*.png
  • design-export/screenshots/FyV6E.png is excluded by !**/*.png
  • design-export/screenshots/GUHQo.png is excluded by !**/*.png
  • design-export/screenshots/GayoL.png is excluded by !**/*.png
  • design-export/screenshots/Hy9r0.png is excluded by !**/*.png
  • design-export/screenshots/I9W8z.png is excluded by !**/*.png
  • design-export/screenshots/I9kvlZ.png is excluded by !**/*.png
  • design-export/screenshots/IzuY2.png is excluded by !**/*.png
  • design-export/screenshots/J5pjJ3.png is excluded by !**/*.png
  • design-export/screenshots/JLaGB.png is excluded by !**/*.png
  • design-export/screenshots/JZrLu.png is excluded by !**/*.png
  • design-export/screenshots/Jpl8j.png is excluded by !**/*.png
  • design-export/screenshots/KaRFX.png is excluded by !**/*.png
  • design-export/screenshots/KhYNc.png is excluded by !**/*.png
  • design-export/screenshots/Kp48V.png is excluded by !**/*.png
  • design-export/screenshots/KrREo.png is excluded by !**/*.png
  • design-export/screenshots/M2sA4u.png is excluded by !**/*.png
  • design-export/screenshots/MLrud.png is excluded by !**/*.png
  • design-export/screenshots/MaoHP.png is excluded by !**/*.png
  • design-export/screenshots/N1GkB.png is excluded by !**/*.png
  • design-export/screenshots/NLDDv.png is excluded by !**/*.png
  • design-export/screenshots/NVN2r.png is excluded by !**/*.png
  • design-export/screenshots/O08uaD.png is excluded by !**/*.png
  • design-export/screenshots/P08Uw.png is excluded by !**/*.png
  • design-export/screenshots/QgW58.png is excluded by !**/*.png
  • design-export/screenshots/RC3Kf.png is excluded by !**/*.png
  • design-export/screenshots/RodrS.png is excluded by !**/*.png
  • design-export/screenshots/S4k0x.png is excluded by !**/*.png
  • design-export/screenshots/S7SCDc.png is excluded by !**/*.png
  • design-export/screenshots/Ss0Yr.png is excluded by !**/*.png
  • design-export/screenshots/T1LzpU.png is excluded by !**/*.png
  • design-export/screenshots/TBvTC.png is excluded by !**/*.png
  • design-export/screenshots/TE2jI.png is excluded by !**/*.png
  • design-export/screenshots/TzRet.png is excluded by !**/*.png
  • design-export/screenshots/UMJli.png is excluded by !**/*.png
  • design-export/screenshots/V1VhGE.png is excluded by !**/*.png
  • design-export/screenshots/VM7ro.png is excluded by !**/*.png
  • design-export/screenshots/VfB0Y.png is excluded by !**/*.png
  • design-export/screenshots/W8idqY.png is excluded by !**/*.png
  • design-export/screenshots/WZdnw.png is excluded by !**/*.png
  • design-export/screenshots/Wj0V4.png is excluded by !**/*.png
  • design-export/screenshots/XL5ZU.png is excluded by !**/*.png
  • design-export/screenshots/Xn5ns.png is excluded by !**/*.png
  • design-export/screenshots/Y5cmvI.png is excluded by !**/*.png
  • design-export/screenshots/ZWcwn.png is excluded by !**/*.png
  • design-export/screenshots/atqRh.png is excluded by !**/*.png
  • design-export/screenshots/b4eaUf.png is excluded by !**/*.png
  • design-export/screenshots/bYDHC.png is excluded by !**/*.png
  • design-export/screenshots/dBILX.png is excluded by !**/*.png
  • design-export/screenshots/dPP50.png is excluded by !**/*.png
  • design-export/screenshots/dQV9N.png is excluded by !**/*.png
  • design-export/screenshots/dxdEi.png is excluded by !**/*.png
  • design-export/screenshots/e9lV4.png is excluded by !**/*.png
  • design-export/screenshots/eafUs.png is excluded by !**/*.png
  • design-export/screenshots/f0s9zG.png is excluded by !**/*.png
  • design-export/screenshots/f1Vga.png is excluded by !**/*.png
  • design-export/screenshots/fK8Bi.png is excluded by !**/*.png
  • design-export/screenshots/g5mEpx.png is excluded by !**/*.png
  • design-export/screenshots/hLB9Z.png is excluded by !**/*.png
  • design-export/screenshots/i1bLR.png is excluded by !**/*.png
  • design-export/screenshots/i8wib.png is excluded by !**/*.png
  • design-export/screenshots/j9W8A.png is excluded by !**/*.png
  • design-export/screenshots/kIxaJ.png is excluded by !**/*.png
  • design-export/screenshots/kK8Ji.png is excluded by !**/*.png
  • design-export/screenshots/kPmoo.png is excluded by !**/*.png
  • design-export/screenshots/ljdA5.png is excluded by !**/*.png
  • design-export/screenshots/m5kOm4.png is excluded by !**/*.png
  • design-export/screenshots/n6Xlo.png is excluded by !**/*.png
  • design-export/screenshots/nNGDX.png is excluded by !**/*.png
  • design-export/screenshots/nNL3E.png is excluded by !**/*.png
  • design-export/screenshots/o4LH8W.png is excluded by !**/*.png
  • design-export/screenshots/pssCT.png is excluded by !**/*.png
  • design-export/screenshots/q1zaXx.png is excluded by !**/*.png
  • design-export/screenshots/q31B6w.png is excluded by !**/*.png
  • design-export/screenshots/qFLfB.png is excluded by !**/*.png
  • design-export/screenshots/rNhll.png is excluded by !**/*.png
  • design-export/screenshots/rdlrx.png is excluded by !**/*.png
  • design-export/screenshots/sSISK.png is excluded by !**/*.png
  • design-export/screenshots/sZtDi.png is excluded by !**/*.png
  • design-export/screenshots/swxkJ.png is excluded by !**/*.png
  • design-export/screenshots/t3IY3u.png is excluded by !**/*.png
  • design-export/screenshots/t9irnv.png is excluded by !**/*.png
  • design-export/screenshots/tDY4O.png is excluded by !**/*.png
  • design-export/screenshots/tTSdi.png is excluded by !**/*.png
  • design-export/screenshots/tY6RD.png is excluded by !**/*.png
  • design-export/screenshots/tooKB.png is excluded by !**/*.png
  • design-export/screenshots/ugDSa.png is excluded by !**/*.png
  • design-export/screenshots/uoxQW.png is excluded by !**/*.png
  • design-export/screenshots/vStkb.png is excluded by !**/*.png
  • design-export/screenshots/vUqMl.png is excluded by !**/*.png
  • design-export/screenshots/x7MJI.png is excluded by !**/*.png
  • design-export/screenshots/x8cjS.png is excluded by !**/*.png
  • design-export/screenshots/xCJlu.png is excluded by !**/*.png
  • design-export/screenshots/xvlB6.png is excluded by !**/*.png
  • design-export/screenshots/z9ShNE.png is excluded by !**/*.png
  • design-export/screenshots/zFiOW.png is excluded by !**/*.png
  • design-export/screenshots/zM0VF.png is excluded by !**/*.png
  • design-export/screenshots/zg6cG.png is excluded by !**/*.png
  • design-export/screenshots/zhLZN.png is excluded by !**/*.png
  • design-export/screenshots/znLuB.png is excluded by !**/*.png
  • design-export/screenshots/zqzr4.png is excluded by !**/*.png
  • design.pen is excluded by !**/*.pen
📒 Files selected for processing (195)
  • design-export/MANIFEST.md
  • design-export/json/B89TO.json
  • design-export/json/BV5ei.json
  • design-export/json/BX0XM.json
  • design-export/json/Bbnga.json
  • design-export/json/Bq2Yg.json
  • design-export/json/Burtr.json
  • design-export/json/C2LQE4.json
  • design-export/json/CqaSq.json
  • design-export/json/DMnEi.json
  • design-export/json/DPrYX.json
  • design-export/json/DWztv.json
  • design-export/json/Dpb9f.json
  • design-export/json/DxKOh.json
  • design-export/json/DxsT3.json
  • design-export/json/E0ypH.json
  • design-export/json/E9EEv0.json
  • design-export/json/ECbbo.json
  • design-export/json/EZFW0.json
  • design-export/json/EcoGD.json
  • design-export/json/F9pUrx.json
  • design-export/json/FhrUm.json
  • design-export/json/FtdkI.json
  • design-export/json/FyV6E.json
  • design-export/json/GUHQo.json
  • design-export/json/GayoL.json
  • design-export/json/Hy9r0.json
  • design-export/json/I9W8z.json
  • design-export/json/I9kvlZ.json
  • design-export/json/IzuY2.json
  • design-export/json/J5pjJ3.json
  • design-export/json/JLaGB.json
  • design-export/json/JZrLu.json
  • design-export/json/Jpl8j.json
  • design-export/json/KaRFX.json
  • design-export/json/KhYNc.json
  • design-export/json/Kp48V.json
  • design-export/json/KrREo.json
  • design-export/json/M2sA4u.json
  • design-export/json/MLrud.json
  • design-export/json/MaoHP.json
  • design-export/json/N13Xud.json
  • design-export/json/N1GkB.json
  • design-export/json/NLDDv.json
  • design-export/json/NVN2r.json
  • design-export/json/O08uaD.json
  • design-export/json/P08Uw.json
  • design-export/json/QgW58.json
  • design-export/json/R65Xyx.json
  • design-export/json/RC3Kf.json
  • design-export/json/RodrS.json
  • design-export/json/Rwnu3.json
  • design-export/json/S4k0x.json
  • design-export/json/S7SCDc.json
  • design-export/json/SeizD.json
  • design-export/json/Ss0Yr.json
  • design-export/json/T1LzpU.json
  • design-export/json/TBvTC.json
  • design-export/json/TE2jI.json
  • design-export/json/TzRet.json
  • design-export/json/UMJli.json
  • design-export/json/V1VhGE.json
  • design-export/json/VM7ro.json
  • design-export/json/VfB0Y.json
  • design-export/json/W8idqY.json
  • design-export/json/WZdnw.json
  • design-export/json/Wj0V4.json
  • design-export/json/XL5ZU.json
  • design-export/json/Xn5ns.json
  • design-export/json/Y5cmvI.json
  • design-export/json/ZWcwn.json
  • design-export/json/atqRh.json
  • design-export/json/b4eaUf.json
  • design-export/json/bYDHC.json
  • design-export/json/dBILX.json
  • design-export/json/dPP50.json
  • design-export/json/dQV9N.json
  • design-export/json/dxdEi.json
  • design-export/json/e9lV4.json
  • design-export/json/eafUs.json
  • design-export/json/epZO2.json
  • design-export/json/f0s9zG.json
  • design-export/json/f1Vga.json
  • design-export/json/fK8Bi.json
  • design-export/json/g5mEpx.json
  • design-export/json/gX7um.json
  • design-export/json/hLB9Z.json
  • design-export/json/i1bLR.json
  • design-export/json/i8wib.json
  • design-export/json/j24cXg.json
  • design-export/json/j9W8A.json
  • design-export/json/jmoi3.json
  • design-export/json/kIxaJ.json
  • design-export/json/kK8Ji.json
  • design-export/json/kPmoo.json
  • design-export/json/ljdA5.json
  • design-export/json/m5kOm4.json
  • design-export/json/n6Xlo.json
  • design-export/json/nNGDX.json
  • design-export/json/nNL3E.json
  • design-export/json/o4LH8W.json
  • design-export/json/oyoTs.json
  • design-export/json/pssCT.json
  • design-export/json/q1zaXx.json
  • design-export/json/q31B6w.json
  • design-export/json/qFLfB.json
  • design-export/json/rNhll.json
  • design-export/json/rdlrx.json
  • design-export/json/sSISK.json
  • design-export/json/sSISK.json.txt
  • design-export/json/sZtDi.json
  • design-export/json/swxkJ.json
  • design-export/json/t3IY3u.json
  • design-export/json/t9irnv.json
  • design-export/json/tDY4O.json
  • design-export/json/tTSdi.json
  • design-export/json/tY6RD.json
  • design-export/json/tooKB.json
  • design-export/json/uMiwd.json
  • design-export/json/ugDSa.json
  • design-export/json/uoxQW.json
  • design-export/json/uw0dB.json
  • design-export/json/vStkb.json
  • design-export/json/vUqMl.json
  • design-export/json/x7MJI.json
  • design-export/json/x8cjS.json
  • design-export/json/xCJlu.json
  • design-export/json/xvlB6.json
  • design-export/json/z9ShNE.json
  • design-export/json/zFiOW.json
  • design-export/json/zM0VF.json
  • design-export/json/zg6cG.json
  • design-export/json/zhLZN.json
  • design-export/json/znLuB.json
  • design-export/json/zqzr4.json
  • specs/014-heroui-web-rebuild/contracts/component-map.md
  • specs/014-heroui-web-rebuild/plan.md
  • specs/014-heroui-web-rebuild/tasks.md
  • web/e2e/pages/ServerDetailPage.ts
  • web/e2e/pages/ServersPage.ts
  • web/e2e/screenshots/slice2a.spec.ts
  • web/e2e/specs/fileManager.spec.ts
  • web/e2e/specs/live/_seed.ts
  • web/e2e/specs/live/consolePTY.spec.ts
  • web/e2e/specs/live/dataScreens.spec.ts
  • web/e2e/specs/live/liveAgentScreens.spec.ts
  • web/e2e/specs/live/servers-core.spec.ts
  • web/e2e/specs/players.spec.ts
  • web/e2e/specs/serverDetail.spec.ts
  • web/e2e/specs/serverLifecycleUI.spec.ts
  • web/e2e/specs/settingsSubTabs.spec.ts
  • web/specs.md
  • web/src/components/hero/Breadcrumbs.tsx
  • web/src/components/hero/ConfirmDialog.tsx
  • web/src/components/hero/FilterPopover.test.tsx
  • web/src/components/hero/FilterPopover.tsx
  • web/src/components/hero/Sidebar.tsx
  • web/src/components/server/CloneServerDialog.test.tsx
  • web/src/components/server/CloneServerDialog.tsx
  • web/src/components/server/DeleteServerDialog.test.tsx
  • web/src/components/server/DeleteServerDialog.tsx
  • web/src/components/server/EventList.test.tsx
  • web/src/components/server/EventList.tsx
  • web/src/components/server/PortOverridesEditor.test.tsx
  • web/src/components/server/PortOverridesEditor.tsx
  • web/src/components/server/ServerActionsCard.test.tsx
  • web/src/components/server/ServerActionsCard.tsx
  • web/src/components/server/ServerActionsMenu.test.tsx
  • web/src/components/server/ServerActionsMenu.tsx
  • web/src/components/server/ServerSleepCard.test.tsx
  • web/src/components/server/ServerSleepCard.tsx
  • web/src/components/server/ServerStatusCard.test.tsx
  • web/src/components/server/ServerStatusCard.tsx
  • web/src/components/server/TransferServerDialog.test.tsx
  • web/src/components/server/TransferServerDialog.tsx
  • web/src/components/server/WipeServerDialog.test.tsx
  • web/src/components/server/WipeServerDialog.tsx
  • web/src/routes/ServerDetail.test.tsx
  • web/src/routes/ServerDetail.tsx
  • web/src/routes/ServerDetail_tunnel_settings.test.tsx
  • web/src/routes/Servers.test.tsx
  • web/src/routes/Servers.tsx
  • web/src/routes/tabs/Console.test.tsx
  • web/src/routes/tabs/Console.tsx
  • web/src/routes/tabs/ConsoleShell.tsx
  • web/src/routes/tabs/Events.tsx
  • web/src/routes/tabs/Files.test.tsx
  • web/src/routes/tabs/Files.tsx
  • web/src/routes/tabs/Logs.test.tsx
  • web/src/routes/tabs/Logs.tsx
  • web/src/routes/tabs/Overview.tsx
  • web/src/routes/tabs/Players.test.tsx
  • web/src/routes/tabs/Players.tsx
  • web/src/routes/tabs/settings/Danger.test.tsx
  • web/src/test/screenshotData.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown

CI Report - 48cc512

run 34262393335 - attempt 1

0 failed - 7 passed - 10 skipped - 13m20s elapsed

Coverage

Module Measured Gate Margin
web L94.76 S93.27 B87.73 F90.95 L92 S92 B82 F76 +1.27

Changed

Area Files +/-
design-export/ 256 +26629/-13690
(root) 1 +6637/-4945
web/ 57 +3955/-1113
specs/ 3 +53/-53

Slowest jobs

Job Duration
build e2e images 6m55s
e2e web live / amd64 (kind) 6m10s
e2e web live / arm64 (kind) 6m6s
build e2e images (arm64) 5m14s
lint (gameproto) 5m11s

e2e buckets run

multicluster, upgrade

@ValgulNecron
ValgulNecron merged commit 727e2bd into master Sep 8, 2026
39 of 40 checks passed
@ValgulNecron
ValgulNecron deleted the 014b-shell-login branch September 8, 2026 19:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: web React dashboard type: feature New capability or user-facing addition

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant