Skip to content

feat: show Gateway agent names and avatars across the Windows app - #2044

Merged
bkudiess merged 5 commits into
openclaw:mainfrom
bkudiess:bkudiess-agent-avatars
Nov 7, 2026
Merged

bkudiess merged 5 commits into
openclaw:mainfrom
bkudiess:bkudiess-agent-avatars

Conversation

@bkudiess

@bkudiess bkudiess commented Nov 6, 2026 •

Copy link
Copy Markdown
Collaborator

What Problem This Solves

Fixes: Gateway agent names and avatars are missing or shown as the raw main ID in Windows workspace and chat views.

User Impact

User impact: Workspace selectors, chat welcome surfaces, and assistant transcript rows show Gateway-resolved agent names and avatars. The default agent retains its main routing ID and displays as Assistant.

Why This Change Was Made

Use roster-first presentation with Gateway identity fallback scoped to the active client, share bounded avatar image loading, and keep the whole avatar inside its slot. Refreshed roster identity takes precedence over retained chat-placement metadata.

Evidence

  • Current-head native Companion screenshots below and in the proof comment show the selected agent, welcome identity, and assistant transcript avatar on a connected real Gateway.
  • Current-head focused native UI regressions passed 5/5, including delayed selector refresh, image and generated-face bounds, and replacement of stale roster presentation.
  • In an earlier dirty development tree, before the selector and bounds fixes, the corresponding four selector/avatar cases produced three intended failures and one pass. This was not a clean PR-base build.
  • Build and Test run 42313873727 passed on the current head, including both mock Gateway lanes and stable-profile compatibility.
  • An earlier independent rubber-duck review found no blocking issue in the avatar implementation. The fixture follow-up and merge were validated separately.

Change Type

  • Bug fix
  • Feature
  • Refactor
  • Docs or instructions
  • Tests or validation
  • Security hardening
  • Chore or infrastructure

Scope

  • Tray or WinUI UX
  • Windows node capability
  • Local MCP or winnode
  • Gateway, connection, or pairing
  • Setup or onboarding
  • Permissions, privacy, or security
  • Tests, CI, or docs

Required proof pools

  • windows-winui-interactive: Workspace and chat identity/avatar rendering changed. The live captures below are partial evidence, not completion of the full pool.

Validation

All current-head results below use 68299c8d8193297e07b46e016ed1dabda36cf022.

  • pwsh -NoProfile -ExecutionPolicy Bypass -File .\build.ps1: passed, Debug win-x64, including documentation checks.

  • dotnet test .\tests\OpenClaw.Shared.Tests\OpenClaw.Shared.Tests.csproj --filter "FullyQualifiedName~GatewayFixtureProtocolTests": 134 passed, 0 skipped.

  • dotnet test .\tests\OpenClaw.Shared.Tests\OpenClaw.Shared.Tests.csproj: 4,873 passed, 25 opt-in skips, 0 failed.

  • dotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj: 5,279 passed, 0 skipped.

  • With isolated tray data roots and $run set to the session's result directory:

    dotnet test .\tests\OpenClaw.Tray.UITests\OpenClaw.Tray.UITests.csproj -r win-x64 --no-restore `
      --filter 'FullyQualifiedName~ResolvedIdentityRefreshesSelectedPresentationWithoutChangingAgent|FullyQualifiedName~Timeline_GeneratedAgentFaceFitsAvatarSlot|FullyQualifiedName~Timeline_RendersGatewayAgentImageAndUsesTheAgentName|FullyQualifiedName~Timeline_UsesAndRefreshesTheCurrentRosterIdentity' `
      --logger 'trx;LogFileName=head-regression.trx' --results-directory $run

    Result: 5 passed, 0 skipped, 0 failed. Both selector theory cases ran.

  • PR checks at this head: 19 passed, 7 release-only checks skipped, 0 failed. In CI run 42313873727, the fixture application lane passed 38/38, fixture UI lane 78/78, and stable-profile compatibility 1/1.

  • Earlier on f1ec5d2d, .\scripts\run-proof-tests.ps1 -Project 'tests\OpenClaw.Tray.UITests\OpenClaw.Tray.UITests.csproj' -Filter 'Category=Accessibility' -ResultName 'winui-accessibility' -RuntimeIdentifier win-x64 had 22 passes and 11 skips; the runner rejected the skipped opt-in tests, so this is not complete proof-pool validation.

  • An earlier UI invocation using AnyCPU failed before tests because Windows App SDK requires an explicit architecture. The x64 invocations passed.

Real Behavior Proof

  • Environment tested: Windows x64, native Companion using an existing user profile and a real native Gateway over ws://127.0.0.1:18789.
  • PR head or commit tested: 68299c8d8193297e07b46e016ed1dabda36cf022; the Debug executable's product version contains that commit and its SHA256 is 60399B219081E98A03B082F55F29FAB1C84FC17C82E112C84ECDCA1AAF4B1906.
  • Exact steps or command run: build the current head, launch the stamped Companion against the existing Gateway, inspect an existing assistant transcript, then create an empty conversation and inspect the welcome view and agent selector.
  • Evidence after fix: the selector shows Assistant with stable ID main; the welcome and assistant transcript both show the complete generated face. Owner identity and existing conversation content are masked.
  • Observed result: bounded Companion logs recorded two hello-ok handshakes and four agent.identity.get sends, with no logged identity-hydration failure. The run logged no chat.send or Gateway config.set, config.patch, or config.apply request.
  • Screenshot or artifact links verified? (Yes/No/N/A): Yes, after publishing the two redacted images below.
  • Not verified or blocked: Gateway response payloads and the source of the displayed name were not logged, so the request observations do not independently prove a successful identity response. Configured image URLs, live rename, emoji changes, and expanded-selector popup pixels were not exercised in this live run. The full interactive proof pool and a live PR-base comparison remain incomplete. An earlier local Release attempt was blocked by the required signed cleanup host. This run created one empty Gateway conversation; one sessions.patch was also observed before creation, but its target and payload were not logged.

Connected welcome and selector

Connected Windows Companion showing the Assistant selector and complete generated avatar in the welcome screen

Assistant transcript

Connected Windows Companion showing the Assistant selector and complete generated avatar beside an assistant transcript row

Security Impact

  • New permissions or capabilities? (Yes/No): No.
  • Secrets or tokens handling changed? (Yes/No): No.
  • New or changed network calls? (Yes/No): Yes, read-only Gateway identity and avatar retrieval for listed agents; requests use the existing authenticated Gateway client and bounded media resolver.
  • Command or tool execution surface changed? (Yes/No): No.
  • Data access scope changed? (Yes/No): Yes, read-only agent identity metadata for the Gateway roster; no user content or credentials are added.
  • If any answer is Yes, explain the risk and mitigation: Reads stay on the selected Gateway connection, identity results are invalidated on client replacement, and avatar loading follows existing media host and decoding protections.

Compatibility and Migration

  • Backward compatible? (Yes/No): Yes.
  • Config or environment changes? (Yes/No): No.
  • Migration needed? (Yes/No): No.
  • If yes, list the exact upgrade steps:

N/A.

Review Conversations

  • I replied to or resolved every bot review conversation addressed by this PR.
  • I left unresolved only conversations that still need maintainer judgment.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@clawsweeper

clawsweeper Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

🦞👀
ClawSweeper picked this up.

Pull request received. I will update this pull request when review starts.

ClawSweeper review complete

ClawSweeper finished reviewing this revision. The review result is being finalized.

View the workflow run.

@bkudiess

bkudiess commented Nov 6, 2026

Copy link
Copy Markdown
Collaborator Author

@clawsweeper[bot] /review
Please review the current PR head and report its ClawSweeper rating, plus the specific changes needed to reach Platinum or higher. Review only; do not modify files or merge.

@clawsweeper

clawsweeper Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

@clawsweeper /review is retired; ClawSweeper now only reviews.

@clawsweeper clawsweeper Bot added clawsweeper:intake:feature Preliminary submission classification; full source review pending. P2 Normal priority bug or improvement with limited blast radius. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed clawsweeper:intake:feature Preliminary submission classification; full source review pending. labels Nov 6, 2026
@clawsweeper

clawsweeper Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

Codex review: needs maintainer review before merge.

What this changes

This PR displays Gateway-resolved agent names and avatars across Workspace selectors, chat welcome views, and assistant transcript rows.

Example: The Gateway's default agent has routing ID main and resolves to Assistant.

  • Before: Windows can display main and use different avatar fallbacks across views.
  • After: The selector, welcome view, and assistant transcript display Assistant with the same generated face while retaining main for routing.

Review scores

Measure Result What it means
Overall readiness 🐚 platinum hermit (4/6) Useful, coherent implementation with current-head native proof, passing CI, and no actionable findings.
Proof confidence 🐚 platinum hermit (4/6) ✨ media proof bonus Sufficient (screenshot): Inspected current-head screenshots exercise native Companion against a connected real Gateway and show the corrected default-agent label and generated face across the changed surfaces; focused tests support refresh and image rendering, while the declared live-scenario and full-pool limits remain unverified.
Patch quality 🦞 diamond lobster (5/6) No actionable review findings were identified.

Product

Kind: Feature · Worth it: Yes · Fix scope: Complete
User problem: Users see raw routing IDs and inconsistent agent avatars across native Workspace and chat views.
Reason: Consistent agent identity has clear user value, and collaborator authorship establishes direction without another product approval.

Merge readiness

✅ Ready for maintainer review

Keep this PR open: it provides useful identity presentation still missing from main, and review found no actionable introduced defect.

Priority: P2
Reviewed head: 68299c8d8193297e07b46e016ed1dabda36cf022

Before merge

None.

Findings

None.

Tests

  • Missing end-to-end proof: A clean PR-base regression run is not shown; live configured-image, rename, and emoji scenarios remain unexercised, as the contributor explicitly records.
Agent review details

How this fits together

Gateway roster and identity responses enter the existing authenticated client, are composed into connection-scoped presentation state, and feed native Workspace and Reactor chat controls.

flowchart TD
  Gateway[Gateway roster and identities] --> Client[Authenticated Gateway client]
  Client --> Service[GatewayService]
  Service --> State[AppState]
  State --> Presentation[Agent presentation]
  Presentation --> Workspace[Workspace selector]
  Presentation --> Chat[Welcome and transcript]
  Chat --> Images[Bounded image cache]
Loading

Technical review

Best possible solution:

Keep one roster-first presentation policy in the existing Gateway, AppState, and badge owners, with resolved identity fallback and bounded chat image loading.

Do we have a high-confidence way to reproduce the issue?

Current-main source shows the raw-ID fallback and separate transcript avatar path; no target code, build, or test was executed during this read-only review.

Is this the best way to solve the issue?

The change fixes presentation at existing owners, preserves routing IDs and selection behavior, and uses a justified shared cache rather than loading an image separately for every transcript row.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning medium; reviewed against 1d8e42687247.

Provenance checked

  • Workspace and placement identity precedence changes intended behavior with a stated reason (3a58bf3: Native Workspace introduced configured agent identities; later welcome work reused placement metadata for the selected agent.)
  • Welcome identity projection changes intended behavior with a stated reason (61979d6: The welcome feature displayed selected-agent identity from the placement catalog; this PR explicitly makes refreshed roster identity authoritative and fills missing values through the Gateway.)
  • Transcript avatar fallback changes intended behavior with a stated reason (9acafa6: The Reactor migration retained an agent identity fallback; the PR intentionally replaces its separate brand-image path with the common native agent badge.)
  • Reconnect and selected-agent retention keeps the original intent (ffc54d6: Reconnect work retained user-selected agents and conversations while awaiting a fresh authoritative roster; the PR continues using that selection owner.)

Testing

Proof path: shipped entry point.

Security

None.

Evidence

What I checked:

Likely related people:

  • Karen: Raw commit 61979d6 adds src/OpenClaw.Tray.WinUI/Chat/ChatWelcomePresentation.cs:23 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: high; commits: 61979d6170a0; files: src/OpenClaw.Tray.WinUI/Chat/ChatWelcomePresentation.cs)

Preflight source

Source unknown. Source comparison at the observed PR snapshot only. Completion is self-reported; body, policy, tests, execution, and report bytes are not verified.

Review metrics

Metric Value Why it matters
Change distribution Production +677/-63; tests and fixtures +675/-15; documentation +7/-0 Growth covers shared identity composition, native generated-face rendering, image-load sharing, and distinct protocol and mounted-control regressions.

Labels

Label changes:

  • add proof: sufficient: Contributor real behavior proof is sufficient.
  • add proof: 📸 screenshot: Contributor real behavior proof includes screenshot evidence.
  • add rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🐚 platinum hermit and patch quality is 🦞 diamond lobster.
  • remove rating: 🧂 unranked krab: Current PR rating is rating: 🐚 platinum hermit, so this older rating label is no longer current.

Label justifications:

  • P2: Consistent agent identification improves everyday navigation and chat presentation without evidence of an urgent runtime failure.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🐚 platinum hermit and patch quality is 🦞 diamond lobster.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR.
  • proof: sufficient: Contributor real behavior proof is sufficient.
  • proof: 📸 screenshot: Contributor real behavior proof includes screenshot evidence.

Rank-up moves

Optional improvements that raise the rating; they are not merge blockers.

  • For stronger proof, show a configured image avatar and a roster rename updating in the connected native app.

Rating scale

6/6 🦀 challenger crab · 5/6 🦞 diamond lobster · 4/6 🐚 platinum hermit · 3/6 🦐 gold shrimp · 2/6 🦪 silver shellfish · 1/6 🧂 unranked krab. Overall follows the weaker of proof and patch quality; ✨ marks media proof (a screenshot, video, or linked artifact) that directly shows the changed behavior.

Workflow

ClawSweeper edits this one comment on every review. Comment @clawsweeper re-review for a fresh review only. Repair and merge execution lanes are retired.

History

Review history (2 earlier review cycles)
  • reviewed 2026-11-06T18:00:51.387Z sha 6d13037 :: needs changes before merge. :: [P2] Keep the current roster presentation authoritative in chat
  • reviewed 2026-11-06T19:32:18.816Z sha f1ec5d2 :: needs maintainer review before merge. :: none

Reviewed November 6, 2026, 7:54 PM ET / November 7, 2026, 00:54 UTC (Revision 3).

@bkudiess
bkudiess marked this pull request as ready for review November 6, 2026 18:38
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@bkudiess

bkudiess commented Nov 6, 2026

Copy link
Copy Markdown
Collaborator Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

🦞👀
Exact review queued.

Re-review progress:

@clawsweeper clawsweeper Bot added clawsweeper:intake:feature Preliminary submission classification; full source review pending. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. clawsweeper:intake:feature Preliminary submission classification; full source review pending. labels Nov 6, 2026
bkudiess and others added 2 commits November 6, 2026 15:14
The Windows app asks the Gateway for each roster agent's identity
(agent.identity.get) so it can show the agent's name and avatar. The mock
Gateway did not implement it, so every request returned METHOD_NOT_FOUND
and was recorded as an unexpected request. That fails the strict empty
UnexpectedRequests assertions in the mock Gateway application scenarios
and in the latest stable profile compatibility step.

Serve the method from the scenario roster, plus the agent created by the
agent-creation scenario. The result carries the roster name and no avatar,
so the app renders its generated face. An unknown agent id gets
INVALID_REQUEST, as on a real Gateway, which is an ordinary protocol error
rather than an unexpected request. Advertise the method with the other
read methods and document it.

Covered by protocol tests that drive the real client against the fixture:
each roster agent, a created agent, an unknown agent, and parameter
validation.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Resolve one conflict, in
tests/OpenClaw.Shared.Tests/GatewayFixtureProtocolTests.cs.

main removed the native Channels page (openclaw#1930) and deleted the three
channels.status rows from RealClient_InvalidOrUnknownParametersFailExplicitly.
This branch added two agent.identity.get rows at the same spot.

Keep the two agent.identity.get rows and drop the three channels.status
rows. main's deletion is preserved, and the fixture still rejects
malformed agent.identity.get requests.

No other file needed manual resolution.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@bkudiess

bkudiess commented Nov 7, 2026

Copy link
Copy Markdown
Collaborator Author

Current-head native Companion proof on a connected real Gateway. Profile identity and prior conversation content are redacted; the PR description records the transport observations and proof limits.

Connected Assistant welcome and selector

Connected Assistant transcript and selector

@bkudiess

bkudiess commented Nov 7, 2026

Copy link
Copy Markdown
Collaborator Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Nov 7, 2026 •

Copy link
Copy Markdown

🦞👀
Exact review queued.

Re-review progress:

@clawsweeper clawsweeper Bot added clawsweeper:intake:feature Preliminary submission classification; full source review pending. proof: sufficient Contributor real behavior proof is sufficient. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. clawsweeper:intake:feature Preliminary submission classification; full source review pending. labels Nov 7, 2026
Preserve the avatar identity regression while retaining main's removal of retired agent-event state and tests.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@bkudiess
bkudiess merged commit 2812fe5 into openclaw:main Nov 7, 2026
48 of 50 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

P2 Normal priority bug or improvement with limited blast radius. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. proof: sufficient Contributor real behavior proof is sufficient. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant