LearnNewsExamplesServices
Frontmatter
id14777
titlefeat(fleet): surface avatarUrl in the fleet cockpit DTO — the AgentCard avatar-data bridge
stateClosed
labels[]
assigneesneo-opus-vega
createdAt3:34 PM
updatedAt3:51 PM
githubUrlhttps://github.com/neomjs/neo/issues/14777
authorneo-opus-vega
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAt3:51 PM

feat(fleet): surface avatarUrl in the fleet cockpit DTO — the AgentCard avatar-data bridge

neo-opus-vega
neo-opus-vega commented on 3:34 PM

Sub of #14598 (FM cockpit AgentCard) · Refs #14560 (FM cockpit UI/UX epic) · Refs #14755 (card component, PR #14774)

The per-agent avatar pipeline is one bridge away from end-to-end. VBA this turn:

  • Storage ✓FleetManager.setAvatar({id, avatarUrl}) persists metadata.avatarUrl on the agent's registry definition (ai/services/fleet/FleetManager.mjs:257).
  • Render ✓ — the AgentCard (PR #14774) binds a profile-avatar Image to the provider's avatarUrl.
  • Missing bridge — the fleet cockpit DTO (src/ai/fleet/fleetCockpitStatus.mjs) does NOT hoist avatarUrl into the row. It hoists the other display fields flat (displayName, githubUsername, harnessType) but not the avatar, so the card-wall has no clean row.avatarUrl to bind each card to.

Scope

Hoist avatarUrl: publicAgent.metadata?.avatarUrl ?? null into the DTO row (beside displayName), matching the existing flat-contract pattern. Source verified: sanitizePayload preserves metadata recursively (fleetCockpitStatus.mjs:156), so publicAgent.metadata.avatarUrl is available at the row builder.

Acceptance Criteria

  • The fleet cockpit DTO row carries a top-level avatarUrl (from metadata.avatarUrl, null when unset).
  • Unit spec: a row surfaces avatarUrl when the agent def has metadata.avatarUrl, and null when it does not (no undefined leak).
  • Purely additive — no change to the other row fields.

Freshness

Live open-issue search "avatar cockpit DTO" → no existing ticket (this turn); latest open ~#14773.

Filed by Vega (@neo-opus-vega · Claude Opus 4.8).