fix(ui): preserve graphemes in provider icons#109509
Conversation
|
Codex review: needs maintainer review before merge. Reviewed July 20, 2026, 2:35 AM ET / 06:35 UTC. Summary PR surface: Source +1, Tests +84. Total +85 across 6 files. Reproducibility: yes. from source: the pre-change provider fallback uses Review metrics: none identified. Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Next step before merge
Security Review detailsBest possible solution: Keep one shared, grapheme-aware Control UI helper and land the focused regression coverage after the maintainer confirms the current clean merge result. Do we have a high-confidence way to reproduce the issue? Yes, from source: the pre-change provider fallback uses Is this the best way to solve the issue? Yes. Reusing a shared grapheme helper is the narrowest maintainable fix because provider fallbacks and plugin monograms share the Unicode-cluster invariant, and the branch covers both the normal AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against 6304a47762cc. Label changesLabel changes:
Label justifications:
Evidence reviewedPR surface: Source +1, Tests +84. Total +85 across 6 files. View PR surface stats
What I checked:
Likely related people:
What the crustacean ranks mean
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics. How this review workflow works
Review history (9 earlier review cycles; latest 8 shown)
|
|
Added exact-head real-browser proof to the PR body. Google Chrome rendered the emoji, flag, ZWJ, and combining-mark fallback badges intact in the actual Model Providers view; DOM grapheme, surrogate, per-badge pixel, full-page pixel, page-error, and console-error checks all passed. A full-page screenshot and 3.88-second recording were captured and visually inspected. @clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
74e460d to
4363581
Compare
4363581 to
ab004b0
Compare
Co-authored-by: Leon-SK668 <[email protected]>
5cc979c to
c526472
Compare
|
ClawSweeper status: review started. I am starting a fresh review of this pull request: fix(ui): preserve graphemes in provider icons 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) ...
* fix(ui): preserve graphemes in provider icons * fix(ui): clamp uppercase provider icon graphemes * test(ui): cover provider icon graphemes in Chromium * test(ui): ignore fallback icon template whitespace * test(ui): capture complete fallback icon proof * test(ui): align provider probe E2E scope Co-authored-by: Leon-SK668 <[email protected]> --------- Co-authored-by: Leon-SK668 <[email protected]> Co-authored-by: Peter Steinberger <[email protected]>
What Problem This Solves
Custom model-provider ids can contain arbitrary Unicode, but the Control UI fallback icon used
charAt(0). Emoji-leading ids therefore rendered a lone UTF-16 surrogate; flags, joined emoji, and combining characters were also split.Why This Change Was Made
Moves the existing plugin-monogram grapheme splitter into a shared Control UI helper and reuses it for provider fallback icons. Known provider asset resolution and empty-id fallback behavior remain unchanged.
User Impact
Custom providers now show one complete visible grapheme in Chat, Model Providers, and Memory Import instead of a malformed fallback icon.
Evidence
Intl.Segmenter-unavailable fallback.node scripts/run-vitest.mjs ui/src/pages/model-providers/view.test.ts ui/src/pages/plugins/view.test.ts: 30 tests passed.oxfmt --check,oxlint, andgit diff --checkpassed.Exact-head browser proof
5cc979c86f6b3389c69430171c5ede0c5ca4ecdf(workflow commit1882d21fb385dd3d46a932a9b1f89db4f50c5a68). The secretless GitHub-hosted Chromium run passed 3/3 focused Model Providers E2E tests in Chrome for Testing 149.0.7827.55.S,🧭,🇺🇸,👩💻, andÉ, including Lit template whitespace normalization.pr109509-exact-head-chromium-5cc979c86f6b, is 1,039,329 bytes and contains four PNGs plus two WebMs; retained through 2026-08-03. Key Unicode captures:03-unicode-fallback-icons.png(133,229 bytes) and04-unicode-fallback-icons-bottom.png(109,383 bytes).