fix(plugins): catalog externalized npm installs

This commit is contained in:
Vincent Koc
2026-05-02 13:20:26 -07:00
parent 0fad53a192
commit d4268b1b2b
17 changed files with 1100 additions and 42 deletions

View File

@@ -47,6 +47,357 @@
"expectedIntegrity": "sha512-lYmBrU71ox3v7dzRqaltvzTXPcMjjgYrNqpBj5HIBkXgEFkXRRG8wplXg9Fub41/FjsSPn3WAbYpdTc+k+jsHg=="
}
}
},
{
"name": "@openclaw/bluebubbles",
"description": "OpenClaw BlueBubbles channel plugin",
"source": "official",
"kind": "channel",
"openclaw": {
"channel": {
"id": "bluebubbles",
"label": "BlueBubbles",
"selectionLabel": "BlueBubbles (macOS app)",
"detailLabel": "BlueBubbles",
"docsPath": "/channels/bluebubbles",
"docsLabel": "bluebubbles",
"blurb": "iMessage via the BlueBubbles mac app + REST API.",
"aliases": ["bb"],
"preferOver": ["imessage"],
"systemImage": "bubble.left.and.text.bubble.right",
"order": 75
},
"install": {
"npmSpec": "@openclaw/bluebubbles",
"defaultChoice": "npm",
"minHostVersion": ">=2026.4.10"
}
}
},
{
"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"
}
}
},
{
"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.4.25"
}
}
},
{
"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,
"quickstartAllowFrom": true
},
"install": {
"npmSpec": "@openclaw/matrix",
"defaultChoice": "npm",
"minHostVersion": ">=2026.4.10",
"allowInvalidConfigRecovery": true
}
}
},
{
"name": "@openclaw/mattermost",
"description": "OpenClaw Mattermost channel plugin",
"source": "official",
"kind": "channel",
"openclaw": {
"channel": {
"id": "mattermost",
"label": "Mattermost",
"selectionLabel": "Mattermost (plugin)",
"docsPath": "/channels/mattermost",
"docsLabel": "mattermost",
"blurb": "self-hosted Slack-style chat; install the plugin to enable.",
"order": 65
},
"install": {
"npmSpec": "@openclaw/mattermost",
"defaultChoice": "npm",
"minHostVersion": ">=2026.4.10"
}
}
},
{
"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/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": {
"npmSpec": "@openclaw/whatsapp",
"defaultChoice": "npm",
"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"
}
}
}
]
}

View File

@@ -0,0 +1,142 @@
{
"entries": [
{
"name": "@openclaw/brave-plugin",
"description": "OpenClaw Brave plugin",
"source": "official",
"kind": "plugin",
"openclaw": {
"plugin": {
"id": "brave",
"label": "Brave"
},
"install": {
"npmSpec": "@openclaw/brave-plugin",
"defaultChoice": "npm",
"minHostVersion": ">=2026.4.10"
}
}
},
{
"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/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.4.10"
}
}
},
{
"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"
}
}
}
]
}

View File

@@ -0,0 +1,30 @@
{
"entries": [
{
"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": []
}
],
"install": {
"npmSpec": "@openclaw/codex",
"defaultChoice": "npm",
"minHostVersion": ">=2026.5.1-beta.1"
}
}
}
]
}

View File

@@ -26,6 +26,14 @@ const CORE_PROD_REQUIRED_PATHS = [
path: "scripts/lib/official-external-channel-catalog.json",
whenPresent: "src/channels/plugins/catalog.ts",
},
{
path: "scripts/lib/official-external-plugin-catalog.json",
whenPresent: "src/plugins/official-external-plugin-catalog.ts",
},
{
path: "scripts/lib/official-external-provider-catalog.json",
whenPresent: "src/plugins/official-external-plugin-catalog.ts",
},
{
path: "scripts/lib/plugin-sdk-entrypoints.json",
whenPresent: "src/plugin-sdk/entrypoints.ts",

View File

@@ -55,6 +55,9 @@ const requiredPathGroups = [
...WORKSPACE_TEMPLATE_PACK_PATHS,
"scripts/npm-runner.mjs",
"scripts/preinstall-package-manager-warning.mjs",
"scripts/lib/official-external-channel-catalog.json",
"scripts/lib/official-external-plugin-catalog.json",
"scripts/lib/official-external-provider-catalog.json",
"scripts/lib/package-dist-imports.mjs",
"scripts/postinstall-bundled-plugins.mjs",
"dist/plugin-sdk/compat.js",

View File

@@ -53,6 +53,10 @@ function buildCatalogEntry(packageJson) {
};
}
function getCatalogChannelId(entry) {
return trimString(entry?.openclaw?.channel?.id) || trimString(entry?.name);
}
export function buildOfficialChannelCatalog(params = {}) {
const repoRoot = params.cwd ?? params.repoRoot ?? process.cwd();
const extensionsRoot = path.join(repoRoot, "extensions");
@@ -74,7 +78,11 @@ export function buildOfficialChannelCatalog(params = {}) {
try {
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
const entry = buildCatalogEntry(packageJson);
if (entry) {
const channelId = entry ? getCatalogChannelId(entry) : "";
const alreadyPresent = channelId
? entries.some((existing) => getCatalogChannelId(existing) === channelId)
: false;
if (entry && !alreadyPresent) {
entries.push(entry);
}
} catch {