UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

1,079 lines (1,078 loc) 31 kB
import { c as normalizeOptionalString } from "./string-coerce-mnp54Vah.js"; import { _ as uniqueStrings } from "./string-normalization-WNUDCpXX.js"; import { c as isRecord } from "./utils-CCC-BEJH.js"; import { n as MANIFEST_KEY } from "./legacy-names-NIXaj2oi.js"; //#endregion //#region src/plugins/official-external-plugin-catalog.ts /** Reads official external plugin/channel/provider catalogs into manifest-like metadata. */ const OFFICIAL_CATALOG_SOURCES = [ { entries: [ { "name": "@wecom/wecom-openclaw-plugin", "description": "OpenClaw WeCom channel plugin by the Tencent WeCom team.", "source": "external", "kind": "channel", "openclaw": { "plugin": { "id": "wecom-openclaw-plugin", "label": "WeCom" }, "contracts": { "tools": ["wecom_mcp"] }, "channel": { "id": "wecom", "label": "WeCom", "selectionLabel": "WeCom(企业微信)", "detailLabel": "WeCom", "docsPath": "/plugins/community#wecom", "docsLabel": "wecom", "blurb": "Enterprise messaging and documents, scheduling, task tools.", "aliases": [ "qywx", "wework", "enterprise-wechat" ], "order": 45 }, "channelConfigs": { "wecom": { "label": "WeCom", "description": "Enterprise WeChat conversation channel.", "schema": { "type": "object", "additionalProperties": true } } }, "install": { "npmSpec": "@wecom/wecom-openclaw-plugin@2026.5.7", "defaultChoice": "npm", "expectedIntegrity": "sha512-TCkP9as00WfEhgFWG8YL/rcmaWGIshAki2HQh83nTRccGfVBCoGjrEboTTqq3yDmK9koWTV11zi8u8A4dNtvug==" } } }, { "name": "openclaw-plugin-yuanbao", "description": "OpenClaw Yuanbao channel plugin by the Tencent Yuanbao team.", "source": "external", "kind": "channel", "openclaw": { "plugin": { "id": "openclaw-plugin-yuanbao", "label": "Yuanbao" }, "contracts": { "tools": [ "query_group_info", "query_session_members", "yuanbao_remind" ] }, "channel": { "id": "yuanbao", "label": "Yuanbao", "selectionLabel": "Yuanbao (元宝)", "detailLabel": "Yuanbao", "docsPath": "/plugins/community#yuanbao", "docsLabel": "yuanbao", "blurb": "Tencent Yuanbao AI assistant conversation channel.", "aliases": [ "yuanbao", "yb", "tencent-yuanbao", "元宝" ], "order": 85 }, "channelConfigs": { "yuanbao": { "label": "Yuanbao", "description": "Tencent Yuanbao AI assistant channel.", "schema": { "type": "object", "additionalProperties": true } } }, "install": { "npmSpec": "openclaw-plugin-yuanbao@2.13.1", "defaultChoice": "npm", "expectedIntegrity": "sha512-lH2I9/nsmrg7l0YJJSQhOSpWMEFBAa6FwKbZcRLDFHDT2+mOZkHa44XE+8KYN4VmorlUdAxHzpZQmVr7C98IuA==" } } }, { "name": "@tencent-weixin/openclaw-weixin", "description": "OpenClaw Weixin channel plugin by the Tencent Weixin team.", "source": "external", "kind": "channel", "openclaw": { "plugin": { "id": "openclaw-weixin", "label": "Weixin" }, "channel": { "id": "openclaw-weixin", "label": "Weixin", "selectionLabel": "Weixin(微信)", "detailLabel": "Weixin", "docsPath": "/channels/wechat", "docsLabel": "weixin", "blurb": "Personal WeChat messaging via QR-code login.", "aliases": [ "weixin", "wechat", "微信" ], "order": 75 }, "channelConfigs": { "openclaw-weixin": { "label": "Weixin", "description": "Personal WeChat conversation channel.", "schema": { "type": "object", "additionalProperties": true } } }, "install": { "npmSpec": "@tencent-weixin/openclaw-weixin@2.4.3", "defaultChoice": "npm", "expectedIntegrity": "sha512-dPQbidUNWigC6V10vGW4i+GLH09x+6zUhafZRjuxkJ9GDu8o62WBsnUTojp4KqUH756hz+t2v9khiCRSi0dBDw==", "minHostVersion": ">=2026.3.22" } } }, { "name": "@openclaw/discord", "description": "OpenClaw Discord channel plugin", "source": "official", "kind": "channel", "openclaw": { "channel": { "id": "discord", "label": "Discord", "selectionLabel": "Discord (Bot API)", "detailLabel": "Discord Bot", "docsPath": "/channels/discord", "docsLabel": "discord", "blurb": "very well supported right now.", "systemImage": "bubble.left.and.bubble.right", "markdownCapable": true, "preferSessionLookupForAnnounceTarget": true }, "install": { "npmSpec": "@openclaw/discord", "defaultChoice": "npm", "minHostVersion": ">=2026.4.10", "allowInvalidConfigRecovery": true } } }, { "name": "@openclaw/feishu", "description": "OpenClaw Feishu/Lark channel plugin", "source": "official", "kind": "channel", "openclaw": { "channel": { "id": "feishu", "label": "Feishu", "selectionLabel": "Feishu/Lark (飞书)", "docsPath": "/channels/feishu", "docsLabel": "feishu", "blurb": "飞书/Lark enterprise messaging with doc/wiki/drive tools.", "aliases": ["lark"], "order": 35, "quickstartAllowFrom": true }, "install": { "npmSpec": "@openclaw/feishu", "defaultChoice": "npm", "minHostVersion": ">=2026.5.29" } } }, { "name": "@openclaw/googlechat", "description": "OpenClaw Google Chat channel plugin", "source": "official", "kind": "channel", "openclaw": { "channel": { "id": "googlechat", "label": "Google Chat", "selectionLabel": "Google Chat (Chat API)", "detailLabel": "Google Chat", "docsPath": "/channels/googlechat", "docsLabel": "googlechat", "blurb": "Google Workspace Chat app with HTTP webhook.", "aliases": ["gchat", "google-chat"], "order": 55, "systemImage": "message.badge", "markdownCapable": true, "doctorCapabilities": { "dmAllowFromMode": "nestedOnly", "groupModel": "route", "groupAllowFromFallbackToAllowFrom": false, "warnOnEmptyGroupSenderAllowlist": false }, "cliAddOptions": [ { "flags": "--webhook-path <path>", "description": "Google Chat webhook path" }, { "flags": "--webhook-url <url>", "description": "Google Chat webhook URL" }, { "flags": "--audience-type <type>", "description": "Google Chat audience type (app-url|project-number)" }, { "flags": "--audience <value>", "description": "Google Chat audience value (app URL or project number)" } ] }, "install": { "npmSpec": "@openclaw/googlechat", "defaultChoice": "npm", "minHostVersion": ">=2026.4.10" } } }, { "name": "@openclaw/line", "description": "OpenClaw LINE channel plugin", "source": "official", "kind": "channel", "openclaw": { "channel": { "id": "line", "label": "LINE", "selectionLabel": "LINE (Messaging API)", "detailLabel": "LINE Bot", "docsPath": "/channels/line", "docsLabel": "line", "blurb": "LINE Messaging API webhook bot.", "systemImage": "message", "order": 75, "quickstartAllowFrom": true }, "install": { "npmSpec": "@openclaw/line", "defaultChoice": "npm", "minHostVersion": ">=2026.4.10" } } }, { "name": "@openclaw/matrix", "description": "OpenClaw Matrix channel plugin", "source": "official", "kind": "channel", "openclaw": { "channel": { "id": "matrix", "label": "Matrix", "selectionLabel": "Matrix (plugin)", "docsPath": "/channels/matrix", "docsLabel": "matrix", "blurb": "open protocol; install the plugin to enable.", "order": 70, "markdownCapable": true, "quickstartAllowFrom": true, "doctorCapabilities": { "dmAllowFromMode": "nestedOnly", "groupModel": "sender", "groupAllowFromFallbackToAllowFrom": false, "warnOnEmptyGroupSenderAllowlist": true }, "cliAddOptions": [ { "flags": "--homeserver <url>", "description": "Matrix homeserver URL" }, { "flags": "--user-id <id>", "description": "Matrix user ID" }, { "flags": "--access-token <token>", "description": "Matrix access token" }, { "flags": "--device-name <name>", "description": "Matrix device name" }, { "flags": "--initial-sync-limit <n>", "description": "Matrix initial sync limit" } ] }, "install": { "clawhubSpec": "clawhub:@openclaw/matrix", "npmSpec": "@openclaw/matrix", "defaultChoice": "clawhub", "minHostVersion": ">=2026.4.10", "allowInvalidConfigRecovery": true } } }, { "name": "@openclaw/msteams", "description": "OpenClaw Microsoft Teams channel plugin", "source": "official", "kind": "channel", "openclaw": { "channel": { "id": "msteams", "label": "Microsoft Teams", "selectionLabel": "Microsoft Teams (Teams SDK)", "docsPath": "/channels/msteams", "docsLabel": "msteams", "blurb": "Teams SDK; enterprise support.", "aliases": ["teams"], "order": 60 }, "install": { "npmSpec": "@openclaw/msteams", "defaultChoice": "npm", "minHostVersion": ">=2026.4.10" } } }, { "name": "@openclaw/nextcloud-talk", "description": "OpenClaw Nextcloud Talk channel plugin", "source": "official", "kind": "channel", "openclaw": { "channel": { "id": "nextcloud-talk", "label": "Nextcloud Talk", "selectionLabel": "Nextcloud Talk (self-hosted)", "docsPath": "/channels/nextcloud-talk", "docsLabel": "nextcloud-talk", "blurb": "Self-hosted chat via Nextcloud Talk webhook bots.", "aliases": ["nc-talk", "nc"], "order": 65, "quickstartAllowFrom": true }, "install": { "npmSpec": "@openclaw/nextcloud-talk", "defaultChoice": "npm", "minHostVersion": ">=2026.4.10" } } }, { "name": "@openclaw/nostr", "description": "OpenClaw Nostr channel plugin for NIP-04 encrypted DMs", "source": "official", "kind": "channel", "openclaw": { "channel": { "id": "nostr", "label": "Nostr", "selectionLabel": "Nostr (NIP-04 DMs)", "docsPath": "/channels/nostr", "docsLabel": "nostr", "blurb": "Decentralized protocol; encrypted DMs via NIP-04.", "order": 55, "quickstartAllowFrom": true }, "install": { "npmSpec": "@openclaw/nostr", "defaultChoice": "npm", "minHostVersion": ">=2026.4.10" } } }, { "name": "@openclaw/qqbot", "description": "OpenClaw QQ Bot channel plugin", "source": "official", "kind": "channel", "openclaw": { "channel": { "id": "qqbot", "label": "QQ Bot", "selectionLabel": "QQ Bot (Official API)", "detailLabel": "QQ Bot", "docsPath": "/channels/qqbot", "docsLabel": "qqbot", "blurb": "connect to QQ via official QQ Bot API with group chat and direct message support.", "systemImage": "bubble.left.and.bubble.right" }, "install": { "npmSpec": "@openclaw/qqbot", "defaultChoice": "npm", "minHostVersion": ">=2026.4.10" } } }, { "name": "@openclaw/slack", "description": "OpenClaw Slack channel plugin", "source": "official", "kind": "channel", "openclaw": { "channel": { "id": "slack", "label": "Slack", "selectionLabel": "Slack (Socket Mode)", "detailLabel": "Slack Bot", "docsPath": "/channels/slack", "docsLabel": "slack", "blurb": "supported (Socket Mode).", "systemImage": "number", "markdownCapable": true }, "channelConfigs": { "slack": { "label": "Slack", "description": "Slack channel, DM, command, and app event integration.", "schema": { "type": "object", "additionalProperties": true } } }, "install": { "npmSpec": "@openclaw/slack", "defaultChoice": "npm", "minHostVersion": ">=2026.5.12-beta.1", "allowInvalidConfigRecovery": true } } }, { "name": "@openclaw/synology-chat", "description": "Synology Chat channel plugin for OpenClaw", "source": "official", "kind": "channel", "openclaw": { "channel": { "id": "synology-chat", "label": "Synology Chat", "selectionLabel": "Synology Chat (Webhook)", "docsPath": "/channels/synology-chat", "docsLabel": "synology-chat", "blurb": "Connect your Synology NAS Chat to OpenClaw with full agent capabilities.", "order": 90 }, "install": { "npmSpec": "@openclaw/synology-chat", "defaultChoice": "npm", "minHostVersion": ">=2026.4.10" } } }, { "name": "@openclaw/tlon", "description": "OpenClaw Tlon/Urbit channel plugin", "source": "official", "kind": "channel", "openclaw": { "channel": { "id": "tlon", "label": "Tlon", "selectionLabel": "Tlon (Urbit)", "docsPath": "/channels/tlon", "docsLabel": "tlon", "blurb": "decentralized messaging on Urbit; install the plugin to enable.", "order": 90, "quickstartAllowFrom": true }, "install": { "npmSpec": "@openclaw/tlon", "defaultChoice": "npm", "minHostVersion": ">=2026.4.10" } } }, { "name": "@openclaw/twitch", "description": "OpenClaw Twitch channel plugin", "source": "official", "kind": "channel", "openclaw": { "channel": { "id": "twitch", "label": "Twitch", "selectionLabel": "Twitch (Chat)", "docsPath": "/channels/twitch", "blurb": "Twitch chat integration", "aliases": ["twitch-chat"] }, "install": { "npmSpec": "@openclaw/twitch", "defaultChoice": "npm", "minHostVersion": ">=2026.4.10" } } }, { "name": "@openclaw/whatsapp", "description": "OpenClaw WhatsApp channel plugin", "source": "official", "kind": "channel", "openclaw": { "channel": { "id": "whatsapp", "label": "WhatsApp", "selectionLabel": "WhatsApp (QR link)", "detailLabel": "WhatsApp Web", "docsPath": "/channels/whatsapp", "docsLabel": "whatsapp", "blurb": "works with your own number; recommend a separate phone + eSIM.", "systemImage": "message" }, "install": { "clawhubSpec": "clawhub:@openclaw/whatsapp", "npmSpec": "@openclaw/whatsapp", "defaultChoice": "clawhub", "minHostVersion": ">=2026.4.25" } } }, { "name": "@openclaw/zalo", "description": "OpenClaw Zalo channel plugin", "source": "official", "kind": "channel", "openclaw": { "channel": { "id": "zalo", "label": "Zalo", "selectionLabel": "Zalo (Bot API)", "docsPath": "/channels/zalo", "docsLabel": "zalo", "blurb": "Vietnam-focused messaging platform with Bot API.", "aliases": ["zl"], "order": 80, "quickstartAllowFrom": true }, "install": { "npmSpec": "@openclaw/zalo", "defaultChoice": "npm", "minHostVersion": ">=2026.4.10" } } }, { "name": "@openclaw/zalouser", "description": "OpenClaw Zalo Personal Account plugin via native zca-js integration", "source": "official", "kind": "channel", "openclaw": { "channel": { "id": "zalouser", "label": "Zalo Personal", "selectionLabel": "Zalo (Personal Account)", "docsPath": "/channels/zalouser", "docsLabel": "zalouser", "blurb": "Zalo personal account via QR code login.", "aliases": ["zlu"], "order": 85, "quickstartAllowFrom": false }, "install": { "npmSpec": "@openclaw/zalouser", "defaultChoice": "npm", "minHostVersion": ">=2026.4.10" } } } ] }, { entries: [ { "name": "@openclaw/amazon-bedrock-provider", "description": "OpenClaw Amazon Bedrock provider plugin", "source": "official", "kind": "provider", "openclaw": { "plugin": { "id": "amazon-bedrock", "label": "Amazon Bedrock" }, "providers": [{ "id": "amazon-bedrock", "name": "Amazon Bedrock", "docs": "/providers/bedrock", "categories": ["cloud", "llm"] }], "install": { "npmSpec": "@openclaw/amazon-bedrock-provider", "defaultChoice": "npm", "minHostVersion": ">=2026.5.12-beta.1" } } }, { "name": "@openclaw/amazon-bedrock-mantle-provider", "description": "OpenClaw Amazon Bedrock Mantle provider plugin", "source": "official", "kind": "provider", "openclaw": { "plugin": { "id": "amazon-bedrock-mantle", "label": "Amazon Bedrock Mantle" }, "providers": [{ "id": "amazon-bedrock-mantle", "name": "Amazon Bedrock Mantle", "docs": "/providers/bedrock-mantle", "categories": ["cloud", "llm"] }], "install": { "npmSpec": "@openclaw/amazon-bedrock-mantle-provider", "defaultChoice": "npm", "minHostVersion": ">=2026.5.12-beta.1" } } }, { "name": "@openclaw/anthropic-vertex-provider", "description": "OpenClaw Anthropic Vertex provider plugin", "source": "official", "kind": "provider", "openclaw": { "plugin": { "id": "anthropic-vertex", "label": "Anthropic Vertex" }, "providers": [{ "id": "anthropic-vertex", "name": "Anthropic Vertex", "docs": "/providers/models", "categories": ["cloud", "llm"] }], "install": { "npmSpec": "@openclaw/anthropic-vertex-provider", "defaultChoice": "npm", "minHostVersion": ">=2026.5.12-beta.1" } } }, { "name": "@openclaw/codex", "description": "OpenClaw Codex harness and model provider plugin", "source": "official", "kind": "provider", "openclaw": { "plugin": { "id": "codex", "label": "Codex" }, "providers": [{ "id": "codex", "name": "Codex", "docs": "/providers/models", "categories": ["cloud", "llm"], "authChoices": [{ "method": "app-server", "choiceId": "codex", "choiceLabel": "Codex app-server", "choiceHint": "Use the Codex app-server runtime and managed model catalog.", "assistantPriority": -40, "groupId": "codex", "groupLabel": "Codex", "groupHint": "Codex app-server model provider", "onboardingScopes": ["text-inference"] }] }], "install": { "npmSpec": "@openclaw/codex", "defaultChoice": "npm", "minHostVersion": ">=2026.5.1-beta.1" } } }, { "name": "@openclaw/pixverse-provider", "description": "OpenClaw PixVerse video provider plugin", "source": "official", "kind": "provider", "openclaw": { "plugin": { "id": "pixverse", "label": "PixVerse" }, "providers": [{ "id": "pixverse", "name": "PixVerse", "docs": "/providers/pixverse", "categories": ["cloud", "video"], "authChoices": [{ "method": "api-key", "choiceId": "pixverse-api-key", "choiceLabel": "PixVerse API key", "choiceHint": "Wizard prompts for International or CN endpoint.", "groupId": "pixverse", "groupLabel": "PixVerse", "groupHint": "Video generation", "optionKey": "pixverseApiKey", "cliFlag": "--pixverse-api-key", "cliOption": "--pixverse-api-key <key>", "cliDescription": "PixVerse API key", "onboardingScopes": ["image-generation"] }] }], "install": { "npmSpec": "@openclaw/pixverse-provider", "defaultChoice": "npm", "minHostVersion": ">=2026.5.26" } } } ] }, { entries: [ { "name": "@openclaw/acpx", "description": "OpenClaw ACP runtime backend", "source": "official", "kind": "plugin", "openclaw": { "plugin": { "id": "acpx", "label": "ACPX Runtime" }, "install": { "npmSpec": "@openclaw/acpx", "defaultChoice": "npm", "minHostVersion": ">=2026.4.25" } } }, { "name": "@openclaw/brave-plugin", "description": "OpenClaw Brave plugin", "source": "official", "kind": "plugin", "openclaw": { "plugin": { "id": "brave", "label": "Brave" }, "webSearchProviders": [{ "id": "brave", "label": "Brave Search", "hint": "Brave Search web results.", "onboardingScopes": ["text-inference"], "credentialLabel": "Brave Search API key", "envVars": ["BRAVE_API_KEY"], "placeholder": "BSA...", "signupUrl": "https://api-dashboard.search.brave.com/app/keys", "docsUrl": "https://docs.openclaw.ai/tools/brave-search", "credentialPath": "plugins.entries.brave.config.webSearch.apiKey", "autoDetectOrder": 10 }], "install": { "npmSpec": "@openclaw/brave-plugin", "defaultChoice": "npm", "minHostVersion": ">=2026.4.10", "allowInvalidConfigRecovery": true } } }, { "name": "@openclaw/copilot", "description": "OpenClaw GitHub Copilot agent runtime plugin", "source": "official", "kind": "plugin", "openclaw": { "plugin": { "id": "copilot", "label": "GitHub Copilot agent runtime" }, "install": { "clawhubSpec": "clawhub:@openclaw/copilot", "npmSpec": "@openclaw/copilot", "defaultChoice": "npm", "minHostVersion": ">=2026.5.28" } } }, { "name": "@openclaw/diagnostics-otel", "description": "OpenClaw diagnostics OpenTelemetry exporter", "source": "official", "kind": "plugin", "openclaw": { "plugin": { "id": "diagnostics-otel", "label": "Diagnostics OpenTelemetry" }, "install": { "clawhubSpec": "clawhub:@openclaw/diagnostics-otel", "npmSpec": "@openclaw/diagnostics-otel", "defaultChoice": "npm", "minHostVersion": ">=2026.4.25" } } }, { "name": "@openclaw/diagnostics-prometheus", "description": "OpenClaw diagnostics Prometheus exporter", "source": "official", "kind": "plugin", "openclaw": { "plugin": { "id": "diagnostics-prometheus", "label": "Diagnostics Prometheus" }, "install": { "clawhubSpec": "clawhub:@openclaw/diagnostics-prometheus", "npmSpec": "@openclaw/diagnostics-prometheus", "defaultChoice": "npm", "minHostVersion": ">=2026.4.25" } } }, { "name": "@openclaw/diffs", "description": "OpenClaw diff viewer plugin", "source": "official", "kind": "plugin", "openclaw": { "plugin": { "id": "diffs", "label": "Diffs" }, "install": { "npmSpec": "@openclaw/diffs", "defaultChoice": "npm", "minHostVersion": ">=2026.4.30" } } }, { "name": "@openclaw/diffs-language-pack", "description": "OpenClaw diffs viewer syntax highlighting language pack", "source": "official", "kind": "plugin", "openclaw": { "plugin": { "id": "diffs-language-pack", "label": "Diff Viewer Language Pack" }, "install": { "npmSpec": "@openclaw/diffs-language-pack", "clawhubSpec": "clawhub:@openclaw/diffs-language-pack", "defaultChoice": "npm", "minHostVersion": ">=2026.5.27" } } }, { "name": "@openclaw/google-meet", "description": "OpenClaw Google Meet participant plugin", "source": "official", "kind": "plugin", "openclaw": { "plugin": { "id": "google-meet", "label": "Google Meet" }, "install": { "npmSpec": "@openclaw/google-meet", "defaultChoice": "npm", "minHostVersion": ">=2026.4.20" } } }, { "name": "@openclaw/lobster", "description": "Lobster workflow tool plugin (typed pipelines + resumable approvals)", "source": "official", "kind": "plugin", "openclaw": { "plugin": { "id": "lobster", "label": "Lobster" }, "install": { "npmSpec": "@openclaw/lobster", "defaultChoice": "npm", "minHostVersion": ">=2026.4.25" } } }, { "name": "@openclaw/memory-lancedb", "description": "OpenClaw LanceDB-backed long-term memory plugin with auto-recall/capture", "source": "official", "kind": "plugin", "openclaw": { "plugin": { "id": "memory-lancedb", "label": "Memory LanceDB" }, "install": { "npmSpec": "@openclaw/memory-lancedb", "defaultChoice": "npm", "minHostVersion": ">=2026.5.31" } } }, { "name": "@openclaw/llama-cpp-provider", "description": "OpenClaw llama.cpp embedding provider plugin", "source": "official", "kind": "plugin", "openclaw": { "plugin": { "id": "llama-cpp", "label": "llama.cpp Provider" }, "contracts": { "embeddingProviders": ["local"] }, "install": { "npmSpec": "@openclaw/llama-cpp-provider", "defaultChoice": "npm", "minHostVersion": ">=2026.6.2" } } }, { "name": "@openclaw/openshell-sandbox", "description": "OpenClaw OpenShell sandbox backend", "source": "official", "kind": "plugin", "openclaw": { "plugin": { "id": "openshell", "label": "OpenShell Sandbox" }, "install": { "npmSpec": "@openclaw/openshell-sandbox", "defaultChoice": "npm", "minHostVersion": ">=2026.5.12-beta.1" } } }, { "name": "@openclaw/pixverse-provider", "description": "OpenClaw PixVerse video generation provider plugin", "source": "official", "kind": "plugin", "openclaw": { "plugin": { "id": "pixverse", "label": "PixVerse" }, "install": { "clawhubSpec": "clawhub:@openclaw/pixverse-provider", "npmSpec": "@openclaw/pixverse-provider", "defaultChoice": "npm", "minHostVersion": ">=2026.5.26" } } }, { "name": "@openclaw/tokenjuice", "description": "OpenClaw tokenjuice exec output compaction plugin", "source": "official", "kind": "plugin", "openclaw": { "plugin": { "id": "tokenjuice", "label": "Tokenjuice" }, "install": { "clawhubSpec": "clawhub:@openclaw/tokenjuice", "npmSpec": "@openclaw/tokenjuice", "defaultChoice": "npm", "minHostVersion": ">=2026.5.28" } } }, { "name": "@openclaw/voice-call", "description": "OpenClaw voice-call plugin", "source": "official", "kind": "plugin", "openclaw": { "plugin": { "id": "voice-call", "label": "Voice Call" }, "install": { "npmSpec": "@openclaw/voice-call", "defaultChoice": "npm", "minHostVersion": ">=2026.4.10" } } } ] } ]; function parseCatalogEntries(raw) { if (Array.isArray(raw)) return raw.filter((entry) => isRecord(entry)); if (!isRecord(raw)) return []; const list = raw.entries ?? raw.packages ?? raw.plugins; if (!Array.isArray(list)) return []; return list.filter((entry) => isRecord(entry)); } function normalizeDefaultChoice(value) { return value === "clawhub" || value === "npm" || value === "local" ? value : void 0; } /** Returns manifest metadata from an official external catalog entry when present. */ function getOfficialExternalPluginCatalogManifest(entry) { const manifest = entry[MANIFEST_KEY]; return isRecord(manifest) ? manifest : void 0; } function resolveOfficialExternalPluginId(entry) { const manifest = getOfficialExternalPluginCatalogManifest(entry); return normalizeOptionalString(manifest?.plugin?.id) ?? normalizeOptionalString(manifest?.channel?.id) ?? normalizeOptionalString(manifest?.providers?.[0]?.id); } function resolveOfficialExternalPluginLookupIds(entry) { const manifest = getOfficialExternalPluginCatalogManifest(entry); return uniqueStrings([ normalizeOptionalString(manifest?.plugin?.id), normalizeOptionalString(manifest?.channel?.id), normalizeOptionalString(manifest?.providers?.[0]?.id) ].filter((value) => Boolean(value))); } function resolveOfficialExternalPluginLabel(entry) { const manifest = getOfficialExternalPluginCatalogManifest(entry); return normalizeOptionalString(manifest?.plugin?.label) ?? normalizeOptionalString(manifest?.channel?.label) ?? normalizeOptionalString(manifest?.providers?.[0]?.name) ?? normalizeOptionalString(entry.name) ?? resolveOfficialExternalPluginId(entry) ?? "plugin"; } function resolveOfficialExternalPluginInstall(entry) { const install = getOfficialExternalPluginCatalogManifest(entry)?.install; const clawhubSpec = normalizeOptionalString(install?.clawhubSpec); const npmSpec = normalizeOptionalString(install?.npmSpec) ?? normalizeOptionalString(entry.name); const localPath = normalizeOptionalString(install?.localPath); if (!clawhubSpec && !npmSpec && !localPath) return null; const defaultChoice = normalizeDefaultChoice(install?.defaultChoice) ?? (npmSpec ? "npm" : clawhubSpec ? "clawhub" : localPath ? "local" : void 0); return { ...clawhubSpec ? { clawhubSpec } : {}, ...npmSpec ? { npmSpec } : {}, ...localPath ? { localPath } : {}, ...defaultChoice ? { defaultChoice } : {}, ...install?.minHostVersion ? { minHostVersion: install.minHostVersion } : {}, ...install?.expectedIntegrity ? { expectedIntegrity: install.expectedIntegrity } : {}, ...install?.allowInvalidConfigRecovery === true ? { allowInvalidConfigRecovery: true } : {} }; } function listOfficialExternalPluginCatalogEntries() { const entries = OFFICIAL_CATALOG_SOURCES.flatMap((source) => parseCatalogEntries(source)); const resolved = /* @__PURE__ */ new Map(); for (const entry of entries) { const pluginId = resolveOfficialExternalPluginId(entry); const key = pluginId ? `${entry.kind ?? "plugin"}:${pluginId}` : entry.name ?? ""; if (key && !resolved.has(key)) resolved.set(key, entry); } return [...resolved.values()]; } function listOfficialExternalChannelCatalogEntries() { return listOfficialExternalPluginCatalogEntries().filter((entry) => Boolean(getOfficialExternalPluginCatalogManifest(entry)?.channel)); } function listOfficialExternalProviderCatalogEntries() { return listOfficialExternalPluginCatalogEntries().filter((entry) => (getOfficialExternalPluginCatalogManifest(entry)?.providers?.length ?? 0) > 0); } function getOfficialExternalPluginCatalogEntry(pluginId) { const normalized = pluginId.trim(); if (!normalized) return; return listOfficialExternalPluginCatalogEntries().find((entry) => resolveOfficialExternalPluginLookupIds(entry).includes(normalized)); } function getOfficialExternalPluginCatalogEntryForPackage(packageName) { const normalized = packageName?.trim(); if (!normalized) return; return listOfficialExternalPluginCatalogEntries().find((entry) => normalizeOptionalString(entry.name) === normalized); } //#endregion export { listOfficialExternalPluginCatalogEntries as a, resolveOfficialExternalPluginInstall as c, listOfficialExternalChannelCatalogEntries as i, resolveOfficialExternalPluginLabel as l, getOfficialExternalPluginCatalogEntryForPackage as n, listOfficialExternalProviderCatalogEntries as o, getOfficialExternalPluginCatalogManifest as r, resolveOfficialExternalPluginId as s, getOfficialExternalPluginCatalogEntry as t };