mirror of
https://github.com/openclaw/openclaw.git
synced 2026-08-12 21:53:00 -06:00
feat: add bundled plugin icon manifest URLs (#95845)
This commit is contained in:
@@ -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,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
|
||||
},
|
||||
|
||||
@@ -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
|
||||
},
|
||||
|
||||
@@ -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,5 +1,6 @@
|
||||
{
|
||||
"id": "deepgram",
|
||||
"icon": "https://cdn.simpleicons.org/deepgram/111111",
|
||||
"activation": {
|
||||
"onStartup": false
|
||||
},
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"id": "deepseek",
|
||||
"icon": "https://cdn.simpleicons.org/deepseek/111111",
|
||||
"activation": {
|
||||
"onStartup": false
|
||||
},
|
||||
|
||||
@@ -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,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,5 +1,6 @@
|
||||
{
|
||||
"id": "imessage",
|
||||
"icon": "https://cdn.simpleicons.org/imessage/111111",
|
||||
"activation": {
|
||||
"onStartup": false
|
||||
},
|
||||
|
||||
@@ -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,5 +1,6 @@
|
||||
{
|
||||
"id": "lmstudio",
|
||||
"icon": "https://cdn.simpleicons.org/lmstudio/111111",
|
||||
"activation": {
|
||||
"onStartup": false
|
||||
},
|
||||
|
||||
@@ -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,5 +1,6 @@
|
||||
{
|
||||
"id": "minimax",
|
||||
"icon": "https://cdn.simpleicons.org/minimax/111111",
|
||||
"activation": {
|
||||
"onStartup": false
|
||||
},
|
||||
|
||||
@@ -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,5 +1,6 @@
|
||||
{
|
||||
"id": "nvidia",
|
||||
"icon": "https://cdn.simpleicons.org/nvidia/111111",
|
||||
"activation": {
|
||||
"onStartup": false
|
||||
},
|
||||
|
||||
@@ -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,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,5 +1,6 @@
|
||||
{
|
||||
"id": "qianfan",
|
||||
"icon": "https://cdn.simpleicons.org/baidu/111111",
|
||||
"activation": {
|
||||
"onStartup": false
|
||||
},
|
||||
|
||||
@@ -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,5 +1,6 @@
|
||||
{
|
||||
"id": "qwen",
|
||||
"icon": "https://cdn.simpleicons.org/qwen/111111",
|
||||
"activation": {
|
||||
"onStartup": false
|
||||
},
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"id": "searxng",
|
||||
"icon": "https://cdn.simpleicons.org/searxng/111111",
|
||||
"activation": {
|
||||
"onStartup": false
|
||||
},
|
||||
|
||||
@@ -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,5 +1,6 @@
|
||||
{
|
||||
"id": "telegram",
|
||||
"icon": "https://cdn.simpleicons.org/telegram/111111",
|
||||
"activation": {
|
||||
"onStartup": false
|
||||
},
|
||||
|
||||
@@ -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
|
||||
},
|
||||
|
||||
@@ -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,5 +1,6 @@
|
||||
{
|
||||
"id": "xiaomi",
|
||||
"icon": "https://cdn.simpleicons.org/xiaomi/111111",
|
||||
"activation": {
|
||||
"onStartup": false
|
||||
},
|
||||
|
||||
@@ -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
|
||||
},
|
||||
|
||||
@@ -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
|
||||
},
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user