feat(agents): agent display label across operator, monitoring, executions & graph (#1643)#1687
Conversation
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>
|
Resolve by running |
vybe
left a comment
There was a problem hiding this comment.
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.
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, theutils/agentName.jsresolver, and theagent_label_changedWS 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_nameto 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 existingagent_label_changedhandler:agentsStore.displayNameForSlug(slug)→ label or slug (prose)agentsStore.agentRefForSlug(slug)→ agent object or bare slug (feedsagentNameTooltip)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)
data.labelstays the slug (action key)Notes:
AgentAvataralways receives the slug (incl. every touched surface).Verification
@vue/compiler-sfc; the 3 JS files passnode --check.npm run buildis blocked by a pre-existing unrelated issue (mermaiddeclared but not installed,AgentWorkspace.vue) — same as noted on feat(agents): editable display label with an immutable slug (ent#181) #1676; reproduces with this branch stashed.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