From def84feb446428e6f7d251cd4b12ff4660b2348e Mon Sep 17 00:00:00 2001
From: RCD <90105158+Finesssee@users.noreply.github.com>
Date: Sun, 11 Oct 2026 22:12:04 +0700
Subject: [PATCH] Add CLI dashboard icons for the 7 new providers
Embed the upstream v0.73.0 ProviderIcon SVGs for clawrouter, ibmbob, langdock, lithosai, museai, synthetic and workbuddy so the serve dashboard shows their brand icons instead of the neutral dot.
---
rust/src/cli/serve/dashboard/icons.rs | 53 +++++++++++++++++--
.../icons/ProviderIcon-clawrouter.svg | 7 +++
.../dashboard/icons/ProviderIcon-ibmbob.svg | 23 ++++++++
.../dashboard/icons/ProviderIcon-langdock.svg | 4 ++
.../dashboard/icons/ProviderIcon-lithosai.svg | 1 +
.../dashboard/icons/ProviderIcon-museai.svg | 3 ++
.../icons/ProviderIcon-synthetic.svg | 14 +++++
.../icons/ProviderIcon-workbuddy.svg | 1 +
8 files changed, 102 insertions(+), 4 deletions(-)
create mode 100644 rust/src/cli/serve/dashboard/icons/ProviderIcon-clawrouter.svg
create mode 100644 rust/src/cli/serve/dashboard/icons/ProviderIcon-ibmbob.svg
create mode 100644 rust/src/cli/serve/dashboard/icons/ProviderIcon-langdock.svg
create mode 100644 rust/src/cli/serve/dashboard/icons/ProviderIcon-lithosai.svg
create mode 100644 rust/src/cli/serve/dashboard/icons/ProviderIcon-museai.svg
create mode 100644 rust/src/cli/serve/dashboard/icons/ProviderIcon-synthetic.svg
create mode 100644 rust/src/cli/serve/dashboard/icons/ProviderIcon-workbuddy.svg
diff --git a/rust/src/cli/serve/dashboard/icons.rs b/rust/src/cli/serve/dashboard/icons.rs
index cd95719095..25fb521cb2 100644
--- a/rust/src/cli/serve/dashboard/icons.rs
+++ b/rust/src/cli/serve/dashboard/icons.rs
@@ -4,7 +4,7 @@
//! route as static brand art — no account data, so no auth; immutable per
//! binary, so aggressively cacheable (`Cache-Control: public, max-age=86400,
//! immutable`, upstream's exact policy). Assets are the pinned upstream SVGs
-//! (`upstream v0.48.0: Sources/CodexBar/Resources/ProviderIcon-*.svg`), embedded
+//! (`upstream v0.48.0+: Sources/CodexBar/Resources/ProviderIcon-*.svg`), embedded
//! with `include_bytes!` so the CLI ships as a standalone binary, mirroring
//! upstream's reason for embedding (`CLIServeProviderIcons`).
//! Upstream regenerates its table with `Scripts/generate_serve_provider_icons.py`;
@@ -97,6 +97,10 @@ static ICONS: &[(&str, &[u8])] = &[
"ProviderIcon-claude",
include_bytes!("icons/ProviderIcon-claude.svg"),
),
+ (
+ "ProviderIcon-clawrouter",
+ include_bytes!("icons/ProviderIcon-clawrouter.svg"),
+ ),
(
"ProviderIcon-clinepass",
include_bytes!("icons/ProviderIcon-clinepass.svg"),
@@ -173,6 +177,10 @@ static ICONS: &[(&str, &[u8])] = &[
"ProviderIcon-huggingface",
include_bytes!("icons/ProviderIcon-huggingface.svg"),
),
+ (
+ "ProviderIcon-ibmbob",
+ include_bytes!("icons/ProviderIcon-ibmbob.svg"),
+ ),
(
"ProviderIcon-jetbrains",
include_bytes!("icons/ProviderIcon-jetbrains.svg"),
@@ -189,10 +197,18 @@ static ICONS: &[(&str, &[u8])] = &[
"ProviderIcon-kiro",
include_bytes!("icons/ProviderIcon-kiro.svg"),
),
+ (
+ "ProviderIcon-langdock",
+ include_bytes!("icons/ProviderIcon-langdock.svg"),
+ ),
(
"ProviderIcon-litellm",
include_bytes!("icons/ProviderIcon-litellm.svg"),
),
+ (
+ "ProviderIcon-lithosai",
+ include_bytes!("icons/ProviderIcon-lithosai.svg"),
+ ),
(
"ProviderIcon-llmman",
include_bytes!("icons/ProviderIcon-llmman.svg"),
@@ -225,6 +241,10 @@ static ICONS: &[(&str, &[u8])] = &[
"ProviderIcon-muse",
include_bytes!("icons/ProviderIcon-muse.svg"),
),
+ (
+ "ProviderIcon-museai",
+ include_bytes!("icons/ProviderIcon-museai.svg"),
+ ),
(
"ProviderIcon-neuralwatt",
include_bytes!("icons/ProviderIcon-neuralwatt.svg"),
@@ -289,6 +309,10 @@ static ICONS: &[(&str, &[u8])] = &[
"ProviderIcon-sub2api",
include_bytes!("icons/ProviderIcon-sub2api.svg"),
),
+ (
+ "ProviderIcon-synthetic",
+ include_bytes!("icons/ProviderIcon-synthetic.svg"),
+ ),
(
"ProviderIcon-t3chat",
include_bytes!("icons/ProviderIcon-t3chat.svg"),
@@ -313,6 +337,10 @@ static ICONS: &[(&str, &[u8])] = &[
"ProviderIcon-windsurf",
include_bytes!("icons/ProviderIcon-windsurf.svg"),
),
+ (
+ "ProviderIcon-workbuddy",
+ include_bytes!("icons/ProviderIcon-workbuddy.svg"),
+ ),
(
"ProviderIcon-xai",
include_bytes!("icons/ProviderIcon-xai.svg"),
@@ -386,8 +414,21 @@ mod tests {
"/icons/ProviderIcon-qwencloud.svg"
);
assert!(obj.get("openaiapi").is_none(), "no asset -> no entry");
- assert!(obj.get("clawrouter").is_none(), "no such local provider");
- assert!(obj.get("synthetic").is_none(), "no such local provider");
+ for id in [
+ "clawrouter",
+ "ibmbob",
+ "langdock",
+ "lithosai",
+ "museai",
+ "synthetic",
+ "workbuddy",
+ ] {
+ assert_eq!(
+ obj.get(id).unwrap(),
+ &format!("/icons/ProviderIcon-{id}.svg"),
+ "{id}"
+ );
+ }
let keys: Vec<&String> = obj.keys().collect();
let mut sorted = keys.clone();
sorted.sort();
@@ -408,7 +449,11 @@ mod tests {
Some("ProviderIcon-qwencloud")
);
assert_eq!(icon_resource_for("codex"), Some("ProviderIcon-codex"));
- assert!(icon_resource_for("clawrouter").is_none());
+ assert_eq!(
+ icon_resource_for("clawrouter"),
+ Some("ProviderIcon-clawrouter")
+ );
+ assert!(icon_resource_for("openaiapi").is_none());
assert!(icon_resource_for("../etc").is_none());
}
}
diff --git a/rust/src/cli/serve/dashboard/icons/ProviderIcon-clawrouter.svg b/rust/src/cli/serve/dashboard/icons/ProviderIcon-clawrouter.svg
new file mode 100644
index 0000000000..f8718f87e9
--- /dev/null
+++ b/rust/src/cli/serve/dashboard/icons/ProviderIcon-clawrouter.svg
@@ -0,0 +1,7 @@
+
diff --git a/rust/src/cli/serve/dashboard/icons/ProviderIcon-ibmbob.svg b/rust/src/cli/serve/dashboard/icons/ProviderIcon-ibmbob.svg
new file mode 100644
index 0000000000..70367244e9
--- /dev/null
+++ b/rust/src/cli/serve/dashboard/icons/ProviderIcon-ibmbob.svg
@@ -0,0 +1,23 @@
+
diff --git a/rust/src/cli/serve/dashboard/icons/ProviderIcon-langdock.svg b/rust/src/cli/serve/dashboard/icons/ProviderIcon-langdock.svg
new file mode 100644
index 0000000000..6d80ebd4cc
--- /dev/null
+++ b/rust/src/cli/serve/dashboard/icons/ProviderIcon-langdock.svg
@@ -0,0 +1,4 @@
+
diff --git a/rust/src/cli/serve/dashboard/icons/ProviderIcon-lithosai.svg b/rust/src/cli/serve/dashboard/icons/ProviderIcon-lithosai.svg
new file mode 100644
index 0000000000..326e97efaa
--- /dev/null
+++ b/rust/src/cli/serve/dashboard/icons/ProviderIcon-lithosai.svg
@@ -0,0 +1 @@
+
diff --git a/rust/src/cli/serve/dashboard/icons/ProviderIcon-museai.svg b/rust/src/cli/serve/dashboard/icons/ProviderIcon-museai.svg
new file mode 100644
index 0000000000..e20c8275b9
--- /dev/null
+++ b/rust/src/cli/serve/dashboard/icons/ProviderIcon-museai.svg
@@ -0,0 +1,3 @@
+
diff --git a/rust/src/cli/serve/dashboard/icons/ProviderIcon-synthetic.svg b/rust/src/cli/serve/dashboard/icons/ProviderIcon-synthetic.svg
new file mode 100644
index 0000000000..b50f4da2cc
--- /dev/null
+++ b/rust/src/cli/serve/dashboard/icons/ProviderIcon-synthetic.svg
@@ -0,0 +1,14 @@
+
diff --git a/rust/src/cli/serve/dashboard/icons/ProviderIcon-workbuddy.svg b/rust/src/cli/serve/dashboard/icons/ProviderIcon-workbuddy.svg
new file mode 100644
index 0000000000..2097127bcd
--- /dev/null
+++ b/rust/src/cli/serve/dashboard/icons/ProviderIcon-workbuddy.svg
@@ -0,0 +1 @@
+