diff --git a/desktop/public/harness-logos/CREDITS.md b/desktop/public/harness-logos/CREDITS.md index f3a53a13b..654a6b742 100644 --- a/desktop/public/harness-logos/CREDITS.md +++ b/desktop/public/harness-logos/CREDITS.md @@ -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. diff --git a/desktop/public/harness-logos/cursor.png b/desktop/public/harness-logos/cursor.png deleted file mode 100644 index 9888d570c..000000000 Binary files a/desktop/public/harness-logos/cursor.png and /dev/null differ diff --git a/desktop/public/harness-logos/grok.png b/desktop/public/harness-logos/grok.png deleted file mode 100644 index 0e1ceee6a..000000000 Binary files a/desktop/public/harness-logos/grok.png and /dev/null differ diff --git a/desktop/public/harness-logos/grok.svg b/desktop/public/harness-logos/grok.svg new file mode 100644 index 000000000..642d7b6b0 --- /dev/null +++ b/desktop/public/harness-logos/grok.svg @@ -0,0 +1,4 @@ + + + + diff --git a/desktop/public/harness-logos/kimi.png b/desktop/public/harness-logos/kimi.png index 8ca21cc77..033c0f4fb 100644 Binary files a/desktop/public/harness-logos/kimi.png and b/desktop/public/harness-logos/kimi.png differ diff --git a/desktop/public/harness-logos/omp.png b/desktop/public/harness-logos/omp.png deleted file mode 100644 index 2c9bf588a..000000000 Binary files a/desktop/public/harness-logos/omp.png and /dev/null differ diff --git a/desktop/public/harness-logos/omp.svg b/desktop/public/harness-logos/omp.svg new file mode 100644 index 000000000..f1ccf2a08 --- /dev/null +++ b/desktop/public/harness-logos/omp.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/desktop/src/features/onboarding/ui/RuntimeIcon.tsx b/desktop/src/features/onboarding/ui/RuntimeIcon.tsx index 3cee0be9a..2debea409 100644 --- a/desktop/src/features/onboarding/ui/RuntimeIcon.tsx +++ b/desktop/src/features/onboarding/ui/RuntimeIcon.tsx @@ -19,9 +19,8 @@ const RUNTIME_LOGOS: Record = { // 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 = { - 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 ; @@ -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"), )} diff --git a/desktop/src/features/onboarding/ui/presetLogos.test.mjs b/desktop/src/features/onboarding/ui/presetLogos.test.mjs index 81b22ec8b..6f477fff6 100644 --- a/desktop/src/features/onboarding/ui/presetLogos.test.mjs +++ b/desktop/src/features/onboarding/ui/presetLogos.test.mjs @@ -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 ` +