improve(ui): show real machine identity in the place picker#112162
Conversation
The place picker labeled the gateway destination with a hardcoded 'Gateway · local' and let duplicate device names collide. The gateway destination now shows the host's machine name via the existing system.info method (falling back when unavailable), node rows carry platform/model/IP facts as tooltips, and duplicate labels — same-named devices and same-basename recent folders — get a deterministic muted suffix chosen collision-only (model, then IP, then id; parent folder, then path, then node facts for recents). IP addresses never render inline by default. Phone-family nodes get a phone chip icon.
|
ClawSweeper status: review started. I am starting a fresh review of this pull request: improve(ui): show real machine identity in the place picker This is item 1/1 in the current shard. Shard 0/1. This placeholder means the worker is alive and reading the current context. I will edit this same comment with the actual review when the claws are done clicking. Crustacean status: shell secured, claws on keyboard, evidence pebbles being sorted. |
|
ClawSweeper status: review started. I am starting a fresh review of this pull request: improve(ui): show real machine identity in the place picker This is item 1/1 in the current shard. Shard 0/1. This placeholder means the worker is alive and reading the current context. I will edit this same comment with the actual review when the claws are done clicking. Crustacean status: shell secured, claws on keyboard, evidence pebbles being sorted. |
|
Merged via squash.
|
* origin/main: (24 commits) fix(agents): keep compaction on live session model (#95713) fix(plugin-sdk): guard provider catalog live URL parsing against malformed responses (#109986) chore(cli): drop dead classifiers and single-use wrappers left by fallback removal (#112191) feat(ui): expand the lobster pet's random universe (#112073) chore(ci): audit dependency fingerprint exports (#112190) fix(ui): preserve graphemes in provider icons (#109509) fix(ui): align settings search with navigation rows (#112172) fix(agents): allow configless gateway rebind to activate standalone owner (#111841) fix(secrets): register secret targets for installed-origin plugins (#104347) improve(ui): show real machine identity in the place picker (#112162) fix: webChat scrollback history is too limited — older assistant replies and tool outputs disappear when scrolling… (#104250) test(ui): run DOM-free suites in Node (#112031) feat(nodes): make computer.act eligibility capability-based for desktop nodes (#112107) fix(apps): harden mobile gateway and watch state fix(ci): restore Z.AI API Platform validation (#112171) fix(ui): prevent Logs controls from overlapping (#112170) fix #95291: message tool fails to deliver files/images on Feishu (400 volc-dcdn / write ECONNRESET) while same Lark SDK upload succeeds standalone (#95514) refactor(cli)!: remove automatic gateway→embedded fallback from openclaw agent (#112074) refactor: move provider transports into packages/ai behind a typed host port (#111669) fix(anthropic): complete transcript reverse-scan windows across short reads (#109431) ...
…#112162) * improve(ui): show real machine identity in the place picker The place picker labeled the gateway destination with a hardcoded 'Gateway · local' and let duplicate device names collide. The gateway destination now shows the host's machine name via the existing system.info method (falling back when unavailable), node rows carry platform/model/IP facts as tooltips, and duplicate labels — same-named devices and same-basename recent folders — get a deterministic muted suffix chosen collision-only (model, then IP, then id; parent folder, then path, then node facts for recents). IP addresses never render inline by default. Phone-family nodes get a phone chip icon. * fix(ui): appease prod-type and no-shadow gates in place identity helpers
What Problem This Solves
The place picker introduced in #112035 labels the gateway destination with a hardcoded "Gateway · local" — it never shows the machine's real name, and "local" is misleading when the Control UI is opened from another device (the Gateway is local to itself, not to the viewer). Duplicate device names also collide with no disambiguation: two Macs named "Mac Studio" render as identical rows, and two recent folders with the same basename are indistinguishable, so picking the wrong machine or checkout is one click away.
Why This Change Was Made
Identity should be honest without leaking transport noise:
system.infomethod (machineName, hostname fallback), rendered as "Gateway · Peters-Mac-Studio" everywhere the destination appears — chip, Places row, runs-on note, browse header. When the method is unavailable or unadvertised, the previous "Gateway · local" fallback renders unchanged.modelIdentifier, thenremoteIp, then a node-id prefix; for recent folders the parent directory, then the full path, then node facts (two recents can share a path while targeting different same-named nodes). Unique labels stay exactly as before.User Impact
Multi-machine fleets can tell their places apart: the Gateway names the actual host, same-named devices show the fact that differs, and same-named checkouts show where they live. Single-machine setups see no change beyond the honest gateway name. The mock dev harness demos all of it (named gateway, colliding Mac Studios, colliding recents).
Before:
After — named gateway, model-suffixed duplicate devices, parent-suffixed duplicate recents:
Evidence
node scripts/run-vitest.mjs ui/src/pages/new-session— 12 files, 82 passed (newplace-labels.test.tscovers the full-distinctness rule: A/A/B model groups advance to the next separating fact, exhausted candidates fall back to the guaranteed-unique last candidate).system.info(with the existing fallback test passing unchanged), two same-named nodes rendering distinct model suffixes with IP tooltips, and colliding recents applying the correctsessions.createpayload.gpt-5.6-sol) ran to clean over two cycles; the accepted findings (partial-group ambiguity in the disambiguation predicate, recents colliding across same-named nodes) are fixed in this diff.system.infois an existing method, gated on advertisement like its other UI call site.canSubmit/cloud/worktree machinery untouched.