Skip to content

feat(agents): agent display label across operator, monitoring, executions & graph (#1643)#1687

Merged
vybe merged 1 commit into
devfrom
feature/1643-display-name-remaining-surfaces
Jul 18, 2026
Merged

feat(agents): agent display label across operator, monitoring, executions & graph (#1643)#1687
vybe merged 1 commit into
devfrom
feature/1643-display-name-remaining-surfaces

Conversation

@dolho

@dolho dolho commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

What

Follow-up 5/5 of the #964 display-name track — spread the agent display label to the surfaces the ent#181 foundation (#1676) didn't reach: operator queue, monitoring, executions, the collaboration graph, tab titles, and prose/toasts.

Builds directly on #1676 (merged to dev): agent_ownership.display_label, GET/PUT /label, the utils/agentName.js resolver, and the agent_label_changed WS handler already ship. No backend change here.

The decision (AC #1)

Dense operational surfaces (executions, operator queue, monitoring) read only the slug from their own API payloads. Rather than add a mutable display_name to each of those high-volume endpoints — staleness risk + N sources of truth — the label is resolved on the frontend off the loaded agents, from one place, staying live via the existing agent_label_changed handler:

  • agentsStore.displayNameForSlug(slug) → label or slug (prose)
  • agentsStore.agentRefForSlug(slug) → agent object or bare slug (feeds agentNameTooltip)

An unloaded slug falls back to itself, so a cold surface never regresses. Recorded as requirements §1.3.1 FR-6.

Render rule by class (#964)

Class Rule Surfaces
Dense operational tables slug primary, label as hover tooltip ExecutionsPanel · operator QueueCard/QueueList/QueueItemDetail/ResolvedCard/NotificationsPanel · MonitoringPanel (alert + health) · MobileAdmin ops/notif · RoleMatrix (100px, slug-only + tooltip)
Prose / toasts label alone Agents.vue toasts · Settings.vue confirm + subscription option · PortalConversation header/switcher/placeholder · PortalFilesPanel headings/toast
Collaboration graph render label, data.label stays the slug (action key) network.js node data (agent + system) + live handler · AgentNode
Reviewed case-by-case label + slug link / tooltip ExecutionDetail breadcrumb + source-agent · PermissionsPanel · ReplayTimeline · FoldersPanel · AgentWorkspace + AgentBrainOrb headers

Notes:

  • AgentAvatar always receives the slug (incl. every touched surface).
  • Comma-joined lists (GitHub-PAT propagation failure list) keep the slug — long labels make them unreadable (per the issue's own note).
  • Tab titles resolve the label on warm SPA nav; a cold direct load shows the slug (store not fetched yet) and self-heals on the next nav. Explicit tradeoff, not slug-only.
  • Terminal header stays slug (machine-facing).

Verification

Scope boundary

#1643 depends on the #964 schema/API decision, which #1676 answered as display_label. #1639/#1640 (schema/API + endpoint) are now largely redundant with #1676 and #1641/#1642 (roomy surfaces / pickers) remain the sibling follow-ups — flagged for reconciliation, not touched here.

Related to #1643

🤖 Generated with Claude Code

Follow-up 5/5 to the #964 display-name track, building on the ent#181
display_label foundation (#1676): the label + immutable slug, the
`utils/agentName.js` resolver (`agentDisplayName`/`hasDistinctLabel`/
`agentNameTooltip`), and the `agent_label_changed` WS handler already shipped.
This spreads the label to the surfaces #1676 didn't touch.

Decision (AC #1): resolve slug -> label on the FRONTEND off the loaded agents,
not by adding a mutable `display_name` to operator/monitoring/executions
payloads. Those endpoints are high-volume; duplicating a presentation value
across each invites staleness and N sources of truth. Two store getters do it
from one place and stay live via the existing WS handler:
  - `displayNameForSlug(slug)` -> label or slug (prose)
  - `agentRefForSlug(slug)`   -> agent object or bare slug (feeds the tooltip)
An unloaded slug falls back to itself, so a cold surface never regresses.

Render rule by surface class (#964):
- Dense operational tables keep the SLUG primary, label as a hover tooltip:
  ExecutionsPanel, operator QueueCard/QueueList/QueueItemDetail/ResolvedCard/
  NotificationsPanel, MonitoringPanel (alert + health rows), MobileAdmin ops +
  notif rows, RoleMatrix (100px column, slug-only + tooltip).
- Prose / toasts use the label alone: Agents.vue toasts, Settings.vue agent
  confirm + subscription option, PortalConversation header/switcher/placeholder,
  PortalFilesPanel headings/toast. Comma-joined lists (GitHub-PAT propagation)
  stay slug — long labels make them unreadable.
- Collaboration graph: network.js carries `display_label` on the agent and
  system-agent node data + a live `agent_label_changed` handler; AgentNode
  renders the label but keeps `data.label` (the slug) as the action key for
  router.push / toggleAutonomy / toggleAgentRunning. AgentAvatar stays on slug.
- Router tab titles resolve the label on warm SPA nav, fall back to the slug on
  a cold direct load (store not fetched yet); next nav self-heals.
- Reviewed against the rule: ExecutionDetail breadcrumb + source-agent
  attribution (label + slug link), PermissionsPanel target rows, ReplayTimeline
  lane, FoldersPanel consumer/source rows, AgentWorkspace + AgentBrainOrb
  headers. Terminal header stays slug (machine-facing).

Requirements §1.3.1 FR-6 records the decision. No backend change. All 20
touched SFCs compile via @vue/compiler-sfc; the 3 JS files pass node --check.

Related to #1643

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

⚠️ Nightly unit-suite check skipped — merge conflict against dev.

Resolve by running git merge dev locally and pushing the result. The next nightly run will re-test once the conflict is gone.

@vybe vybe left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Validated via /validate-pr. Frontend-only spread of the #1676 display-label foundation (#964 track 5/5): single slug→label resolver on the agents store (displayNameForSlug/agentRefForSlug) instead of N mutable presentation fields on operational payloads; graph data.label verified to stay the slug (action key) with display_label render-only; unloaded slug falls back to itself. No v-html introduced anywhere labels render; no secrets/emails in diff. Requirements updated (core-agent §1.3.1 FR-6). Full check suite green including frontend e2e and the pytest matrix. Note: body carries no closing keyword — bumping #1643 to status-in-dev manually after merge.

@vybe
vybe merged commit e73bb5d into dev Jul 18, 2026
22 checks passed
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.

2 participants