Skip to content

fix(web-ui): draw headless host groups with the server mark - #3174

Merged
bobleer merged 1 commit into
GCWing:mainfrom
bobleer:lwb/footer-headless-host-mark
Sep 21, 2026
Merged

bobleer merged 1 commit into
GCWing:mainfrom
bobleer:lwb/footer-headless-host-mark

Conversation

@bobleer

@bobleer bobleer commented Sep 21, 2026

Copy link
Copy Markdown
Collaborator

Summary

The footer's attached-device groups drew Lucide's outline server for a group of headless hosts, in a row where the desktop group beside it already draws the device mark, and where the device list draws the product's own server mark for every one of those hosts. One surface held two drawings of the same idea, and beside a solid mark the outline one read as the hollow, odd glyph of the row.

The group now draws the mark the list draws, and the outline case is gone with it: the footer has one server drawing instead of two.

Fixes # (none - no issue filed)

Type and Areas

Type: Fix / UI/UX

Areas: web UI (NavPanel footer device status)

Motivation / Impact

  • A device list row for a headless host already draws the product's server mark (DeviceMark -> DeviceSystemGlyph); the footer's attached group for the same host kind drew Lucide's Server instead, which is a different drawing in the same slot family.
  • A group of headless hosts is a class, not one device, so it carries only the fact its mark resolves from, the kind. The name, system and host kind a device row would answer with do not exist at that level, and the mark does not read them.
  • With no caller left for the outline case, DeviceIcon's execution-host case and the Server import are removed, so the code can no longer draw two server glyphs for devices. DeviceIcon now draws the kinds that are not a system (a phone, a chat app, the neutral monitor), which is what its new doc comment states.

Scope of the sweep: every other Server glyph in the shell was checked and deliberately kept, because none of them is an OpenBitFun device in the account directory:

Where What it draws Kept
remote-SSH menu item, remote workspace row, dispatch picker's SSH connections and SSH target an SSH host, a transport target yes
ACP agent registry rows an agent server yes
SSH connect/auth dialogs an SSH host yes
ecosystem compatibility views an external agent package/server yes

Each of those sits in a row of Lucide glyphs of its own, and an SSH machine is a transport target rather than a peer host that reports a system and a kind.

Remote scenarios: this is presentation over facts the overview already holds for remote control and peer device mode; no command, registry row, transport path or advertised capability changes. The marks are unchanged on remote workspaces, and mobile web does not render this footer at all.

Verification

  • pnpm --dir src/web-ui run test:run src/app/components/NavPanel src/features/dispatch src/app/components/RemoteConnectDialog - 60 files, 448 tests pass
  • new test: the group and the device list row for the same host kind render one drawing, asserted by comparing the rendered path data. Reverting the routing makes it fail (expected undefined to be 'M1.5 0H22.5A…'), which is how the guard was checked
  • pnpm run check:web - exit 0 (Appearance contract, theme color and theme visual governance, type-check)
  • pnpm --dir src/web-ui run icons:check - exit 0
  • node scripts/check-git-object-sizes.mjs --base upstream/main --head HEAD - exit 0

Not verified: no real browser pass over the footer; the assertion is DOM-level, and the drawing itself is the one already reviewed and shipped for the device list.

Reviewer Notes

  • The group slot is a fixed icon slot of 22px with a 12px glyph. The authored mark draws its ink at 81% of its box, so it sits slightly smaller than the Lucide glyph it replaces; that is exactly how the desktop group beside it already draws, which is the point of the change.
  • Two NavPanel tests read the footer by data-openbitfun-device-kind; the new one follows that convention and adds no test hooks to the component.
  • Before/after at the real slot sizes (22px slot, 12px glyph) was rendered locally for this review and is not attached; the compare image is at .openbitfun/tmp/footer-group-mark.png in the author's workspace and can be dragged into this PR.

Checklist

  • This PR is focused and does not include secrets, temporary prompts, generated scratch files, or unrelated artifacts.
  • Relevant verification is recorded above, or skipped checks are explained.
  • AI-assisted work: this change was written with an AI agent and is fully tested at the level recorded above.

The footer's attached-device groups drew Lucide's outline server for a group of
headless hosts, in a row where the desktop group beside it already draws the
device mark, and where the device list draws the product's own server mark for
every one of those hosts. One surface held two drawings of the same idea, and
the outline one read as the odd, hollow glyph next to a solid mark.

The group now draws the mark the list draws. A group is a class rather than one
device, so it carries only the fact its mark resolves from: the kind. The name,
system and host kind a device row would answer with do not exist at this level
and the mark does not read them. With no caller left for the outline case, the
LUCIDE Server case and its import go with it, so the footer has one server
drawing instead of two.

The other Server glyphs in the shell are not devices and stay: an SSH host is a
transport target (the remote-SSH menu item, a remote workspace row, the dispatch
picker's SSH connections and target), and the ACP registry rows are agent
servers. Each of those is a remote machine, not an OpenBitFun host in the
account directory, and each sits in a row of Lucide glyphs of its own.

Verified by a test that reads the rendered path: the group and the list row for
the same host kind now carry one drawing. The test fails when the routing is
reverted, which is how the guard was checked.

Co-authored-by: bitfun-ai <318544290+bitfun-ai@users.noreply.github.com>
@bobleer
bobleer merged commit e60f92a into GCWing:main Sep 21, 2026
9 checks passed
@bobleer
bobleer deleted the lwb/footer-headless-host-mark branch September 24, 2026 08:19
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.

1 participant