From c7b5302acf589e085384ee226a5a76875457d948 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sat, 2 May 2026 07:59:29 -0700 Subject: [PATCH] fix(plugins): repair missing clawhub installs --- CHANGELOG.md | 2 + docs/gateway/opentelemetry.md | 2 +- docs/gateway/prometheus.md | 7 +- docs/install/docker.md | 12 +- docs/plugins/plugin-inventory.md | 56 ++--- docs/plugins/reference.md | 234 +++++++++--------- docs/plugins/reference/diagnostics-otel.md | 2 +- .../reference/diagnostics-prometheus.md | 2 +- extensions/diagnostics-otel/package.json | 3 +- .../diagnostics-prometheus/package.json | 3 +- scripts/generate-plugin-inventory-doc.mjs | 10 +- .../missing-configured-plugin-install.test.ts | 123 +++++++++ .../missing-configured-plugin-install.ts | 85 ++++++- 13 files changed, 376 insertions(+), 165 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f7f0a75cf7f..ee27940bb4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,12 +7,14 @@ Docs: https://docs.openclaw.ai ### Changes - Gateway/startup: skip plugin-backed auth-profile overlays during startup secrets preflight, reducing gateway readiness latency while keeping reload and OAuth recovery paths overlay-capable. (#68327) Thanks @JIRBOY. +- Plugins/diagnostics: make diagnostics OpenTelemetry and Prometheus ClawHub-first installs while keeping npm fallback metadata for release cutovers. Thanks @vincentkoc. - Plugins/onboarding: carry ClawHub install metadata through channel setup catalogs so missing channel plugins can install from ClawHub before npm/local fallback. Thanks @vincentkoc. - Plugins/runtime: scope broad runtime preloads to the effective plugin ids derived from config, startup planning, configured channels, slots, and auto-enable rules instead of importing every discoverable plugin. ### Fixes - Control UI/sessions: bound the default Sessions tab query to recent activity and fewer rows, avoiding expensive full-history loads while keeping filters editable. Fixes #76050. (#76051) Thanks @Neomail2. +- Plugins/doctor: repair missing configured provider and channel plugins from ClawHub before npm fallback, preserving ClawPack metadata in the install record. Thanks @vincentkoc. - Gateway/channels: cap startup fanout at four channel/account handoffs and recover from Bonjour ciao self-probe races, reducing Windows startup stalls with many Telegram accounts. Fixes #75687. - Gateway/sessions: keep `sessions.list` polling responsive on large session stores by reusing list-safe session cache/indexes and returning a lightweight compaction checkpoint preview instead of heavyweight summaries. Thanks @rolandrscheel. - CLI/update: treat inherited Gateway service markers as origin hints and only block package replacement when the managed Gateway is still live, so self-updates can stop the service and continue safely. (#75729) Thanks @hxy91819. diff --git a/docs/gateway/opentelemetry.md b/docs/gateway/opentelemetry.md index 38c19ba01b6..f9887472559 100644 --- a/docs/gateway/opentelemetry.md +++ b/docs/gateway/opentelemetry.md @@ -30,7 +30,7 @@ works without code changes. For local file logs and how to read them, see For packaged installs, install the plugin first: ```bash -openclaw plugins install @openclaw/diagnostics-otel +openclaw plugins install clawhub:@openclaw/diagnostics-otel ``` ```json5 diff --git a/docs/gateway/prometheus.md b/docs/gateway/prometheus.md index 4527e11b104..b256c1683bb 100644 --- a/docs/gateway/prometheus.md +++ b/docs/gateway/prometheus.md @@ -8,7 +8,7 @@ read_when: - You want metrics without running an OpenTelemetry collector --- -OpenClaw can expose diagnostics metrics through the bundled `diagnostics-prometheus` plugin. It listens to trusted internal diagnostics and renders a Prometheus text endpoint at: +OpenClaw can expose diagnostics metrics through the official `diagnostics-prometheus` plugin. It listens to trusted internal diagnostics and renders a Prometheus text endpoint at: ```text GET /api/diagnostics/prometheus @@ -25,6 +25,11 @@ For traces, logs, OTLP push, and OpenTelemetry GenAI semantic attributes, see [O ## Quick start + + ```bash + openclaw plugins install clawhub:@openclaw/diagnostics-prometheus + ``` + diff --git a/docs/install/docker.md b/docs/install/docker.md index 67233aadbe7..caa06727711 100644 --- a/docs/install/docker.md +++ b/docs/install/docker.md @@ -161,15 +161,17 @@ export OTEL_SERVICE_NAME="openclaw-gateway" ./scripts/docker/setup.sh ``` -Install the official `@openclaw/diagnostics-otel` plugin in packaged Docker -installs before enabling export. Custom source-built images can still include -the local plugin source with `OPENCLAW_EXTENSIONS=diagnostics-otel`. To enable -export, allow and enable the `diagnostics-otel` plugin in config, then set +Install the official `@openclaw/diagnostics-otel` plugin from ClawHub in +packaged Docker installs before enabling export. Custom source-built images can +still include the local plugin source with +`OPENCLAW_EXTENSIONS=diagnostics-otel`. To enable export, allow and enable the +`diagnostics-otel` plugin in config, then set `diagnostics.otel.enabled=true` or use the config example in [OpenTelemetry export](/gateway/opentelemetry). Collector auth headers are configured through `diagnostics.otel.headers`, not through Docker environment variables. -Prometheus metrics use the already-published Gateway port. Enable the +Prometheus metrics use the already-published Gateway port. Install +`clawhub:@openclaw/diagnostics-prometheus`, enable the `diagnostics-prometheus` plugin, then scrape: ```text diff --git a/docs/plugins/plugin-inventory.md b/docs/plugins/plugin-inventory.md index c02b4b06adf..26c2df783c1 100644 --- a/docs/plugins/plugin-inventory.md +++ b/docs/plugins/plugin-inventory.md @@ -119,34 +119,34 @@ dependencies are available. ## Official external packages -| Plugin | Description | Distribution | Surface | -| ------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ----------------------------------------------------- | ---------------------------------------------------------------------------- | -| [acpx](/plugins/reference/acpx) | Embedded ACP runtime backend with plugin-owned session and transport management. | `@openclaw/acpx`
ClawHub + npm | skills | -| [bluebubbles](/plugins/reference/bluebubbles) | Adds the BlueBubbles channel surface for sending and receiving OpenClaw messages. | `@openclaw/bluebubbles`
ClawHub + npm | channels: bluebubbles | -| [brave](/plugins/reference/brave) | Adds web search provider support. | `@openclaw/brave-plugin`
ClawHub + npm | contracts: webSearchProviders | -| [codex](/plugins/reference/codex) | Codex app-server harness and Codex-managed GPT model catalog. | `@openclaw/codex`
ClawHub + npm | providers: codex; contracts: mediaUnderstandingProviders, migrationProviders | -| [diagnostics-otel](/plugins/reference/diagnostics-otel) | OpenClaw diagnostics OpenTelemetry exporter. | `@openclaw/diagnostics-otel`
ClawHub + npm | plugin | -| [diagnostics-prometheus](/plugins/reference/diagnostics-prometheus) | OpenClaw diagnostics Prometheus exporter. | `@openclaw/diagnostics-prometheus`
ClawHub + npm | plugin | -| [diffs](/plugins/reference/diffs) | Read-only diff viewer and file renderer for agents. | `@openclaw/diffs`
ClawHub + npm | contracts: tools; skills | -| [feishu](/plugins/reference/feishu) | Adds the Feishu channel surface for sending and receiving OpenClaw messages. | `@openclaw/feishu`
ClawHub + npm | channels: feishu; contracts: tools; skills | -| [google-meet](/plugins/reference/google-meet) | Join Google Meet calls through Chrome or Twilio transports. | `@openclaw/google-meet`
ClawHub + npm | contracts: tools | -| [googlechat](/plugins/reference/googlechat) | Adds the Google Chat channel surface for sending and receiving OpenClaw messages. | `@openclaw/googlechat`
ClawHub + npm | channels: googlechat | -| [line](/plugins/reference/line) | Adds the LINE channel surface for sending and receiving OpenClaw messages. | `@openclaw/line`
ClawHub + npm | channels: line | -| [lobster](/plugins/reference/lobster) | Typed workflow tool with resumable approvals. | `@openclaw/lobster`
ClawHub + npm | contracts: tools | -| [matrix](/plugins/reference/matrix) | Adds the Matrix channel surface for sending and receiving OpenClaw messages. | `@openclaw/matrix`
ClawHub + npm | channels: matrix | -| [mattermost](/plugins/reference/mattermost) | Adds the Mattermost channel surface for sending and receiving OpenClaw messages. | `@openclaw/mattermost`
ClawHub + npm | channels: mattermost | -| [memory-lancedb](/plugins/reference/memory-lancedb) | Adds agent-callable tools. | `@openclaw/memory-lancedb`
ClawHub + npm | contracts: tools | -| [msteams](/plugins/reference/msteams) | Adds the Microsoft Teams channel surface for sending and receiving OpenClaw messages. | `@openclaw/msteams`
ClawHub + npm | channels: msteams | -| [nextcloud-talk](/plugins/reference/nextcloud-talk) | Adds the Nextcloud Talk channel surface for sending and receiving OpenClaw messages. | `@openclaw/nextcloud-talk`
ClawHub + npm | channels: nextcloud-talk | -| [nostr](/plugins/reference/nostr) | Adds the Nostr channel surface for sending and receiving OpenClaw messages. | `@openclaw/nostr`
ClawHub + npm | channels: nostr | -| [qqbot](/plugins/reference/qqbot) | Adds the QQ Bot channel surface for sending and receiving OpenClaw messages. | `@openclaw/qqbot`
ClawHub + npm | channels: qqbot; contracts: tools; skills | -| [synology-chat](/plugins/reference/synology-chat) | Adds the Synology Chat channel surface for sending and receiving OpenClaw messages. | `@openclaw/synology-chat`
ClawHub + npm | channels: synology-chat | -| [tlon](/plugins/reference/tlon) | Adds the Tlon channel surface for sending and receiving OpenClaw messages. | `@openclaw/tlon`
ClawHub + npm | channels: tlon; contracts: tools; skills | -| [twitch](/plugins/reference/twitch) | Adds the Twitch channel surface for sending and receiving OpenClaw messages. | `@openclaw/twitch`
ClawHub + npm | channels: twitch | -| [voice-call](/plugins/reference/voice-call) | Adds agent-callable tools. | `@openclaw/voice-call`
ClawHub + npm | contracts: tools | -| [whatsapp](/plugins/reference/whatsapp) | Adds the WhatsApp channel surface for sending and receiving OpenClaw messages. | `@openclaw/whatsapp`
ClawHub + npm | channels: whatsapp | -| [zalo](/plugins/reference/zalo) | Adds the Zalo channel surface for sending and receiving OpenClaw messages. | `@openclaw/zalo`
ClawHub + npm | channels: zalo | -| [zalouser](/plugins/reference/zalouser) | Adds the Zalo Personal channel surface for sending and receiving OpenClaw messages. | `@openclaw/zalouser`
ClawHub + npm | channels: zalouser; contracts: tools | +| Plugin | Description | Distribution | Surface | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------- | +| [acpx](/plugins/reference/acpx) | Embedded ACP runtime backend with plugin-owned session and transport management. | `@openclaw/acpx`
ClawHub + npm | skills | +| [bluebubbles](/plugins/reference/bluebubbles) | Adds the BlueBubbles channel surface for sending and receiving OpenClaw messages. | `@openclaw/bluebubbles`
ClawHub + npm | channels: bluebubbles | +| [brave](/plugins/reference/brave) | Adds web search provider support. | `@openclaw/brave-plugin`
ClawHub + npm | contracts: webSearchProviders | +| [codex](/plugins/reference/codex) | Codex app-server harness and Codex-managed GPT model catalog. | `@openclaw/codex`
ClawHub + npm | providers: codex; contracts: mediaUnderstandingProviders, migrationProviders | +| [diagnostics-otel](/plugins/reference/diagnostics-otel) | OpenClaw diagnostics OpenTelemetry exporter. | `@openclaw/diagnostics-otel`
ClawHub: `clawhub:@openclaw/diagnostics-otel`; npm | plugin | +| [diagnostics-prometheus](/plugins/reference/diagnostics-prometheus) | OpenClaw diagnostics Prometheus exporter. | `@openclaw/diagnostics-prometheus`
ClawHub: `clawhub:@openclaw/diagnostics-prometheus`; npm | plugin | +| [diffs](/plugins/reference/diffs) | Read-only diff viewer and file renderer for agents. | `@openclaw/diffs`
ClawHub + npm | contracts: tools; skills | +| [feishu](/plugins/reference/feishu) | Adds the Feishu channel surface for sending and receiving OpenClaw messages. | `@openclaw/feishu`
ClawHub + npm | channels: feishu; contracts: tools; skills | +| [google-meet](/plugins/reference/google-meet) | Join Google Meet calls through Chrome or Twilio transports. | `@openclaw/google-meet`
ClawHub + npm | contracts: tools | +| [googlechat](/plugins/reference/googlechat) | Adds the Google Chat channel surface for sending and receiving OpenClaw messages. | `@openclaw/googlechat`
ClawHub + npm | channels: googlechat | +| [line](/plugins/reference/line) | Adds the LINE channel surface for sending and receiving OpenClaw messages. | `@openclaw/line`
ClawHub + npm | channels: line | +| [lobster](/plugins/reference/lobster) | Typed workflow tool with resumable approvals. | `@openclaw/lobster`
ClawHub + npm | contracts: tools | +| [matrix](/plugins/reference/matrix) | Adds the Matrix channel surface for sending and receiving OpenClaw messages. | `@openclaw/matrix`
ClawHub + npm | channels: matrix | +| [mattermost](/plugins/reference/mattermost) | Adds the Mattermost channel surface for sending and receiving OpenClaw messages. | `@openclaw/mattermost`
ClawHub + npm | channels: mattermost | +| [memory-lancedb](/plugins/reference/memory-lancedb) | Adds agent-callable tools. | `@openclaw/memory-lancedb`
ClawHub + npm | contracts: tools | +| [msteams](/plugins/reference/msteams) | Adds the Microsoft Teams channel surface for sending and receiving OpenClaw messages. | `@openclaw/msteams`
ClawHub + npm | channels: msteams | +| [nextcloud-talk](/plugins/reference/nextcloud-talk) | Adds the Nextcloud Talk channel surface for sending and receiving OpenClaw messages. | `@openclaw/nextcloud-talk`
ClawHub + npm | channels: nextcloud-talk | +| [nostr](/plugins/reference/nostr) | Adds the Nostr channel surface for sending and receiving OpenClaw messages. | `@openclaw/nostr`
ClawHub + npm | channels: nostr | +| [qqbot](/plugins/reference/qqbot) | Adds the QQ Bot channel surface for sending and receiving OpenClaw messages. | `@openclaw/qqbot`
ClawHub + npm | channels: qqbot; contracts: tools; skills | +| [synology-chat](/plugins/reference/synology-chat) | Adds the Synology Chat channel surface for sending and receiving OpenClaw messages. | `@openclaw/synology-chat`
ClawHub + npm | channels: synology-chat | +| [tlon](/plugins/reference/tlon) | Adds the Tlon channel surface for sending and receiving OpenClaw messages. | `@openclaw/tlon`
ClawHub + npm | channels: tlon; contracts: tools; skills | +| [twitch](/plugins/reference/twitch) | Adds the Twitch channel surface for sending and receiving OpenClaw messages. | `@openclaw/twitch`
ClawHub + npm | channels: twitch | +| [voice-call](/plugins/reference/voice-call) | Adds agent-callable tools. | `@openclaw/voice-call`
ClawHub + npm | contracts: tools | +| [whatsapp](/plugins/reference/whatsapp) | Adds the WhatsApp channel surface for sending and receiving OpenClaw messages. | `@openclaw/whatsapp`
ClawHub + npm | channels: whatsapp | +| [zalo](/plugins/reference/zalo) | Adds the Zalo channel surface for sending and receiving OpenClaw messages. | `@openclaw/zalo`
ClawHub + npm | channels: zalo | +| [zalouser](/plugins/reference/zalouser) | Adds the Zalo Personal channel surface for sending and receiving OpenClaw messages. | `@openclaw/zalouser`
ClawHub + npm | channels: zalouser; contracts: tools | ## Source checkout only diff --git a/docs/plugins/reference.md b/docs/plugins/reference.md index 3e21081ae63..fdb51d3edc0 100644 --- a/docs/plugins/reference.md +++ b/docs/plugins/reference.md @@ -15,120 +15,120 @@ This page is generated from `extensions/*/package.json` and pnpm plugins:inventory:gen ``` -| Plugin | Description | Distribution | Surface | -| ------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [acpx](/plugins/reference/acpx) | Embedded ACP runtime backend with plugin-owned session and transport management. | `@openclaw/acpx`
ClawHub + npm | skills | -| [alibaba](/plugins/reference/alibaba) | Adds video generation provider support. | `@openclaw/alibaba-provider`
included in OpenClaw | contracts: videoGenerationProviders | -| [amazon-bedrock](/plugins/reference/amazon-bedrock) | Adds Amazon Bedrock model provider support to OpenClaw. | `@openclaw/amazon-bedrock-provider`
included in OpenClaw | providers: amazon-bedrock; contracts: memoryEmbeddingProviders | -| [amazon-bedrock-mantle](/plugins/reference/amazon-bedrock-mantle) | Adds Amazon Bedrock Mantle model provider support to OpenClaw. | `@openclaw/amazon-bedrock-mantle-provider`
included in OpenClaw | providers: amazon-bedrock-mantle | -| [anthropic](/plugins/reference/anthropic) | Adds Anthropic model provider support to OpenClaw. | `@openclaw/anthropic-provider`
included in OpenClaw | providers: anthropic; contracts: mediaUnderstandingProviders | -| [anthropic-vertex](/plugins/reference/anthropic-vertex) | Adds Anthropic Vertex model provider support to OpenClaw. | `@openclaw/anthropic-vertex-provider`
included in OpenClaw | providers: anthropic-vertex | -| [arcee](/plugins/reference/arcee) | Adds Arcee model provider support to OpenClaw. | `@openclaw/arcee-provider`
included in OpenClaw | providers: arcee | -| [azure-speech](/plugins/reference/azure-speech) | Azure AI Speech text-to-speech (MP3, native Ogg/Opus voice notes, PCM telephony). | `@openclaw/azure-speech`
included in OpenClaw | contracts: speechProviders | -| [bluebubbles](/plugins/reference/bluebubbles) | Adds the BlueBubbles channel surface for sending and receiving OpenClaw messages. | `@openclaw/bluebubbles`
ClawHub + npm | channels: bluebubbles | -| [bonjour](/plugins/reference/bonjour) | Advertise the local OpenClaw gateway over Bonjour/mDNS. | `@openclaw/bonjour`
included in OpenClaw | plugin | -| [brave](/plugins/reference/brave) | Adds web search provider support. | `@openclaw/brave-plugin`
ClawHub + npm | contracts: webSearchProviders | -| [browser](/plugins/reference/browser) | Adds agent-callable tools. | `@openclaw/browser-plugin`
included in OpenClaw | contracts: tools; skills | -| [byteplus](/plugins/reference/byteplus) | Adds BytePlus, BytePlus Plan model provider support to OpenClaw. | `@openclaw/byteplus-provider`
included in OpenClaw | providers: byteplus, byteplus-plan; contracts: videoGenerationProviders | -| [cerebras](/plugins/reference/cerebras) | Adds Cerebras model provider support to OpenClaw. | `@openclaw/cerebras-provider`
included in OpenClaw | providers: cerebras | -| [chutes](/plugins/reference/chutes) | Adds Chutes model provider support to OpenClaw. | `@openclaw/chutes-provider`
included in OpenClaw | providers: chutes | -| [cloudflare-ai-gateway](/plugins/reference/cloudflare-ai-gateway) | Adds Cloudflare AI Gateway model provider support to OpenClaw. | `@openclaw/cloudflare-ai-gateway-provider`
included in OpenClaw | providers: cloudflare-ai-gateway | -| [codex](/plugins/reference/codex) | Codex app-server harness and Codex-managed GPT model catalog. | `@openclaw/codex`
ClawHub + npm | providers: codex; contracts: mediaUnderstandingProviders, migrationProviders | -| [comfy](/plugins/reference/comfy) | Adds ComfyUI model provider support to OpenClaw. | `@openclaw/comfy-provider`
included in OpenClaw | providers: comfy; contracts: imageGenerationProviders, musicGenerationProviders, videoGenerationProviders | -| [copilot-proxy](/plugins/reference/copilot-proxy) | Adds Copilot Proxy model provider support to OpenClaw. | `@openclaw/copilot-proxy`
included in OpenClaw | providers: copilot-proxy | -| [deepgram](/plugins/reference/deepgram) | Adds media understanding provider support. Adds realtime transcription provider support. | `@openclaw/deepgram-provider`
included in OpenClaw | contracts: mediaUnderstandingProviders, realtimeTranscriptionProviders | -| [deepinfra](/plugins/reference/deepinfra) | Adds DeepInfra model provider support to OpenClaw. | `@openclaw/deepinfra-provider`
included in OpenClaw | providers: deepinfra; contracts: imageGenerationProviders, mediaUnderstandingProviders, memoryEmbeddingProviders, speechProviders, videoGenerationProviders | -| [deepseek](/plugins/reference/deepseek) | Adds DeepSeek model provider support to OpenClaw. | `@openclaw/deepseek-provider`
included in OpenClaw | providers: deepseek | -| [diagnostics-otel](/plugins/reference/diagnostics-otel) | OpenClaw diagnostics OpenTelemetry exporter. | `@openclaw/diagnostics-otel`
ClawHub + npm | plugin | -| [diagnostics-prometheus](/plugins/reference/diagnostics-prometheus) | OpenClaw diagnostics Prometheus exporter. | `@openclaw/diagnostics-prometheus`
ClawHub + npm | plugin | -| [diffs](/plugins/reference/diffs) | Read-only diff viewer and file renderer for agents. | `@openclaw/diffs`
ClawHub + npm | contracts: tools; skills | -| [discord](/plugins/reference/discord) | Adds the Discord channel surface for sending and receiving OpenClaw messages. | `@openclaw/discord`
included in OpenClaw | channels: discord | -| [document-extract](/plugins/reference/document-extract) | Extract text and fallback page images from local document attachments. | `@openclaw/document-extract-plugin`
included in OpenClaw | contracts: documentExtractors | -| [duckduckgo](/plugins/reference/duckduckgo) | Adds web search provider support. | `@openclaw/duckduckgo-plugin`
included in OpenClaw | contracts: webSearchProviders | -| [elevenlabs](/plugins/reference/elevenlabs) | Adds media understanding provider support. Adds realtime transcription provider support. Adds text-to-speech provider support. | `@openclaw/elevenlabs-speech`
included in OpenClaw | contracts: mediaUnderstandingProviders, realtimeTranscriptionProviders, speechProviders | -| [exa](/plugins/reference/exa) | Adds web search provider support. | `@openclaw/exa-plugin`
included in OpenClaw | contracts: webSearchProviders | -| [fal](/plugins/reference/fal) | Adds fal model provider support to OpenClaw. | `@openclaw/fal-provider`
included in OpenClaw | providers: fal; contracts: imageGenerationProviders, videoGenerationProviders | -| [feishu](/plugins/reference/feishu) | Adds the Feishu channel surface for sending and receiving OpenClaw messages. | `@openclaw/feishu`
ClawHub + npm | channels: feishu; contracts: tools; skills | -| [file-transfer](/plugins/reference/file-transfer) | Fetch, list, and write files on paired nodes via dedicated node commands. Bypasses bash stdout truncation by using base64 over node.invoke for binaries up to 16 MB. | `@openclaw/file-transfer`
included in OpenClaw | contracts: tools | -| [firecrawl](/plugins/reference/firecrawl) | Adds agent-callable tools. Adds web fetch provider support. Adds web search provider support. | `@openclaw/firecrawl-plugin`
included in OpenClaw | contracts: tools, webFetchProviders, webSearchProviders | -| [fireworks](/plugins/reference/fireworks) | Adds Fireworks model provider support to OpenClaw. | `@openclaw/fireworks-provider`
included in OpenClaw | providers: fireworks | -| [github-copilot](/plugins/reference/github-copilot) | Adds GitHub Copilot model provider support to OpenClaw. | `@openclaw/github-copilot-provider`
included in OpenClaw | providers: github-copilot; contracts: memoryEmbeddingProviders | -| [google](/plugins/reference/google) | Adds Google, Google Gemini CLI, Google Vertex model provider support to OpenClaw. | `@openclaw/google-plugin`
included in OpenClaw | providers: google, google-gemini-cli, google-vertex; contracts: imageGenerationProviders, mediaUnderstandingProviders, memoryEmbeddingProviders, musicGenerationProviders, realtimeVoiceProviders, speechProviders, videoGenerationProviders, webSearchProviders | -| [google-meet](/plugins/reference/google-meet) | Join Google Meet calls through Chrome or Twilio transports. | `@openclaw/google-meet`
ClawHub + npm | contracts: tools | -| [googlechat](/plugins/reference/googlechat) | Adds the Google Chat channel surface for sending and receiving OpenClaw messages. | `@openclaw/googlechat`
ClawHub + npm | channels: googlechat | -| [gradium](/plugins/reference/gradium) | Adds text-to-speech provider support. | `@openclaw/gradium-speech`
included in OpenClaw | contracts: speechProviders | -| [groq](/plugins/reference/groq) | Adds Groq model provider support to OpenClaw. | `@openclaw/groq-provider`
included in OpenClaw | providers: groq; contracts: mediaUnderstandingProviders | -| [huggingface](/plugins/reference/huggingface) | Adds Hugging Face model provider support to OpenClaw. | `@openclaw/huggingface-provider`
included in OpenClaw | providers: huggingface | -| [imessage](/plugins/reference/imessage) | Adds the iMessage channel surface for sending and receiving OpenClaw messages. | `@openclaw/imessage`
included in OpenClaw | channels: imessage | -| [inworld](/plugins/reference/inworld) | Inworld streaming text-to-speech (MP3, OGG_OPUS, PCM telephony). | `@openclaw/inworld-speech`
included in OpenClaw | contracts: speechProviders | -| [irc](/plugins/reference/irc) | Adds the IRC channel surface for sending and receiving OpenClaw messages. | `@openclaw/irc`
included in OpenClaw | channels: irc | -| [kilocode](/plugins/reference/kilocode) | Adds Kilocode model provider support to OpenClaw. | `@openclaw/kilocode-provider`
included in OpenClaw | providers: kilocode | -| [kimi](/plugins/reference/kimi) | Adds Kimi, Kimi Coding model provider support to OpenClaw. | `@openclaw/kimi-provider`
included in OpenClaw | providers: kimi, kimi-coding | -| [line](/plugins/reference/line) | Adds the LINE channel surface for sending and receiving OpenClaw messages. | `@openclaw/line`
ClawHub + npm | channels: line | -| [litellm](/plugins/reference/litellm) | Adds LiteLLM model provider support to OpenClaw. | `@openclaw/litellm-provider`
included in OpenClaw | providers: litellm; contracts: imageGenerationProviders | -| [llm-task](/plugins/reference/llm-task) | Generic JSON-only LLM tool for structured tasks callable from workflows. | `@openclaw/llm-task`
included in OpenClaw | contracts: tools | -| [lmstudio](/plugins/reference/lmstudio) | Adds LM Studio model provider support to OpenClaw. | `@openclaw/lmstudio-provider`
included in OpenClaw | providers: lmstudio; contracts: memoryEmbeddingProviders | -| [lobster](/plugins/reference/lobster) | Typed workflow tool with resumable approvals. | `@openclaw/lobster`
ClawHub + npm | contracts: tools | -| [matrix](/plugins/reference/matrix) | Adds the Matrix channel surface for sending and receiving OpenClaw messages. | `@openclaw/matrix`
ClawHub + npm | channels: matrix | -| [mattermost](/plugins/reference/mattermost) | Adds the Mattermost channel surface for sending and receiving OpenClaw messages. | `@openclaw/mattermost`
ClawHub + npm | channels: mattermost | -| [memory-core](/plugins/reference/memory-core) | Adds memory embedding provider support. Adds agent-callable tools. | `@openclaw/memory-core`
included in OpenClaw | contracts: memoryEmbeddingProviders, tools | -| [memory-lancedb](/plugins/reference/memory-lancedb) | Adds agent-callable tools. | `@openclaw/memory-lancedb`
ClawHub + npm | contracts: tools | -| [memory-wiki](/plugins/reference/memory-wiki) | Persistent wiki compiler and Obsidian-friendly knowledge vault for OpenClaw. | `@openclaw/memory-wiki`
included in OpenClaw | contracts: tools; skills | -| [microsoft](/plugins/reference/microsoft) | Adds text-to-speech provider support. | `@openclaw/microsoft-speech`
included in OpenClaw | contracts: speechProviders | -| [microsoft-foundry](/plugins/reference/microsoft-foundry) | Adds Microsoft Foundry model provider support to OpenClaw. | `@openclaw/microsoft-foundry`
included in OpenClaw | providers: microsoft-foundry | -| [migrate-claude](/plugins/reference/migrate-claude) | Imports Claude Code and Claude Desktop instructions, MCP servers, skills, and safe configuration into OpenClaw. | `@openclaw/migrate-claude`
included in OpenClaw | contracts: migrationProviders | -| [migrate-hermes](/plugins/reference/migrate-hermes) | Imports Hermes configuration, memories, skills, and supported credentials into OpenClaw. | `@openclaw/migrate-hermes`
included in OpenClaw | contracts: migrationProviders | -| [minimax](/plugins/reference/minimax) | Adds MiniMax, MiniMax Portal model provider support to OpenClaw. | `@openclaw/minimax-provider`
included in OpenClaw | providers: minimax, minimax-portal; contracts: imageGenerationProviders, mediaUnderstandingProviders, musicGenerationProviders, speechProviders, videoGenerationProviders, webSearchProviders | -| [mistral](/plugins/reference/mistral) | Adds Mistral model provider support to OpenClaw. | `@openclaw/mistral-provider`
included in OpenClaw | providers: mistral; contracts: mediaUnderstandingProviders, memoryEmbeddingProviders, realtimeTranscriptionProviders | -| [moonshot](/plugins/reference/moonshot) | Adds Moonshot model provider support to OpenClaw. | `@openclaw/moonshot-provider`
included in OpenClaw | providers: moonshot; contracts: mediaUnderstandingProviders, webSearchProviders | -| [msteams](/plugins/reference/msteams) | Adds the Microsoft Teams channel surface for sending and receiving OpenClaw messages. | `@openclaw/msteams`
ClawHub + npm | channels: msteams | -| [nextcloud-talk](/plugins/reference/nextcloud-talk) | Adds the Nextcloud Talk channel surface for sending and receiving OpenClaw messages. | `@openclaw/nextcloud-talk`
ClawHub + npm | channels: nextcloud-talk | -| [nostr](/plugins/reference/nostr) | Adds the Nostr channel surface for sending and receiving OpenClaw messages. | `@openclaw/nostr`
ClawHub + npm | channels: nostr | -| [nvidia](/plugins/reference/nvidia) | Adds NVIDIA model provider support to OpenClaw. | `@openclaw/nvidia-provider`
included in OpenClaw | providers: nvidia | -| [ollama](/plugins/reference/ollama) | Adds Ollama model provider support to OpenClaw. | `@openclaw/ollama-provider`
included in OpenClaw | providers: ollama; contracts: memoryEmbeddingProviders, webSearchProviders | -| [open-prose](/plugins/reference/open-prose) | OpenProse VM skill pack with a /prose slash command. | `@openclaw/open-prose`
included in OpenClaw | skills | -| [openai](/plugins/reference/openai) | Adds OpenAI, OpenAI Codex model provider support to OpenClaw. | `@openclaw/openai-provider`
included in OpenClaw | providers: openai, openai-codex; contracts: imageGenerationProviders, mediaUnderstandingProviders, memoryEmbeddingProviders, realtimeTranscriptionProviders, realtimeVoiceProviders, speechProviders, videoGenerationProviders | -| [opencode](/plugins/reference/opencode) | Adds OpenCode model provider support to OpenClaw. | `@openclaw/opencode-provider`
included in OpenClaw | providers: opencode; contracts: mediaUnderstandingProviders | -| [opencode-go](/plugins/reference/opencode-go) | Adds OpenCode Go model provider support to OpenClaw. | `@openclaw/opencode-go-provider`
included in OpenClaw | providers: opencode-go; contracts: mediaUnderstandingProviders | -| [openrouter](/plugins/reference/openrouter) | Adds OpenRouter model provider support to OpenClaw. | `@openclaw/openrouter-provider`
included in OpenClaw | providers: openrouter; contracts: imageGenerationProviders, mediaUnderstandingProviders, speechProviders, videoGenerationProviders | -| [openshell](/plugins/reference/openshell) | Sandbox backend powered by OpenShell with mirrored local workspaces and SSH-based command execution. | `@openclaw/openshell-sandbox`
included in OpenClaw | plugin | -| [perplexity](/plugins/reference/perplexity) | Adds web search provider support. | `@openclaw/perplexity-plugin`
included in OpenClaw | contracts: webSearchProviders | -| [qa-channel](/plugins/reference/qa-channel) | Adds the QA Channel surface for sending and receiving OpenClaw messages. | `@openclaw/qa-channel`
source checkout only | channels: qa-channel | -| [qa-lab](/plugins/reference/qa-lab) | OpenClaw QA lab plugin with private debugger UI and scenario runner. | `@openclaw/qa-lab`
source checkout only | plugin | -| [qa-matrix](/plugins/reference/qa-matrix) | Matrix QA transport runner and substrate. | `@openclaw/qa-matrix`
source checkout only | plugin | -| [qianfan](/plugins/reference/qianfan) | Adds Qianfan model provider support to OpenClaw. | `@openclaw/qianfan-provider`
included in OpenClaw | providers: qianfan | -| [qqbot](/plugins/reference/qqbot) | Adds the QQ Bot channel surface for sending and receiving OpenClaw messages. | `@openclaw/qqbot`
ClawHub + npm | channels: qqbot; contracts: tools; skills | -| [qwen](/plugins/reference/qwen) | Adds Qwen, Qwen Cloud, Model Studio, DashScope model provider support to OpenClaw. | `@openclaw/qwen-provider`
included in OpenClaw | providers: qwen, qwencloud, modelstudio, dashscope; contracts: mediaUnderstandingProviders, videoGenerationProviders | -| [runway](/plugins/reference/runway) | Adds video generation provider support. | `@openclaw/runway-provider`
included in OpenClaw | contracts: videoGenerationProviders | -| [searxng](/plugins/reference/searxng) | Adds web search provider support. | `@openclaw/searxng-plugin`
included in OpenClaw | contracts: webSearchProviders | -| [senseaudio](/plugins/reference/senseaudio) | Adds media understanding provider support. | `@openclaw/senseaudio-provider`
included in OpenClaw | contracts: mediaUnderstandingProviders | -| [sglang](/plugins/reference/sglang) | Adds SGLang model provider support to OpenClaw. | `@openclaw/sglang-provider`
included in OpenClaw | providers: sglang | -| [signal](/plugins/reference/signal) | Adds the Signal channel surface for sending and receiving OpenClaw messages. | `@openclaw/signal`
included in OpenClaw | channels: signal | -| [skill-workshop](/plugins/reference/skill-workshop) | Captures repeatable workflows as workspace skills, with pending review, safe writes, and skill prompt refresh. | `@openclaw/skill-workshop`
included in OpenClaw | contracts: tools | -| [slack](/plugins/reference/slack) | Adds the Slack channel surface for sending and receiving OpenClaw messages. | `@openclaw/slack`
included in OpenClaw | channels: slack | -| [stepfun](/plugins/reference/stepfun) | Adds StepFun, StepFun Plan model provider support to OpenClaw. | `@openclaw/stepfun-provider`
included in OpenClaw | providers: stepfun, stepfun-plan | -| [synology-chat](/plugins/reference/synology-chat) | Adds the Synology Chat channel surface for sending and receiving OpenClaw messages. | `@openclaw/synology-chat`
ClawHub + npm | channels: synology-chat | -| [synthetic](/plugins/reference/synthetic) | Adds Synthetic model provider support to OpenClaw. | `@openclaw/synthetic-provider`
included in OpenClaw | providers: synthetic | -| [tavily](/plugins/reference/tavily) | Adds agent-callable tools. Adds web search provider support. | `@openclaw/tavily-plugin`
included in OpenClaw | contracts: tools, webSearchProviders; skills | -| [telegram](/plugins/reference/telegram) | Adds the Telegram channel surface for sending and receiving OpenClaw messages. | `@openclaw/telegram`
included in OpenClaw | channels: telegram | -| [tencent](/plugins/reference/tencent) | Adds Tencent TokenHub model provider support to OpenClaw. | `@openclaw/tencent-provider`
included in OpenClaw | providers: tencent-tokenhub | -| [tlon](/plugins/reference/tlon) | Adds the Tlon channel surface for sending and receiving OpenClaw messages. | `@openclaw/tlon`
ClawHub + npm | channels: tlon; contracts: tools; skills | -| [together](/plugins/reference/together) | Adds Together model provider support to OpenClaw. | `@openclaw/together-provider`
included in OpenClaw | providers: together; contracts: videoGenerationProviders | -| [tokenjuice](/plugins/reference/tokenjuice) | Compacts exec and bash tool results with tokenjuice reducers. | `@openclaw/tokenjuice`
included in OpenClaw | contracts: agentToolResultMiddleware | -| [tts-local-cli](/plugins/reference/tts-local-cli) | Adds text-to-speech provider support. | `@openclaw/tts-local-cli`
included in OpenClaw | contracts: speechProviders | -| [twitch](/plugins/reference/twitch) | Adds the Twitch channel surface for sending and receiving OpenClaw messages. | `@openclaw/twitch`
ClawHub + npm | channels: twitch | -| [venice](/plugins/reference/venice) | Adds Venice model provider support to OpenClaw. | `@openclaw/venice-provider`
included in OpenClaw | providers: venice | -| [vercel-ai-gateway](/plugins/reference/vercel-ai-gateway) | Adds Vercel AI Gateway model provider support to OpenClaw. | `@openclaw/vercel-ai-gateway-provider`
included in OpenClaw | providers: vercel-ai-gateway | -| [vllm](/plugins/reference/vllm) | Adds vLLM model provider support to OpenClaw. | `@openclaw/vllm-provider`
included in OpenClaw | providers: vllm | -| [voice-call](/plugins/reference/voice-call) | Adds agent-callable tools. | `@openclaw/voice-call`
ClawHub + npm | contracts: tools | -| [volcengine](/plugins/reference/volcengine) | Adds Volcengine, Volcengine Plan model provider support to OpenClaw. | `@openclaw/volcengine-provider`
included in OpenClaw | providers: volcengine, volcengine-plan; contracts: speechProviders | -| [voyage](/plugins/reference/voyage) | Adds memory embedding provider support. | `@openclaw/voyage-provider`
included in OpenClaw | contracts: memoryEmbeddingProviders | -| [vydra](/plugins/reference/vydra) | Adds Vydra model provider support to OpenClaw. | `@openclaw/vydra-provider`
included in OpenClaw | providers: vydra; contracts: imageGenerationProviders, speechProviders, videoGenerationProviders | -| [web-readability](/plugins/reference/web-readability) | Extract readable article content from local HTML web fetch responses. | `@openclaw/web-readability-plugin`
included in OpenClaw | contracts: webContentExtractors | -| [webhooks](/plugins/reference/webhooks) | Authenticated inbound webhooks that bind external automation to OpenClaw TaskFlows. | `@openclaw/webhooks`
included in OpenClaw | plugin | -| [whatsapp](/plugins/reference/whatsapp) | Adds the WhatsApp channel surface for sending and receiving OpenClaw messages. | `@openclaw/whatsapp`
ClawHub + npm | channels: whatsapp | -| [xai](/plugins/reference/xai) | Adds xAI model provider support to OpenClaw. | `@openclaw/xai-plugin`
included in OpenClaw | providers: xai; contracts: imageGenerationProviders, mediaUnderstandingProviders, realtimeTranscriptionProviders, speechProviders, tools, videoGenerationProviders, webSearchProviders | -| [xiaomi](/plugins/reference/xiaomi) | Adds Xiaomi model provider support to OpenClaw. | `@openclaw/xiaomi-provider`
included in OpenClaw | providers: xiaomi; contracts: speechProviders | -| [zai](/plugins/reference/zai) | Adds Z.AI model provider support to OpenClaw. | `@openclaw/zai-provider`
included in OpenClaw | providers: zai; contracts: mediaUnderstandingProviders | -| [zalo](/plugins/reference/zalo) | Adds the Zalo channel surface for sending and receiving OpenClaw messages. | `@openclaw/zalo`
ClawHub + npm | channels: zalo | -| [zalouser](/plugins/reference/zalouser) | Adds the Zalo Personal channel surface for sending and receiving OpenClaw messages. | `@openclaw/zalouser`
ClawHub + npm | channels: zalouser; contracts: tools | +| Plugin | Description | Distribution | Surface | +| ------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [acpx](/plugins/reference/acpx) | Embedded ACP runtime backend with plugin-owned session and transport management. | `@openclaw/acpx`
ClawHub + npm | skills | +| [alibaba](/plugins/reference/alibaba) | Adds video generation provider support. | `@openclaw/alibaba-provider`
included in OpenClaw | contracts: videoGenerationProviders | +| [amazon-bedrock](/plugins/reference/amazon-bedrock) | Adds Amazon Bedrock model provider support to OpenClaw. | `@openclaw/amazon-bedrock-provider`
included in OpenClaw | providers: amazon-bedrock; contracts: memoryEmbeddingProviders | +| [amazon-bedrock-mantle](/plugins/reference/amazon-bedrock-mantle) | Adds Amazon Bedrock Mantle model provider support to OpenClaw. | `@openclaw/amazon-bedrock-mantle-provider`
included in OpenClaw | providers: amazon-bedrock-mantle | +| [anthropic](/plugins/reference/anthropic) | Adds Anthropic model provider support to OpenClaw. | `@openclaw/anthropic-provider`
included in OpenClaw | providers: anthropic; contracts: mediaUnderstandingProviders | +| [anthropic-vertex](/plugins/reference/anthropic-vertex) | Adds Anthropic Vertex model provider support to OpenClaw. | `@openclaw/anthropic-vertex-provider`
included in OpenClaw | providers: anthropic-vertex | +| [arcee](/plugins/reference/arcee) | Adds Arcee model provider support to OpenClaw. | `@openclaw/arcee-provider`
included in OpenClaw | providers: arcee | +| [azure-speech](/plugins/reference/azure-speech) | Azure AI Speech text-to-speech (MP3, native Ogg/Opus voice notes, PCM telephony). | `@openclaw/azure-speech`
included in OpenClaw | contracts: speechProviders | +| [bluebubbles](/plugins/reference/bluebubbles) | Adds the BlueBubbles channel surface for sending and receiving OpenClaw messages. | `@openclaw/bluebubbles`
ClawHub + npm | channels: bluebubbles | +| [bonjour](/plugins/reference/bonjour) | Advertise the local OpenClaw gateway over Bonjour/mDNS. | `@openclaw/bonjour`
included in OpenClaw | plugin | +| [brave](/plugins/reference/brave) | Adds web search provider support. | `@openclaw/brave-plugin`
ClawHub + npm | contracts: webSearchProviders | +| [browser](/plugins/reference/browser) | Adds agent-callable tools. | `@openclaw/browser-plugin`
included in OpenClaw | contracts: tools; skills | +| [byteplus](/plugins/reference/byteplus) | Adds BytePlus, BytePlus Plan model provider support to OpenClaw. | `@openclaw/byteplus-provider`
included in OpenClaw | providers: byteplus, byteplus-plan; contracts: videoGenerationProviders | +| [cerebras](/plugins/reference/cerebras) | Adds Cerebras model provider support to OpenClaw. | `@openclaw/cerebras-provider`
included in OpenClaw | providers: cerebras | +| [chutes](/plugins/reference/chutes) | Adds Chutes model provider support to OpenClaw. | `@openclaw/chutes-provider`
included in OpenClaw | providers: chutes | +| [cloudflare-ai-gateway](/plugins/reference/cloudflare-ai-gateway) | Adds Cloudflare AI Gateway model provider support to OpenClaw. | `@openclaw/cloudflare-ai-gateway-provider`
included in OpenClaw | providers: cloudflare-ai-gateway | +| [codex](/plugins/reference/codex) | Codex app-server harness and Codex-managed GPT model catalog. | `@openclaw/codex`
ClawHub + npm | providers: codex; contracts: mediaUnderstandingProviders, migrationProviders | +| [comfy](/plugins/reference/comfy) | Adds ComfyUI model provider support to OpenClaw. | `@openclaw/comfy-provider`
included in OpenClaw | providers: comfy; contracts: imageGenerationProviders, musicGenerationProviders, videoGenerationProviders | +| [copilot-proxy](/plugins/reference/copilot-proxy) | Adds Copilot Proxy model provider support to OpenClaw. | `@openclaw/copilot-proxy`
included in OpenClaw | providers: copilot-proxy | +| [deepgram](/plugins/reference/deepgram) | Adds media understanding provider support. Adds realtime transcription provider support. | `@openclaw/deepgram-provider`
included in OpenClaw | contracts: mediaUnderstandingProviders, realtimeTranscriptionProviders | +| [deepinfra](/plugins/reference/deepinfra) | Adds DeepInfra model provider support to OpenClaw. | `@openclaw/deepinfra-provider`
included in OpenClaw | providers: deepinfra; contracts: imageGenerationProviders, mediaUnderstandingProviders, memoryEmbeddingProviders, speechProviders, videoGenerationProviders | +| [deepseek](/plugins/reference/deepseek) | Adds DeepSeek model provider support to OpenClaw. | `@openclaw/deepseek-provider`
included in OpenClaw | providers: deepseek | +| [diagnostics-otel](/plugins/reference/diagnostics-otel) | OpenClaw diagnostics OpenTelemetry exporter. | `@openclaw/diagnostics-otel`
ClawHub: `clawhub:@openclaw/diagnostics-otel`; npm | plugin | +| [diagnostics-prometheus](/plugins/reference/diagnostics-prometheus) | OpenClaw diagnostics Prometheus exporter. | `@openclaw/diagnostics-prometheus`
ClawHub: `clawhub:@openclaw/diagnostics-prometheus`; npm | plugin | +| [diffs](/plugins/reference/diffs) | Read-only diff viewer and file renderer for agents. | `@openclaw/diffs`
ClawHub + npm | contracts: tools; skills | +| [discord](/plugins/reference/discord) | Adds the Discord channel surface for sending and receiving OpenClaw messages. | `@openclaw/discord`
included in OpenClaw | channels: discord | +| [document-extract](/plugins/reference/document-extract) | Extract text and fallback page images from local document attachments. | `@openclaw/document-extract-plugin`
included in OpenClaw | contracts: documentExtractors | +| [duckduckgo](/plugins/reference/duckduckgo) | Adds web search provider support. | `@openclaw/duckduckgo-plugin`
included in OpenClaw | contracts: webSearchProviders | +| [elevenlabs](/plugins/reference/elevenlabs) | Adds media understanding provider support. Adds realtime transcription provider support. Adds text-to-speech provider support. | `@openclaw/elevenlabs-speech`
included in OpenClaw | contracts: mediaUnderstandingProviders, realtimeTranscriptionProviders, speechProviders | +| [exa](/plugins/reference/exa) | Adds web search provider support. | `@openclaw/exa-plugin`
included in OpenClaw | contracts: webSearchProviders | +| [fal](/plugins/reference/fal) | Adds fal model provider support to OpenClaw. | `@openclaw/fal-provider`
included in OpenClaw | providers: fal; contracts: imageGenerationProviders, videoGenerationProviders | +| [feishu](/plugins/reference/feishu) | Adds the Feishu channel surface for sending and receiving OpenClaw messages. | `@openclaw/feishu`
ClawHub + npm | channels: feishu; contracts: tools; skills | +| [file-transfer](/plugins/reference/file-transfer) | Fetch, list, and write files on paired nodes via dedicated node commands. Bypasses bash stdout truncation by using base64 over node.invoke for binaries up to 16 MB. | `@openclaw/file-transfer`
included in OpenClaw | contracts: tools | +| [firecrawl](/plugins/reference/firecrawl) | Adds agent-callable tools. Adds web fetch provider support. Adds web search provider support. | `@openclaw/firecrawl-plugin`
included in OpenClaw | contracts: tools, webFetchProviders, webSearchProviders | +| [fireworks](/plugins/reference/fireworks) | Adds Fireworks model provider support to OpenClaw. | `@openclaw/fireworks-provider`
included in OpenClaw | providers: fireworks | +| [github-copilot](/plugins/reference/github-copilot) | Adds GitHub Copilot model provider support to OpenClaw. | `@openclaw/github-copilot-provider`
included in OpenClaw | providers: github-copilot; contracts: memoryEmbeddingProviders | +| [google](/plugins/reference/google) | Adds Google, Google Gemini CLI, Google Vertex model provider support to OpenClaw. | `@openclaw/google-plugin`
included in OpenClaw | providers: google, google-gemini-cli, google-vertex; contracts: imageGenerationProviders, mediaUnderstandingProviders, memoryEmbeddingProviders, musicGenerationProviders, realtimeVoiceProviders, speechProviders, videoGenerationProviders, webSearchProviders | +| [google-meet](/plugins/reference/google-meet) | Join Google Meet calls through Chrome or Twilio transports. | `@openclaw/google-meet`
ClawHub + npm | contracts: tools | +| [googlechat](/plugins/reference/googlechat) | Adds the Google Chat channel surface for sending and receiving OpenClaw messages. | `@openclaw/googlechat`
ClawHub + npm | channels: googlechat | +| [gradium](/plugins/reference/gradium) | Adds text-to-speech provider support. | `@openclaw/gradium-speech`
included in OpenClaw | contracts: speechProviders | +| [groq](/plugins/reference/groq) | Adds Groq model provider support to OpenClaw. | `@openclaw/groq-provider`
included in OpenClaw | providers: groq; contracts: mediaUnderstandingProviders | +| [huggingface](/plugins/reference/huggingface) | Adds Hugging Face model provider support to OpenClaw. | `@openclaw/huggingface-provider`
included in OpenClaw | providers: huggingface | +| [imessage](/plugins/reference/imessage) | Adds the iMessage channel surface for sending and receiving OpenClaw messages. | `@openclaw/imessage`
included in OpenClaw | channels: imessage | +| [inworld](/plugins/reference/inworld) | Inworld streaming text-to-speech (MP3, OGG_OPUS, PCM telephony). | `@openclaw/inworld-speech`
included in OpenClaw | contracts: speechProviders | +| [irc](/plugins/reference/irc) | Adds the IRC channel surface for sending and receiving OpenClaw messages. | `@openclaw/irc`
included in OpenClaw | channels: irc | +| [kilocode](/plugins/reference/kilocode) | Adds Kilocode model provider support to OpenClaw. | `@openclaw/kilocode-provider`
included in OpenClaw | providers: kilocode | +| [kimi](/plugins/reference/kimi) | Adds Kimi, Kimi Coding model provider support to OpenClaw. | `@openclaw/kimi-provider`
included in OpenClaw | providers: kimi, kimi-coding | +| [line](/plugins/reference/line) | Adds the LINE channel surface for sending and receiving OpenClaw messages. | `@openclaw/line`
ClawHub + npm | channels: line | +| [litellm](/plugins/reference/litellm) | Adds LiteLLM model provider support to OpenClaw. | `@openclaw/litellm-provider`
included in OpenClaw | providers: litellm; contracts: imageGenerationProviders | +| [llm-task](/plugins/reference/llm-task) | Generic JSON-only LLM tool for structured tasks callable from workflows. | `@openclaw/llm-task`
included in OpenClaw | contracts: tools | +| [lmstudio](/plugins/reference/lmstudio) | Adds LM Studio model provider support to OpenClaw. | `@openclaw/lmstudio-provider`
included in OpenClaw | providers: lmstudio; contracts: memoryEmbeddingProviders | +| [lobster](/plugins/reference/lobster) | Typed workflow tool with resumable approvals. | `@openclaw/lobster`
ClawHub + npm | contracts: tools | +| [matrix](/plugins/reference/matrix) | Adds the Matrix channel surface for sending and receiving OpenClaw messages. | `@openclaw/matrix`
ClawHub + npm | channels: matrix | +| [mattermost](/plugins/reference/mattermost) | Adds the Mattermost channel surface for sending and receiving OpenClaw messages. | `@openclaw/mattermost`
ClawHub + npm | channels: mattermost | +| [memory-core](/plugins/reference/memory-core) | Adds memory embedding provider support. Adds agent-callable tools. | `@openclaw/memory-core`
included in OpenClaw | contracts: memoryEmbeddingProviders, tools | +| [memory-lancedb](/plugins/reference/memory-lancedb) | Adds agent-callable tools. | `@openclaw/memory-lancedb`
ClawHub + npm | contracts: tools | +| [memory-wiki](/plugins/reference/memory-wiki) | Persistent wiki compiler and Obsidian-friendly knowledge vault for OpenClaw. | `@openclaw/memory-wiki`
included in OpenClaw | contracts: tools; skills | +| [microsoft](/plugins/reference/microsoft) | Adds text-to-speech provider support. | `@openclaw/microsoft-speech`
included in OpenClaw | contracts: speechProviders | +| [microsoft-foundry](/plugins/reference/microsoft-foundry) | Adds Microsoft Foundry model provider support to OpenClaw. | `@openclaw/microsoft-foundry`
included in OpenClaw | providers: microsoft-foundry | +| [migrate-claude](/plugins/reference/migrate-claude) | Imports Claude Code and Claude Desktop instructions, MCP servers, skills, and safe configuration into OpenClaw. | `@openclaw/migrate-claude`
included in OpenClaw | contracts: migrationProviders | +| [migrate-hermes](/plugins/reference/migrate-hermes) | Imports Hermes configuration, memories, skills, and supported credentials into OpenClaw. | `@openclaw/migrate-hermes`
included in OpenClaw | contracts: migrationProviders | +| [minimax](/plugins/reference/minimax) | Adds MiniMax, MiniMax Portal model provider support to OpenClaw. | `@openclaw/minimax-provider`
included in OpenClaw | providers: minimax, minimax-portal; contracts: imageGenerationProviders, mediaUnderstandingProviders, musicGenerationProviders, speechProviders, videoGenerationProviders, webSearchProviders | +| [mistral](/plugins/reference/mistral) | Adds Mistral model provider support to OpenClaw. | `@openclaw/mistral-provider`
included in OpenClaw | providers: mistral; contracts: mediaUnderstandingProviders, memoryEmbeddingProviders, realtimeTranscriptionProviders | +| [moonshot](/plugins/reference/moonshot) | Adds Moonshot model provider support to OpenClaw. | `@openclaw/moonshot-provider`
included in OpenClaw | providers: moonshot; contracts: mediaUnderstandingProviders, webSearchProviders | +| [msteams](/plugins/reference/msteams) | Adds the Microsoft Teams channel surface for sending and receiving OpenClaw messages. | `@openclaw/msteams`
ClawHub + npm | channels: msteams | +| [nextcloud-talk](/plugins/reference/nextcloud-talk) | Adds the Nextcloud Talk channel surface for sending and receiving OpenClaw messages. | `@openclaw/nextcloud-talk`
ClawHub + npm | channels: nextcloud-talk | +| [nostr](/plugins/reference/nostr) | Adds the Nostr channel surface for sending and receiving OpenClaw messages. | `@openclaw/nostr`
ClawHub + npm | channels: nostr | +| [nvidia](/plugins/reference/nvidia) | Adds NVIDIA model provider support to OpenClaw. | `@openclaw/nvidia-provider`
included in OpenClaw | providers: nvidia | +| [ollama](/plugins/reference/ollama) | Adds Ollama model provider support to OpenClaw. | `@openclaw/ollama-provider`
included in OpenClaw | providers: ollama; contracts: memoryEmbeddingProviders, webSearchProviders | +| [open-prose](/plugins/reference/open-prose) | OpenProse VM skill pack with a /prose slash command. | `@openclaw/open-prose`
included in OpenClaw | skills | +| [openai](/plugins/reference/openai) | Adds OpenAI, OpenAI Codex model provider support to OpenClaw. | `@openclaw/openai-provider`
included in OpenClaw | providers: openai, openai-codex; contracts: imageGenerationProviders, mediaUnderstandingProviders, memoryEmbeddingProviders, realtimeTranscriptionProviders, realtimeVoiceProviders, speechProviders, videoGenerationProviders | +| [opencode](/plugins/reference/opencode) | Adds OpenCode model provider support to OpenClaw. | `@openclaw/opencode-provider`
included in OpenClaw | providers: opencode; contracts: mediaUnderstandingProviders | +| [opencode-go](/plugins/reference/opencode-go) | Adds OpenCode Go model provider support to OpenClaw. | `@openclaw/opencode-go-provider`
included in OpenClaw | providers: opencode-go; contracts: mediaUnderstandingProviders | +| [openrouter](/plugins/reference/openrouter) | Adds OpenRouter model provider support to OpenClaw. | `@openclaw/openrouter-provider`
included in OpenClaw | providers: openrouter; contracts: imageGenerationProviders, mediaUnderstandingProviders, speechProviders, videoGenerationProviders | +| [openshell](/plugins/reference/openshell) | Sandbox backend powered by OpenShell with mirrored local workspaces and SSH-based command execution. | `@openclaw/openshell-sandbox`
included in OpenClaw | plugin | +| [perplexity](/plugins/reference/perplexity) | Adds web search provider support. | `@openclaw/perplexity-plugin`
included in OpenClaw | contracts: webSearchProviders | +| [qa-channel](/plugins/reference/qa-channel) | Adds the QA Channel surface for sending and receiving OpenClaw messages. | `@openclaw/qa-channel`
source checkout only | channels: qa-channel | +| [qa-lab](/plugins/reference/qa-lab) | OpenClaw QA lab plugin with private debugger UI and scenario runner. | `@openclaw/qa-lab`
source checkout only | plugin | +| [qa-matrix](/plugins/reference/qa-matrix) | Matrix QA transport runner and substrate. | `@openclaw/qa-matrix`
source checkout only | plugin | +| [qianfan](/plugins/reference/qianfan) | Adds Qianfan model provider support to OpenClaw. | `@openclaw/qianfan-provider`
included in OpenClaw | providers: qianfan | +| [qqbot](/plugins/reference/qqbot) | Adds the QQ Bot channel surface for sending and receiving OpenClaw messages. | `@openclaw/qqbot`
ClawHub + npm | channels: qqbot; contracts: tools; skills | +| [qwen](/plugins/reference/qwen) | Adds Qwen, Qwen Cloud, Model Studio, DashScope model provider support to OpenClaw. | `@openclaw/qwen-provider`
included in OpenClaw | providers: qwen, qwencloud, modelstudio, dashscope; contracts: mediaUnderstandingProviders, videoGenerationProviders | +| [runway](/plugins/reference/runway) | Adds video generation provider support. | `@openclaw/runway-provider`
included in OpenClaw | contracts: videoGenerationProviders | +| [searxng](/plugins/reference/searxng) | Adds web search provider support. | `@openclaw/searxng-plugin`
included in OpenClaw | contracts: webSearchProviders | +| [senseaudio](/plugins/reference/senseaudio) | Adds media understanding provider support. | `@openclaw/senseaudio-provider`
included in OpenClaw | contracts: mediaUnderstandingProviders | +| [sglang](/plugins/reference/sglang) | Adds SGLang model provider support to OpenClaw. | `@openclaw/sglang-provider`
included in OpenClaw | providers: sglang | +| [signal](/plugins/reference/signal) | Adds the Signal channel surface for sending and receiving OpenClaw messages. | `@openclaw/signal`
included in OpenClaw | channels: signal | +| [skill-workshop](/plugins/reference/skill-workshop) | Captures repeatable workflows as workspace skills, with pending review, safe writes, and skill prompt refresh. | `@openclaw/skill-workshop`
included in OpenClaw | contracts: tools | +| [slack](/plugins/reference/slack) | Adds the Slack channel surface for sending and receiving OpenClaw messages. | `@openclaw/slack`
included in OpenClaw | channels: slack | +| [stepfun](/plugins/reference/stepfun) | Adds StepFun, StepFun Plan model provider support to OpenClaw. | `@openclaw/stepfun-provider`
included in OpenClaw | providers: stepfun, stepfun-plan | +| [synology-chat](/plugins/reference/synology-chat) | Adds the Synology Chat channel surface for sending and receiving OpenClaw messages. | `@openclaw/synology-chat`
ClawHub + npm | channels: synology-chat | +| [synthetic](/plugins/reference/synthetic) | Adds Synthetic model provider support to OpenClaw. | `@openclaw/synthetic-provider`
included in OpenClaw | providers: synthetic | +| [tavily](/plugins/reference/tavily) | Adds agent-callable tools. Adds web search provider support. | `@openclaw/tavily-plugin`
included in OpenClaw | contracts: tools, webSearchProviders; skills | +| [telegram](/plugins/reference/telegram) | Adds the Telegram channel surface for sending and receiving OpenClaw messages. | `@openclaw/telegram`
included in OpenClaw | channels: telegram | +| [tencent](/plugins/reference/tencent) | Adds Tencent TokenHub model provider support to OpenClaw. | `@openclaw/tencent-provider`
included in OpenClaw | providers: tencent-tokenhub | +| [tlon](/plugins/reference/tlon) | Adds the Tlon channel surface for sending and receiving OpenClaw messages. | `@openclaw/tlon`
ClawHub + npm | channels: tlon; contracts: tools; skills | +| [together](/plugins/reference/together) | Adds Together model provider support to OpenClaw. | `@openclaw/together-provider`
included in OpenClaw | providers: together; contracts: videoGenerationProviders | +| [tokenjuice](/plugins/reference/tokenjuice) | Compacts exec and bash tool results with tokenjuice reducers. | `@openclaw/tokenjuice`
included in OpenClaw | contracts: agentToolResultMiddleware | +| [tts-local-cli](/plugins/reference/tts-local-cli) | Adds text-to-speech provider support. | `@openclaw/tts-local-cli`
included in OpenClaw | contracts: speechProviders | +| [twitch](/plugins/reference/twitch) | Adds the Twitch channel surface for sending and receiving OpenClaw messages. | `@openclaw/twitch`
ClawHub + npm | channels: twitch | +| [venice](/plugins/reference/venice) | Adds Venice model provider support to OpenClaw. | `@openclaw/venice-provider`
included in OpenClaw | providers: venice | +| [vercel-ai-gateway](/plugins/reference/vercel-ai-gateway) | Adds Vercel AI Gateway model provider support to OpenClaw. | `@openclaw/vercel-ai-gateway-provider`
included in OpenClaw | providers: vercel-ai-gateway | +| [vllm](/plugins/reference/vllm) | Adds vLLM model provider support to OpenClaw. | `@openclaw/vllm-provider`
included in OpenClaw | providers: vllm | +| [voice-call](/plugins/reference/voice-call) | Adds agent-callable tools. | `@openclaw/voice-call`
ClawHub + npm | contracts: tools | +| [volcengine](/plugins/reference/volcengine) | Adds Volcengine, Volcengine Plan model provider support to OpenClaw. | `@openclaw/volcengine-provider`
included in OpenClaw | providers: volcengine, volcengine-plan; contracts: speechProviders | +| [voyage](/plugins/reference/voyage) | Adds memory embedding provider support. | `@openclaw/voyage-provider`
included in OpenClaw | contracts: memoryEmbeddingProviders | +| [vydra](/plugins/reference/vydra) | Adds Vydra model provider support to OpenClaw. | `@openclaw/vydra-provider`
included in OpenClaw | providers: vydra; contracts: imageGenerationProviders, speechProviders, videoGenerationProviders | +| [web-readability](/plugins/reference/web-readability) | Extract readable article content from local HTML web fetch responses. | `@openclaw/web-readability-plugin`
included in OpenClaw | contracts: webContentExtractors | +| [webhooks](/plugins/reference/webhooks) | Authenticated inbound webhooks that bind external automation to OpenClaw TaskFlows. | `@openclaw/webhooks`
included in OpenClaw | plugin | +| [whatsapp](/plugins/reference/whatsapp) | Adds the WhatsApp channel surface for sending and receiving OpenClaw messages. | `@openclaw/whatsapp`
ClawHub + npm | channels: whatsapp | +| [xai](/plugins/reference/xai) | Adds xAI model provider support to OpenClaw. | `@openclaw/xai-plugin`
included in OpenClaw | providers: xai; contracts: imageGenerationProviders, mediaUnderstandingProviders, realtimeTranscriptionProviders, speechProviders, tools, videoGenerationProviders, webSearchProviders | +| [xiaomi](/plugins/reference/xiaomi) | Adds Xiaomi model provider support to OpenClaw. | `@openclaw/xiaomi-provider`
included in OpenClaw | providers: xiaomi; contracts: speechProviders | +| [zai](/plugins/reference/zai) | Adds Z.AI model provider support to OpenClaw. | `@openclaw/zai-provider`
included in OpenClaw | providers: zai; contracts: mediaUnderstandingProviders | +| [zalo](/plugins/reference/zalo) | Adds the Zalo channel surface for sending and receiving OpenClaw messages. | `@openclaw/zalo`
ClawHub + npm | channels: zalo | +| [zalouser](/plugins/reference/zalouser) | Adds the Zalo Personal channel surface for sending and receiving OpenClaw messages. | `@openclaw/zalouser`
ClawHub + npm | channels: zalouser; contracts: tools | diff --git a/docs/plugins/reference/diagnostics-otel.md b/docs/plugins/reference/diagnostics-otel.md index 4d5af86c317..4ff27e2bf1b 100644 --- a/docs/plugins/reference/diagnostics-otel.md +++ b/docs/plugins/reference/diagnostics-otel.md @@ -12,7 +12,7 @@ OpenClaw diagnostics OpenTelemetry exporter. ## Distribution - Package: `@openclaw/diagnostics-otel` -- Install route: ClawHub + npm +- Install route: ClawHub: `clawhub:@openclaw/diagnostics-otel`; npm ## Surface diff --git a/docs/plugins/reference/diagnostics-prometheus.md b/docs/plugins/reference/diagnostics-prometheus.md index b2f525724ee..d4fef3af6b2 100644 --- a/docs/plugins/reference/diagnostics-prometheus.md +++ b/docs/plugins/reference/diagnostics-prometheus.md @@ -12,7 +12,7 @@ OpenClaw diagnostics Prometheus exporter. ## Distribution - Package: `@openclaw/diagnostics-prometheus` -- Install route: ClawHub + npm +- Install route: ClawHub: `clawhub:@openclaw/diagnostics-prometheus`; npm ## Surface diff --git a/extensions/diagnostics-otel/package.json b/extensions/diagnostics-otel/package.json index 51458849710..056065595f0 100644 --- a/extensions/diagnostics-otel/package.json +++ b/extensions/diagnostics-otel/package.json @@ -28,8 +28,9 @@ "./index.ts" ], "install": { + "clawhubSpec": "clawhub:@openclaw/diagnostics-otel", "npmSpec": "@openclaw/diagnostics-otel", - "defaultChoice": "npm", + "defaultChoice": "clawhub", "minHostVersion": ">=2026.4.25" }, "compat": { diff --git a/extensions/diagnostics-prometheus/package.json b/extensions/diagnostics-prometheus/package.json index 6ac9e6f5063..4c6c34a5cdc 100644 --- a/extensions/diagnostics-prometheus/package.json +++ b/extensions/diagnostics-prometheus/package.json @@ -15,8 +15,9 @@ "./index.ts" ], "install": { + "clawhubSpec": "clawhub:@openclaw/diagnostics-prometheus", "npmSpec": "@openclaw/diagnostics-prometheus", - "defaultChoice": "npm", + "defaultChoice": "clawhub", "minHostVersion": ">=2026.4.25" }, "compat": { diff --git a/scripts/generate-plugin-inventory-doc.mjs b/scripts/generate-plugin-inventory-doc.mjs index 2f949e441b6..20987a19908 100644 --- a/scripts/generate-plugin-inventory-doc.mjs +++ b/scripts/generate-plugin-inventory-doc.mjs @@ -293,15 +293,17 @@ function resolveInstallRoute(packageJson, status) { } const install = packageJson.openclaw?.install; const release = packageJson.openclaw?.release; + const clawhubSpec = + typeof install?.clawhubSpec === "string" ? `: \`${install.clawhubSpec}\`` : ""; const npmSpec = typeof install?.npmSpec === "string" && install.npmSpec !== packageJson.name ? `: \`${install.npmSpec}\`` : ""; if (release?.publishToClawHub === true && release?.publishToNpm === true) { - return `ClawHub + npm${npmSpec}`; + return clawhubSpec ? `ClawHub${clawhubSpec}; npm${npmSpec}` : `ClawHub + npm${npmSpec}`; } if (release?.publishToClawHub === true) { - return `ClawHub${npmSpec}`; + return `ClawHub${clawhubSpec || npmSpec}`; } if (release?.publishToNpm === true || typeof install?.npmSpec === "string") { return `npm${npmSpec}`; @@ -311,7 +313,9 @@ function resolveInstallRoute(packageJson, status) { function resolveStatus({ dirName, packageJson, excludedDirs }) { const release = packageJson.openclaw?.release; - const hasInstallSpec = typeof packageJson.openclaw?.install?.npmSpec === "string"; + const hasInstallSpec = + typeof packageJson.openclaw?.install?.clawhubSpec === "string" || + typeof packageJson.openclaw?.install?.npmSpec === "string"; const excluded = excludedDirs.has(dirName) || packageJson.openclaw?.bundle?.includeInCore === false; if (!excluded) { diff --git a/src/commands/doctor/shared/missing-configured-plugin-install.test.ts b/src/commands/doctor/shared/missing-configured-plugin-install.test.ts index 803136cc3ae..2ba4729e669 100644 --- a/src/commands/doctor/shared/missing-configured-plugin-install.test.ts +++ b/src/commands/doctor/shared/missing-configured-plugin-install.test.ts @@ -1,6 +1,7 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; const mocks = vi.hoisted(() => ({ + installPluginFromClawHub: vi.fn(), installPluginFromNpmSpec: vi.fn(), listChannelPluginCatalogEntries: vi.fn(), loadInstalledPluginIndexInstallRecords: vi.fn(), @@ -29,6 +30,14 @@ vi.mock("../../../plugins/install.js", () => ({ installPluginFromNpmSpec: mocks.installPluginFromNpmSpec, })); +vi.mock("../../../plugins/clawhub.js", () => ({ + CLAWHUB_INSTALL_ERROR_CODE: { + PACKAGE_NOT_FOUND: "package_not_found", + VERSION_NOT_FOUND: "version_not_found", + }, + installPluginFromClawHub: mocks.installPluginFromClawHub, +})); + vi.mock("../../../plugins/plugin-metadata-snapshot.js", () => ({ loadPluginMetadataSnapshot: mocks.loadPluginMetadataSnapshot, })); @@ -51,6 +60,26 @@ describe("repairMissingConfiguredPluginInstalls", () => { mocks.loadInstalledPluginIndexInstallRecords.mockResolvedValue({}); mocks.listChannelPluginCatalogEntries.mockReturnValue([]); mocks.resolveProviderInstallCatalogEntries.mockReturnValue([]); + mocks.installPluginFromClawHub.mockResolvedValue({ + ok: true, + pluginId: "matrix", + targetDir: "/tmp/openclaw-plugins/matrix", + version: "1.2.3", + clawhub: { + source: "clawhub", + clawhubUrl: "https://clawhub.ai", + clawhubPackage: "@openclaw/plugin-matrix", + clawhubFamily: "code-plugin", + clawhubChannel: "official", + version: "1.2.3", + integrity: "sha256-clawhub", + resolvedAt: "2026-05-01T00:00:00.000Z", + clawpackSha256: "0".repeat(64), + clawpackSpecVersion: 1, + clawpackManifestSha256: "1".repeat(64), + clawpackSize: 1234, + }, + }); mocks.installPluginFromNpmSpec.mockResolvedValue({ ok: true, pluginId: "matrix", @@ -113,6 +142,100 @@ describe("repairMissingConfiguredPluginInstalls", () => { ]); }); + it("installs a missing configured channel plugin from ClawHub before npm", async () => { + mocks.listChannelPluginCatalogEntries.mockReturnValue([ + { + id: "matrix", + pluginId: "matrix", + meta: { label: "Matrix" }, + install: { + clawhubSpec: "clawhub:@openclaw/plugin-matrix@1.2.3", + npmSpec: "@openclaw/plugin-matrix@1.2.3", + expectedIntegrity: "sha512-test", + }, + }, + ]); + + const { repairMissingConfiguredPluginInstalls } = + await import("./missing-configured-plugin-install.js"); + const result = await repairMissingConfiguredPluginInstalls({ + cfg: { + channels: { + matrix: { enabled: true }, + }, + }, + env: {}, + }); + + expect(mocks.installPluginFromClawHub).toHaveBeenCalledWith( + expect.objectContaining({ + spec: "clawhub:@openclaw/plugin-matrix@1.2.3", + extensionsDir: "/tmp/openclaw-plugins", + expectedPluginId: "matrix", + }), + ); + expect(mocks.installPluginFromNpmSpec).not.toHaveBeenCalled(); + expect(mocks.writePersistedInstalledPluginIndexInstallRecords).toHaveBeenCalledWith( + expect.objectContaining({ + matrix: expect.objectContaining({ + source: "clawhub", + spec: "clawhub:@openclaw/plugin-matrix@1.2.3", + installPath: "/tmp/openclaw-plugins/matrix", + clawpackSha256: "0".repeat(64), + }), + }), + { env: {} }, + ); + expect(result.changes).toEqual([ + 'Installed missing configured plugin "matrix" from clawhub:@openclaw/plugin-matrix@1.2.3.', + ]); + expect(result.warnings).toEqual([]); + }); + + it("falls back to npm when a missing configured ClawHub package is absent", async () => { + mocks.installPluginFromClawHub.mockResolvedValue({ + ok: false, + code: "package_not_found", + error: "Package not found on ClawHub.", + }); + mocks.resolveProviderInstallCatalogEntries.mockReturnValue([ + { + pluginId: "matrix", + label: "Matrix", + install: { + clawhubSpec: "clawhub:@openclaw/plugin-matrix@1.2.3", + npmSpec: "@openclaw/plugin-matrix@1.2.3", + }, + }, + ]); + + const { repairMissingConfiguredPluginInstalls } = + await import("./missing-configured-plugin-install.js"); + const result = await repairMissingConfiguredPluginInstalls({ + cfg: { + plugins: { + entries: { + matrix: { enabled: true }, + }, + }, + }, + env: {}, + }); + + expect(mocks.installPluginFromClawHub).toHaveBeenCalledWith( + expect.objectContaining({ spec: "clawhub:@openclaw/plugin-matrix@1.2.3" }), + ); + expect(mocks.installPluginFromNpmSpec).toHaveBeenCalledWith( + expect.objectContaining({ spec: "@openclaw/plugin-matrix@1.2.3" }), + ); + expect(result.changes).toEqual([ + 'Installed missing configured plugin "matrix" from @openclaw/plugin-matrix@1.2.3.', + ]); + expect(result.warnings).toEqual([ + "ClawHub clawhub:@openclaw/plugin-matrix@1.2.3 unavailable for matrix; falling back to npm @openclaw/plugin-matrix@1.2.3.", + ]); + }); + it("reinstalls a missing configured plugin from its persisted install record", async () => { const records = { demo: { diff --git a/src/commands/doctor/shared/missing-configured-plugin-install.ts b/src/commands/doctor/shared/missing-configured-plugin-install.ts index 8c131cf1945..efc1b6a09f0 100644 --- a/src/commands/doctor/shared/missing-configured-plugin-install.ts +++ b/src/commands/doctor/shared/missing-configured-plugin-install.ts @@ -1,6 +1,7 @@ import { listChannelPluginCatalogEntries } from "../../../channels/plugins/catalog.js"; import type { OpenClawConfig } from "../../../config/types.openclaw.js"; import type { PluginInstallRecord } from "../../../config/types.plugins.js"; +import { CLAWHUB_INSTALL_ERROR_CODE, installPluginFromClawHub } from "../../../plugins/clawhub.js"; import { resolveDefaultPluginExtensionsDir } from "../../../plugins/install-paths.js"; import { installPluginFromNpmSpec } from "../../../plugins/install.js"; import { loadInstalledPluginIndexInstallRecords } from "../../../plugins/installed-plugin-index-records.js"; @@ -14,10 +15,18 @@ import { asObjectRecord } from "./object.js"; type DownloadableInstallCandidate = { pluginId: string; label: string; - npmSpec: string; + clawhubSpec?: string; + npmSpec?: string; expectedIntegrity?: string; }; +function shouldFallbackClawHubCandidateToNpm(result: { ok: false; code?: string }): boolean { + return ( + result.code === CLAWHUB_INSTALL_ERROR_CODE.PACKAGE_NOT_FOUND || + result.code === CLAWHUB_INSTALL_ERROR_CODE.VERSION_NOT_FOUND + ); +} + function collectConfiguredPluginIds(cfg: OpenClawConfig): Set { const ids = new Set(); const plugins = asObjectRecord(cfg.plugins); @@ -68,14 +77,16 @@ function collectDownloadableInstallCandidates(params: { ) { continue; } + const clawhubSpec = entry.install.clawhubSpec?.trim(); const npmSpec = entry.install.npmSpec?.trim(); - if (!npmSpec) { + if (!clawhubSpec && !npmSpec) { continue; } candidates.set(pluginId, { pluginId, label: entry.meta.label, - npmSpec, + ...(clawhubSpec ? { clawhubSpec } : {}), + ...(npmSpec ? { npmSpec } : {}), ...(entry.install.expectedIntegrity ? { expectedIntegrity: entry.install.expectedIntegrity } : {}), @@ -90,14 +101,16 @@ function collectDownloadableInstallCandidates(params: { if (!configuredPluginIds.has(entry.pluginId) && !params.missingPluginIds.has(entry.pluginId)) { continue; } + const clawhubSpec = entry.install.clawhubSpec?.trim(); const npmSpec = entry.install.npmSpec?.trim(); - if (!npmSpec) { + if (!clawhubSpec && !npmSpec) { continue; } candidates.set(entry.pluginId, { pluginId: entry.pluginId, label: entry.label, - npmSpec, + ...(clawhubSpec ? { clawhubSpec } : {}), + ...(npmSpec ? { npmSpec } : {}), ...(entry.install.expectedIntegrity ? { expectedIntegrity: entry.install.expectedIntegrity } : {}), @@ -118,6 +131,65 @@ async function installCandidate(params: { warnings: string[]; }> { const { candidate } = params; + const warnings: string[] = []; + if (candidate.clawhubSpec) { + const result = await installPluginFromClawHub({ + spec: candidate.clawhubSpec, + extensionsDir: resolveDefaultPluginExtensionsDir(), + expectedPluginId: candidate.pluginId, + mode: "install", + }); + if (result.ok) { + const pluginId = result.pluginId; + return { + records: { + ...params.records, + [pluginId]: { + source: "clawhub", + spec: candidate.clawhubSpec, + installPath: result.targetDir, + version: result.version, + installedAt: new Date().toISOString(), + integrity: result.clawhub.integrity, + resolvedAt: result.clawhub.resolvedAt, + clawhubUrl: result.clawhub.clawhubUrl, + clawhubPackage: result.clawhub.clawhubPackage, + clawhubFamily: result.clawhub.clawhubFamily, + clawhubChannel: result.clawhub.clawhubChannel, + clawpackSha256: result.clawhub.clawpackSha256, + clawpackSpecVersion: result.clawhub.clawpackSpecVersion, + clawpackManifestSha256: result.clawhub.clawpackManifestSha256, + clawpackSize: result.clawhub.clawpackSize, + }, + }, + changes: [ + `Installed missing configured plugin "${pluginId}" from ${candidate.clawhubSpec}.`, + ], + warnings: [], + }; + } + if (!candidate.npmSpec || !shouldFallbackClawHubCandidateToNpm(result)) { + return { + records: params.records, + changes: [], + warnings: [ + `Failed to install missing configured plugin "${candidate.pluginId}" from ${candidate.clawhubSpec}: ${result.error}`, + ], + }; + } + warnings.push( + `ClawHub ${candidate.clawhubSpec} unavailable for ${candidate.pluginId}; falling back to npm ${candidate.npmSpec}.`, + ); + } + if (!candidate.npmSpec) { + return { + records: params.records, + changes: [], + warnings: [ + `Failed to install missing configured plugin "${candidate.pluginId}": no supported install source found.`, + ], + }; + } const result = await installPluginFromNpmSpec({ spec: candidate.npmSpec, extensionsDir: resolveDefaultPluginExtensionsDir(), @@ -130,6 +202,7 @@ async function installCandidate(params: { records: params.records, changes: [], warnings: [ + ...warnings, `Failed to install missing configured plugin "${candidate.pluginId}" from ${candidate.npmSpec}: ${result.error}`, ], }; @@ -148,7 +221,7 @@ async function installCandidate(params: { }, }, changes: [`Installed missing configured plugin "${pluginId}" from ${candidate.npmSpec}.`], - warnings: [], + warnings, }; }