fix(desktop): use licensed preset harness logos

Replace the incorrect Oh My Posh and Dify marks with the exact upstream Oh My Pi and Kimi Code assets. Use xAI’s official Grok logomark under its nominative brand terms, with presentation-only backgrounds for marks that need contrast.

Remove the unproven Cursor bitmap and deliberately retain the generic terminal fallback because Cursor publishes assets without granting redistribution permission. Record exact provenance and keep the drift guard explicit about that exception.

Co-authored-by: Tyler Longwell <tlongwell@block.xyz>
Signed-off-by: Tyler Longwell <tlongwell@block.xyz>
This commit is contained in:
Tyler Longwell
2026-07-25 12:55:23 -04:00
parent 7405bcd2f9
commit 005828c3fd
9 changed files with 50 additions and 7 deletions
+8 -2
View File
@@ -11,6 +11,12 @@ license permits redistribution.
|---|---|---|---|---|---|
| `hermes.png` | [NousResearch/hermes-agent](https://github.com/NousResearch/hermes-agent) | `6ad632b` | MIT © 2025 Nous Research | `website/static/img/logo.png` | Cropped the baked-in border frame, padded to square, resized to 64×64, quantised to a 16-colour palette |
| `openclaw.svg` | [openclaw/openclaw](https://github.com/openclaw/openclaw) | `b06f40a` | MIT © 2026 OpenClaw Foundation | `ui/public/favicon.svg` | Removed the SMIL animation elements (renders the upstream rest pose statically — verified pixel-identical to the upstream frame at t=0); minified paths |
| `omp.svg` | [can1357/oh-my-pi](https://github.com/can1357/oh-my-pi) | `667111575ebba136dadfd6989379e7f67e0d40d9` | MIT © 2025 Mario Zechner; © 2025–2026 Can Bölük | `assets/icon.svg` | None |
| `kimi.png` | [MoonshotAI/kimi-cli](https://github.com/MoonshotAI/kimi-cli) | `4a550effdfcb29a25a5d325bf935296cc50cd417` | Apache-2.0; NOTICE: Kimi Code CLI © 2025 Moonshot AI | `web/public/logo.png` | None |
| `grok.svg` | [SpaceXAI brand guidelines](https://x.ai/legal/brand-guidelines) | Retrieved 2026-07-25 | xAI Brand Guidelines: marks may be used to accurately refer to xAI or its services; logos must be used exactly as provided | `SpaceXAI_Grok_Assets.zip` → `Grok_Logomark_Dark.svg` | None |
`amp.png`, `cursor.png`, `grok.png`, `kimi.png`, `omp.png`, and `opencode.svg`
predate this file; their provenance was not recorded when they were added.
`amp.png` and `opencode.svg` predate this file; their provenance was not
recorded when they were added. Cursor intentionally uses the generic terminal
fallback: Cursor's official brand page offers downloadable assets, but neither
that page nor its Terms of Service grants third parties permission to
redistribute them. The previous unproven `cursor.png` was removed.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

+4
View File
@@ -0,0 +1,4 @@
<svg width="1024" height="1024" viewBox="0 0 1024 1024" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M395.479 633.828L735.91 381.105C752.599 368.715 776.454 373.548 784.406 392.792C826.26 494.285 807.561 616.253 724.288 699.996C641.016 783.739 525.151 802.104 419.247 760.277L303.556 814.143C469.49 928.202 670.987 899.995 796.901 773.282C896.776 672.843 927.708 535.937 898.785 412.476L899.047 412.739C857.105 231.37 909.358 158.874 1016.4 10.6326C1018.93 7.11771 1021.47 3.60279 1024 0L883.144 141.651V141.212L395.392 633.916" fill="#0A0A0A"/>
<path d="M325.226 695.251C206.128 580.84 226.662 403.776 328.285 301.668C403.431 226.097 526.549 195.254 634.026 240.596L749.454 186.994C728.657 171.88 702.007 155.623 671.424 144.2C533.19 86.9942 367.693 115.465 255.323 228.382C147.234 337.081 113.244 504.215 171.613 646.833C215.216 753.423 143.739 828.818 71.7385 904.916C46.2237 931.893 20.6216 958.87 0 987.429L325.139 695.339" fill="#0A0A0A"/>
</svg>

After

Width:  |  Height:  |  Size: 965 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

+16
View File
@@ -0,0 +1,16 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 90" width="120" height="90">
<!-- Pi symbol with plugin connector -->
<!-- Horizontal bar -->
<rect x="10" y="8" width="100" height="12" rx="2" fill="#fafafa"/>
<!-- Left leg -->
<rect x="25" y="20" width="12" height="62" rx="2" fill="#fafafa"/>
<!-- Right leg -->
<rect x="75" y="20" width="12" height="45" rx="2" fill="#fafafa"/>
<!-- Plugin connector -->
<rect x="71" y="55" width="20" height="16" rx="3" fill="#f97316"/>
<rect x="76" y="59" width="3" height="8" rx="1" fill="#0d0d0d"/>
<rect x="82" y="59" width="3" height="8" rx="1" fill="#0d0d0d"/>
<!-- Decorative dots -->
<circle cx="18" cy="14" r="2" fill="#f97316" opacity="0.8"/>
<circle cx="102" cy="14" r="2" fill="#f97316" opacity="0.8"/>
</svg>

After

Width:  |  Height:  |  Size: 795 B

@@ -19,9 +19,8 @@ const RUNTIME_LOGOS: Record<string, string> = {
// Public-path logos for bundled presets. Served from /harness-logos/ at runtime.
// Keys match the preset `id` values emitted by the backend PRESET_HARNESSES.
export const PRESET_LOGOS: Record<string, string> = {
cursor: "/harness-logos/cursor.png",
omp: "/harness-logos/omp.png",
grok: "/harness-logos/grok.png",
omp: "/harness-logos/omp.svg",
grok: "/harness-logos/grok.svg",
opencode: "/harness-logos/opencode.svg",
kimi: "/harness-logos/kimi.png",
amp: "/harness-logos/amp.png",
@@ -55,8 +54,9 @@ export function RuntimeIcon({
const { isDark } = useTheme();
// Only use bundled logo maps — never render user-supplied avatar URLs for
// custom/preset entries (tracking pixel / spoofing vector, security line).
const id = runtime.id.trim().toLowerCase();
const imageUrl = getRuntimeLogoUrl(runtime);
const shouldForceForegroundColor = !imageUrl && runtime.id === "goose";
const shouldForceForegroundColor = !imageUrl && id === "goose";
if (isBuzzRuntime(runtime)) {
return <BuzzMark className="h-7 w-10 text-foreground" />;
@@ -69,6 +69,8 @@ export function RuntimeIcon({
className={cn(
"rounded-md object-contain",
className,
id === "omp" && "bg-[#0d0d0d] p-1",
id === "grok" && "bg-white p-1",
shouldForceForegroundColor &&
(isDark ? "brightness-0 invert" : "brightness-0"),
)}
@@ -46,9 +46,24 @@ test("PRESET_HARNESSES parse found the preset ids", () => {
);
});
const FALLBACK_ONLY_PRESETS = new Set([
// Cursor publishes official assets, but neither its brand page nor terms grant
// third parties permission to redistribute them. Keep the generic icon.
"cursor",
]);
for (const id of presetIds) {
test(`preset "${id}" has a bundled logo`, () => {
test(`preset "${id}" has a bundled logo or an approved fallback`, () => {
const logoPath = PRESET_LOGOS[id];
if (FALLBACK_ONLY_PRESETS.has(id)) {
assert.equal(
logoPath,
undefined,
`preset "${id}" must keep the generic TerminalSquare fallback until ` +
"its vendor grants logo redistribution permission",
);
return;
}
assert.ok(
logoPath,
`preset "${id}" has no PRESET_LOGOS entry — it renders the generic ` +