feat: add bundled plugin icon manifest URLs (#95845)

This commit is contained in:
Patrick Erichsen
2026-06-22 22:14:18 -07:00
committed by GitHub
parent 7668a72843
commit 0a97f73402
47 changed files with 70 additions and 0 deletions
+1
View File
@@ -191,6 +191,7 @@ or npm install metadata. Those belong in your plugin code and `package.json`.
| `skills` | No | `string[]` | Skill directories to load, relative to the plugin root. |
| `name` | No | `string` | Human-readable plugin name. |
| `description` | No | `string` | Short summary shown in plugin surfaces. |
| `icon` | No | `string` | HTTPS image URL for marketplace/catalog cards. ClawHub accepts any valid `https://` URL and falls back to the default plugin icon when this is omitted or invalid. |
| `version` | No | `string` | Informational plugin version. |
| `uiHints` | No | `Record<string, object>` | UI labels, placeholders, and sensitivity hints for config fields. |
+1
View File
@@ -1,5 +1,6 @@
{
"id": "alibaba",
"icon": "https://cdn.simpleicons.org/alibabacloud/111111",
"activation": {
"onStartup": false
},
@@ -2,6 +2,7 @@
"id": "anthropic-vertex",
"name": "Anthropic Vertex",
"description": "OpenClaw Anthropic Vertex provider plugin for Claude models on Google Vertex AI.",
"icon": "https://cdn.simpleicons.org/anthropic/111111",
"activation": {
"onStartup": false
},
@@ -1,5 +1,6 @@
{
"id": "anthropic",
"icon": "https://cdn.simpleicons.org/anthropic/111111",
"activation": {
"onStartup": false
},
+1
View File
@@ -2,6 +2,7 @@
"id": "brave",
"name": "Brave",
"description": "OpenClaw Brave Search provider plugin for web search.",
"icon": "https://cdn.simpleicons.org/brave/111111",
"activation": {
"onStartup": false
},
@@ -1,5 +1,6 @@
{
"id": "cloudflare-ai-gateway",
"icon": "https://cdn.simpleicons.org/cloudflare/111111",
"activation": {
"onStartup": false
},
@@ -1,5 +1,6 @@
{
"id": "copilot-proxy",
"icon": "https://cdn.simpleicons.org/githubcopilot/111111",
"activation": {
"onStartup": false
},
+1
View File
@@ -2,6 +2,7 @@
"id": "copilot",
"name": "GitHub Copilot agent runtime",
"description": "Registers the GitHub Copilot agent runtime.",
"icon": "https://cdn.simpleicons.org/githubcopilot/111111",
"version": "2026.6.2",
"activation": {
"onStartup": false,
+1
View File
@@ -1,5 +1,6 @@
{
"id": "deepgram",
"icon": "https://cdn.simpleicons.org/deepgram/111111",
"activation": {
"onStartup": false
},
+1
View File
@@ -1,5 +1,6 @@
{
"id": "deepseek",
"icon": "https://cdn.simpleicons.org/deepseek/111111",
"activation": {
"onStartup": false
},
+1
View File
@@ -2,6 +2,7 @@
"id": "discord",
"name": "Discord",
"description": "OpenClaw Discord channel plugin for channels, DMs, commands, and app events.",
"icon": "https://cdn.simpleicons.org/discord/111111",
"skills": ["./skills"],
"activation": {
"onStartup": false
@@ -1,5 +1,6 @@
{
"id": "duckduckgo",
"icon": "https://cdn.simpleicons.org/duckduckgo/111111",
"activation": {
"onStartup": false
},
@@ -1,5 +1,6 @@
{
"id": "elevenlabs",
"icon": "https://cdn.simpleicons.org/elevenlabs/111111",
"activation": {
"onStartup": false
},
@@ -2,6 +2,7 @@
"id": "google-meet",
"name": "Google Meet",
"description": "OpenClaw Google Meet participant plugin for joining calls through Chrome or Twilio transports.",
"icon": "https://cdn.simpleicons.org/googlemeet/111111",
"enabledByDefault": false,
"commandAliases": [{ "name": "googlemeet" }],
"activation": {
+1
View File
@@ -1,5 +1,6 @@
{
"id": "google",
"icon": "https://cdn.simpleicons.org/google/111111",
"activation": {
"onStartup": false
},
@@ -2,6 +2,7 @@
"id": "googlechat",
"name": "Google Chat",
"description": "OpenClaw Google Chat channel plugin for spaces and direct messages.",
"icon": "https://cdn.simpleicons.org/googlechat/111111",
"activation": {
"onStartup": false
},
@@ -1,5 +1,6 @@
{
"id": "huggingface",
"icon": "https://cdn.simpleicons.org/huggingface/111111",
"activation": {
"onStartup": false
},
+1
View File
@@ -1,5 +1,6 @@
{
"id": "imessage",
"icon": "https://cdn.simpleicons.org/imessage/111111",
"activation": {
"onStartup": false
},
+1
View File
@@ -2,6 +2,7 @@
"id": "line",
"name": "LINE",
"description": "OpenClaw LINE channel plugin for LINE Bot API chats.",
"icon": "https://cdn.simpleicons.org/line/111111",
"activation": {
"onStartup": false
},
+1
View File
@@ -1,5 +1,6 @@
{
"id": "lmstudio",
"icon": "https://cdn.simpleicons.org/lmstudio/111111",
"activation": {
"onStartup": false
},
+1
View File
@@ -2,6 +2,7 @@
"id": "matrix",
"name": "Matrix",
"description": "OpenClaw Matrix channel plugin for rooms and direct messages.",
"icon": "https://cdn.simpleicons.org/matrix/111111",
"commandAliases": [{ "name": "matrix" }],
"activation": {
"onStartup": false,
@@ -1,5 +1,6 @@
{
"id": "mattermost",
"icon": "https://cdn.simpleicons.org/mattermost/111111",
"activation": {
"onStartup": false
},
+1
View File
@@ -1,5 +1,6 @@
{
"id": "minimax",
"icon": "https://cdn.simpleicons.org/minimax/111111",
"activation": {
"onStartup": false
},
+1
View File
@@ -1,5 +1,6 @@
{
"id": "mistral",
"icon": "https://cdn.simpleicons.org/mistralai/111111",
"activation": {
"onStartup": false
},
@@ -2,6 +2,7 @@
"id": "nextcloud-talk",
"name": "Nextcloud Talk",
"description": "OpenClaw Nextcloud Talk channel plugin for conversations.",
"icon": "https://cdn.simpleicons.org/nextcloud/111111",
"activation": {
"onStartup": false
},
+1
View File
@@ -1,5 +1,6 @@
{
"id": "nvidia",
"icon": "https://cdn.simpleicons.org/nvidia/111111",
"activation": {
"onStartup": false
},
+1
View File
@@ -1,5 +1,6 @@
{
"id": "ollama",
"icon": "https://cdn.simpleicons.org/ollama/111111",
"activation": {
"onStartup": false
},
@@ -1,5 +1,6 @@
{
"id": "opencode-go",
"icon": "https://cdn.simpleicons.org/opencode/111111",
"activation": {
"onStartup": false
},
+1
View File
@@ -1,5 +1,6 @@
{
"id": "opencode",
"icon": "https://cdn.simpleicons.org/opencode/111111",
"activation": {
"onStartup": false
},
@@ -1,5 +1,6 @@
{
"id": "openrouter",
"icon": "https://cdn.simpleicons.org/openrouter/111111",
"activation": {
"onStartup": false
},
@@ -1,5 +1,6 @@
{
"id": "perplexity",
"icon": "https://cdn.simpleicons.org/perplexity/111111",
"activation": {
"onStartup": false
},
+1
View File
@@ -1,5 +1,6 @@
{
"id": "qianfan",
"icon": "https://cdn.simpleicons.org/baidu/111111",
"activation": {
"onStartup": false
},
+1
View File
@@ -2,6 +2,7 @@
"id": "qqbot",
"name": "QQ Bot",
"description": "OpenClaw QQ Bot channel plugin for group and direct-message workflows.",
"icon": "https://cdn.simpleicons.org/qq/111111",
"activation": {
"onStartup": false
},
+1
View File
@@ -1,5 +1,6 @@
{
"id": "qwen",
"icon": "https://cdn.simpleicons.org/qwen/111111",
"activation": {
"onStartup": false
},
+1
View File
@@ -1,5 +1,6 @@
{
"id": "searxng",
"icon": "https://cdn.simpleicons.org/searxng/111111",
"activation": {
"onStartup": false
},
+1
View File
@@ -1,5 +1,6 @@
{
"id": "signal",
"icon": "https://cdn.simpleicons.org/signal/111111",
"activation": {
"onStartup": false
},
@@ -2,6 +2,7 @@
"id": "synology-chat",
"name": "Synology Chat",
"description": "Synology Chat channel plugin for OpenClaw channels and direct messages.",
"icon": "https://cdn.simpleicons.org/synology/111111",
"activation": {
"onStartup": false
},
+1
View File
@@ -1,5 +1,6 @@
{
"id": "telegram",
"icon": "https://cdn.simpleicons.org/telegram/111111",
"activation": {
"onStartup": false
},
+1
View File
@@ -2,6 +2,7 @@
"id": "twitch",
"name": "Twitch",
"description": "OpenClaw Twitch channel plugin for chat and moderation workflows.",
"icon": "https://cdn.simpleicons.org/twitch/111111",
"activation": {
"onStartup": false
},
@@ -1,5 +1,6 @@
{
"id": "vercel-ai-gateway",
"icon": "https://cdn.simpleicons.org/vercel/111111",
"activation": {
"onStartup": false
},
+1
View File
@@ -2,6 +2,7 @@
"id": "whatsapp",
"name": "WhatsApp",
"description": "OpenClaw WhatsApp channel plugin for WhatsApp Web chats.",
"icon": "https://cdn.simpleicons.org/whatsapp/111111",
"skills": ["./skills"],
"activation": {
"onStartup": false
+1
View File
@@ -1,5 +1,6 @@
{
"id": "xiaomi",
"icon": "https://cdn.simpleicons.org/xiaomi/111111",
"activation": {
"onStartup": false
},
+1
View File
@@ -2,6 +2,7 @@
"id": "zalo",
"name": "Zalo",
"description": "OpenClaw Zalo channel plugin for bot and webhook chats.",
"icon": "https://cdn.simpleicons.org/zalo/111111",
"activation": {
"onStartup": false
},
+1
View File
@@ -2,6 +2,7 @@
"id": "zalouser",
"name": "Zalo Personal",
"description": "OpenClaw Zalo Personal Account plugin via native zca-js integration.",
"icon": "https://cdn.simpleicons.org/zalo/111111",
"activation": {
"onStartup": false
},
+20
View File
@@ -458,6 +458,26 @@ describe("loadPluginManifestRegistry", () => {
expect(manifestChangeCase.secondName).toBe("After");
});
it("preserves optional manifest icon URLs on registry records", () => {
const dir = makeTempDir();
writeManifest(dir, {
id: "icon-demo",
name: "Icon Demo",
icon: "https://cdn.simpleicons.org/simpleicons/111111",
configSchema: { type: "object" },
});
const registry = loadRegistry([
createPluginCandidate({
idHint: "icon-demo",
rootDir: dir,
origin: "bundled",
}),
]);
expect(registry.plugins[0]?.icon).toBe("https://cdn.simpleicons.org/simpleicons/111111");
});
it("keeps only the higher-precedence plugin for truly distinct duplicates", () => {
const dirA = makeTempDir();
const dirB = makeTempDir();
+2
View File
@@ -201,6 +201,7 @@ export type PluginManifestRecord = {
id: string;
name?: string;
description?: string;
icon?: string;
version?: string;
packageName?: string;
packageVersion?: string;
@@ -487,6 +488,7 @@ function buildRecord(params: {
name: normalizeOptionalString(params.manifest.name) ?? params.candidate.packageName,
description:
normalizeOptionalString(params.manifest.description) ?? params.candidate.packageDescription,
icon: normalizeOptionalString(params.manifest.icon),
version: normalizeOptionalString(params.manifest.version) ?? params.candidate.packageVersion,
packageName: params.candidate.packageName,
packageVersion: params.candidate.packageVersion,
+4
View File
@@ -376,6 +376,8 @@ export type PluginManifest = {
skills?: string[];
name?: string;
description?: string;
/** Optional HTTPS URL for marketplace/catalog card artwork. */
icon?: string;
version?: string;
uiHints?: Record<string, PluginConfigUiHint>;
/**
@@ -1764,6 +1766,7 @@ export function loadPluginManifest(
);
const name = normalizeOptionalString(raw.name);
const description = normalizeOptionalString(raw.description);
const icon = normalizeOptionalString(raw.icon);
const version = normalizeOptionalString(raw.version);
const channels = normalizeTrimmedStringList(raw.channels);
const providers = normalizeTrimmedStringList(raw.providers);
@@ -1856,6 +1859,7 @@ export function loadPluginManifest(
skills,
name,
description,
icon,
version,
uiHints,
contracts,