diff --git a/docs/components/active-agents.md b/docs/components/active-agents.md index f8efec90..df32cff6 100644 --- a/docs/components/active-agents.md +++ b/docs/components/active-agents.md @@ -27,7 +27,8 @@ Command Palette → "Toggle Active Agents Panel". - **Icon** — the detected command/agent icon (for example `omp` keeps the OMP icon even though it reports as the Pi agent; unknown wrappers fall back to the agent icon, then a sparkle). -- **Title** — agent name + repository (repo color-coded). +- **Title** — detected command/agent name + repository (repo color-coded); + command aliases such as `omp` are shown directly. - **Subtitle** — the tab title (if `showActiveAgentTabTitles`) or branch name. - **Status pill** — one of: diff --git a/supacode/Features/ActiveAgents/Models/ActiveAgentEntry.swift b/supacode/Features/ActiveAgents/Models/ActiveAgentEntry.swift index 29e3b9ef..e58deb80 100644 --- a/supacode/Features/ActiveAgents/Models/ActiveAgentEntry.swift +++ b/supacode/Features/ActiveAgents/Models/ActiveAgentEntry.swift @@ -23,6 +23,17 @@ struct ActiveAgentEntry: Identifiable, Equatable, Sendable { let rawState: AgentRawState let displayState: AgentDisplayState let lastChangedAt: Date + var displayName: String { + let trimmed = iconLookupToken.trimmingCharacters(in: .whitespacesAndNewlines) + guard + !trimmed.isEmpty, + trimmed != "agent", + CommandIconMap.iconForFirstToken(trimmed) != nil + else { + return agent.displayName + } + return trimmed + } var iconSource: TabIconSource? { CommandIconMap.iconForFirstToken(iconLookupToken) ?? CommandIconMap.iconForFirstToken(agent.iconLookupToken) diff --git a/supacode/Features/ActiveAgents/Views/ActiveAgentRow.swift b/supacode/Features/ActiveAgents/Views/ActiveAgentRow.swift index 61c06af0..88c0cb05 100644 --- a/supacode/Features/ActiveAgents/Views/ActiveAgentRow.swift +++ b/supacode/Features/ActiveAgents/Views/ActiveAgentRow.swift @@ -31,7 +31,7 @@ struct ActiveAgentRow: View { private var title: some View { HStack(alignment: .firstTextBaseline, spacing: 3) { - Text(entry.agent.displayName) + Text(entry.displayName) .font(.body.weight(.medium)) .foregroundStyle(.primary) Text("·") diff --git a/supacode/Features/Shelf/Views/ShelfSpineView.swift b/supacode/Features/Shelf/Views/ShelfSpineView.swift index 243f95a7..81e1a216 100644 --- a/supacode/Features/Shelf/Views/ShelfSpineView.swift +++ b/supacode/Features/Shelf/Views/ShelfSpineView.swift @@ -619,12 +619,12 @@ private struct ShelfSpineTabSlot: View { private var helpText: String { guard let activeAgentEntry else { return tab.displayTitle } let tabTitle = ActiveAgentsPanel.tabTitle(for: activeAgentEntry) - return "Jump to \(activeAgentEntry.agent.displayName): \(activeAgentEntry.displayState.label) - \(tabTitle)" + return "Jump to \(activeAgentEntry.displayName): \(activeAgentEntry.displayState.label) - \(tabTitle)" } private var accessibilityLabel: String { guard let activeAgentEntry else { return tab.displayTitle } - return "Jump to \(activeAgentEntry.agent.displayName), \(activeAgentEntry.displayState.label)" + return "Jump to \(activeAgentEntry.displayName), \(activeAgentEntry.displayState.label)" } } diff --git a/supacodeTests/ActiveAgentsFeatureTests.swift b/supacodeTests/ActiveAgentsFeatureTests.swift index 241ae379..89e6e437 100644 --- a/supacodeTests/ActiveAgentsFeatureTests.swift +++ b/supacodeTests/ActiveAgentsFeatureTests.swift @@ -100,7 +100,7 @@ struct ActiveAgentsFeatureTests { ) } - @Test func rowIconUsesDetectedCommandTokenBeforeAgentFallback() { + @Test func rowDisplayUsesDetectedCommandTokenBeforeAgentFallback() { let ompEntry = entry( id: UUID(0), state: .idle, @@ -109,6 +109,7 @@ struct ActiveAgentsFeatureTests { iconLookupToken: "omp" ) #expect(ompEntry.iconSource?.assetName == "OMP") + #expect(ompEntry.displayName == "omp") let fallbackEntry = entry( id: UUID(1), @@ -118,6 +119,16 @@ struct ActiveAgentsFeatureTests { iconLookupToken: "unknown-wrapper" ) #expect(fallbackEntry.iconSource?.assetName == "Pi") + #expect(fallbackEntry.displayName == "pi") + + let cursorEntry = entry( + id: UUID(2), + state: .idle, + changedAt: Date(timeIntervalSince1970: 10), + agent: .cursor, + iconLookupToken: "agent" + ) + #expect(cursorEntry.displayName == "cursor") } @Test func navigationReturnsNilForEmptyList() {