Skip to content

use multi-harness cloud agent icons + status#9263

Open
harryalbert wants to merge 1 commit intomasterfrom
harry/remote-1458-add-claude-specific-icons-for-cloud-mode-in-vertical-tabs
Open

use multi-harness cloud agent icons + status#9263
harryalbert wants to merge 1 commit intomasterfrom
harry/remote-1458-add-claude-specific-icons-for-cloud-mode-in-vertical-tabs

Conversation

@harryalbert
Copy link
Copy Markdown
Contributor

@harryalbert harryalbert commented Apr 28, 2026

Description

Given the fact that we're planning on accommodating multiple variants of cloud agents, we need to change the agent icons in the conversation list, notifications, pane header, and vertical tabs to support different harnesses. Peter drew up some mocks for this, and we'll use the new icon + status variants across all of these surfaces.

Testing

demo: https://www.loom.com/share/066e5842bf0541fa808925100cc6529e

Agent Mode

  • Warp Agent Mode - This PR was created via Warp's AI Agent Mode

@cla-bot cla-bot Bot added the cla-signed label Apr 28, 2026
Copy link
Copy Markdown
Contributor Author

This stack of pull requests is managed by Graphite. Learn more about stacking.

@harryalbert harryalbert changed the title add cloud agent icons use multi-harness cloud agent icons Apr 28, 2026
@harryalbert harryalbert changed the title use multi-harness cloud agent icons use multi-harness cloud agent icons + status Apr 28, 2026
@harryalbert harryalbert marked this pull request as ready for review April 28, 2026 17:29
@oz-for-oss
Copy link
Copy Markdown
Contributor

oz-for-oss Bot commented Apr 28, 2026

@harryalbert

I'm starting a first review of this pull request.

I completed the review and posted feedback on this pull request.

Comment /oz-review on this pull request to retrigger a review (up to 3 times on the same pull request).

You can view the conversation on Warp.

I completed the review and posted feedback on this pull request.

Comment /oz-review on this pull request to retrigger a review (up to 3 times on the same pull request).

Powered by Oz

Copy link
Copy Markdown
Contributor

@oz-for-oss oz-for-oss Bot left a comment

Choose a reason for hiding this comment

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

Overview

This PR centralizes agent icon derivation and rendering across vertical tabs, pane headers, conversation-list rows, and notifications, adding cloud-lobe/status handling for multiple harnesses plus tests and specs for REMOTE-1458.

Concerns

  • The new harness-to-CLI mapping is not gated by FeatureFlag::AgentHarness, so existing or persisted non-Oz harness data can still display Claude/Gemini/OpenCode icons when the feature is disabled, contrary to the PR's flag-off validation.
  • Neutral/non-agent icons now reuse the agent-specific proportional renderer, shrinking plain terminal/code/file icons in vertical tabs even though non-agent surfaces are supposed to remain visually unchanged.

Verdict

Found: 0 critical, 2 important, 0 suggestions

Request changes

Comment /oz-review on this pull request to retrigger a review (up to 3 times on the same pull request).

Powered by Oz

Comment thread app/src/ui_components/agent_icon.rs
Comment on lines +134 to +142
IconWithStatusVariant::Neutral { icon, icon_color } => render_circle(
icon.to_warpui_icon(icon_color).finish(),
internal_colors::fg_overlay_2(theme),
total_size,
),
IconWithStatusVariant::NeutralElement { icon_element } => render_circle(
icon_element,
internal_colors::fg_overlay_2(theme),
total_size,
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.

⚠️ [IMPORTANT] Neutral variants now use the agent-specific sizing ratios, which shrinks plain terminal/code/file tab icons from the previous full-size neutral circle/glyph to roughly 0.76 * total_size / 0.43 * total_size. Preserve the old neutral sizing or apply these ratios only to agent variants so non-agent surfaces remain visually unchanged.

@harryalbert harryalbert requested review from zachbai and removed request for zachbai April 29, 2026 23:06
@harryalbert harryalbert force-pushed the harry/remote-1458-add-claude-specific-icons-for-cloud-mode-in-vertical-tabs branch from ad8dd0f to aacac62 Compare April 30, 2026 19:31
oz-for-oss[bot]
oz-for-oss Bot previously requested changes Apr 30, 2026
Copy link
Copy Markdown
Contributor

@oz-for-oss oz-for-oss Bot left a comment

Choose a reason for hiding this comment

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

Overview

This PR centralizes agent icon derivation and rendering across vertical tabs, pane headers, the conversation list, and notifications, while adding harness/name helpers and cross-surface tests.

Concerns

  • CLIAgent::from_harness omits Harness::Codex, so the new match is non-exhaustive and the app will not compile.
  • Unknown/future harnesses are filtered out and then fall through to the Oz ambient branch, which mislabels non-Oz harnesses as Oz despite the new harness parser documenting Unknown as non-Oz.
  • The new proportional circle helper returns only the 76% inner circle for no-overlay variants, so neutral/statusless icons no longer occupy the requested vertical-tab/list/header footprint.
  • Supplemental security pass found no additional security-specific issues.

Verdict

Found: 1 critical, 2 important, 0 suggestions

Request changes

Comment /oz-review on this pull request to retrigger a review (up to 3 times on the same pull request).

Powered by Oz

Comment on lines +171 to +176
Harness::Oz => None,
Harness::Claude => Some(CLIAgent::Claude),
Harness::Gemini => Some(CLIAgent::Gemini),
Harness::OpenCode => Some(CLIAgent::OpenCode),
Harness::Unknown => Some(CLIAgent::Unknown),
}
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.

🚨 [CRITICAL] This match omits Harness::Codex, so the new function is non-exhaustive and the crate will not compile.

Suggested change
Harness::Oz => None,
Harness::Claude => Some(CLIAgent::Claude),
Harness::Gemini => Some(CLIAgent::Gemini),
Harness::OpenCode => Some(CLIAgent::OpenCode),
Harness::Unknown => Some(CLIAgent::Unknown),
}
Harness::Oz => None,
Harness::Claude => Some(CLIAgent::Claude),
Harness::Gemini => Some(CLIAgent::Gemini),
Harness::OpenCode => Some(CLIAgent::OpenCode),
Harness::Codex => Some(CLIAgent::Codex),
Harness::Unknown => Some(CLIAgent::Unknown),

if inputs.is_ambient {
if let Some(agent) = inputs
.ambient_selected_third_party_cli_agent
.filter(|agent| !matches!(agent, CLIAgent::Unknown))
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.

⚠️ [IMPORTANT] Filtering CLIAgent::Unknown makes an ambient run with a future/unknown harness fall through to the Oz branch below, so non-Oz harnesses are mislabeled as Oz; preserve an explicit unknown/non-Oz variant instead.

/// Builds the brand-circle container around `icon_element`. The circle's diameter is
/// `circle_size(total)` and the icon glyph is `icon_size(total)`, with the rest going
/// to symmetric padding around the glyph.
fn render_circle(
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.

⚠️ [IMPORTANT] render_circle returns only circle_size(total_size) (76% of the requested size), and no-overlay callers return it directly, so neutral/statusless icons shrink instead of occupying the requested 24/32px footprint.

@harryalbert harryalbert dismissed oz-for-oss[bot]’s stale review April 30, 2026 19:41

oz for oss shouldn't be requesting changes

let name = String::deserialize(deserializer)?;
Ok(harness_from_name(&name))
let harness = Harness::from_config_name(&name);
if matches!(harness, Harness::Unknown) && name != Harness::Unknown.config_name() {
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.

i dont understand this name != Harness::Unknown.config_name()?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants