openclaw - 💡(How to fix) Fix @openclaw/[email protected] cannot activate when installed as standalone npm package (origin: global) — lazy-load path filters by manifest.origin === 'bundled' [1 comments, 2 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
openclaw/openclaw#78576Fetched 2026-05-07 03:35:07
View on GitHub
Comments
1
Participants
2
Timeline
1
Reactions
2
Timeline (top)
commented ×1

@openclaw/[email protected] ships as a standalone npm package. When installed via openclaw plugins install @openclaw/brave-plugin (or equivalent), the plugin reaches Status: loaded in the CLI metadata layer, but its web-search provider is never reachable at runtime. The agent's web_search tool returns "no provider available."

Error Message

[tools] web_search failed: Exa API error (401): {"error":"Invalid API key","tag":"INVALID_API_KEY"}

Root Cause

OpenClaw's runtime has a lazy-load path for capability providers at capability-provider-runtime-CcUn9vAQ.js:196 (loadCapabilityProviderEntries), which delegates to bundled-capability-runtime-BlLJoDsv.js:310 (loadBundledCapabilityRuntimeRegistry).

This path filters at line 348:

if (!manifest || manifest.origin !== "bundled" || !pluginIds.has(manifest.id)) continue;

@openclaw/brave-plugin installed as a standalone npm package has manifest.origin === "global", so it is rejected at this filter before its register() is ever invoked. By contrast, exa, perplexity, and firecrawl ship with the gateway and have origin: "bundled", so they pass.

The four startup-runtime branches in resolveGatewayStartupPluginPlanFromRegistry (channel-plugin-ids-B_qWBF4F.js:421-494) also don't admit brave: it has no channels, no cliBackends, no kind: "memory", and activation.onStartup: false. Even setting onStartup: true only adds it to the startup runtime registry — it doesn't fix the lazy-load filter.

Code Example

if (!manifest || manifest.origin !== "bundled" || !pluginIds.has(manifest.id)) continue;
RAW_BUFFERClick to expand / collapse

Summary

@openclaw/[email protected] ships as a standalone npm package. When installed via openclaw plugins install @openclaw/brave-plugin (or equivalent), the plugin reaches Status: loaded in the CLI metadata layer, but its web-search provider is never reachable at runtime. The agent's web_search tool returns "no provider available."

Root cause

OpenClaw's runtime has a lazy-load path for capability providers at capability-provider-runtime-CcUn9vAQ.js:196 (loadCapabilityProviderEntries), which delegates to bundled-capability-runtime-BlLJoDsv.js:310 (loadBundledCapabilityRuntimeRegistry).

This path filters at line 348:

if (!manifest || manifest.origin !== "bundled" || !pluginIds.has(manifest.id)) continue;

@openclaw/brave-plugin installed as a standalone npm package has manifest.origin === "global", so it is rejected at this filter before its register() is ever invoked. By contrast, exa, perplexity, and firecrawl ship with the gateway and have origin: "bundled", so they pass.

The four startup-runtime branches in resolveGatewayStartupPluginPlanFromRegistry (channel-plugin-ids-B_qWBF4F.js:421-494) also don't admit brave: it has no channels, no cliBackends, no kind: "memory", and activation.onStartup: false. Even setting onStartup: true only adds it to the startup runtime registry — it doesn't fix the lazy-load filter.

Reproduction

  1. Fresh openclaw 2026.5.2 install
  2. openclaw plugins install @openclaw/brave-plugin
  3. openclaw config set tools.web.search.provider 'brave'
  4. openclaw config set plugins.entries.brave.config.webSearch.apiKey '<valid-brave-key>'
  5. Restart gateway
  6. Run a web_search via the agent

Expected: web_search returns brave results. Actual: web_search is disabled or no provider is available.

Verified with a valid brave key: direct curl against https://api.search.brave.com/res/v1/web/search returns HTTP 200 with the same key, so it's not a credentials issue.

Verification that the lazy-load path works for bundled providers

Configured exa with a dummy key, restarted, ran web_search: [tools] web_search failed: Exa API error (401): {"error":"Invalid API key","tag":"INVALID_API_KEY"}

Exa is also absent from the gateway's http server listening (N plugins: ...) line, but the lazy-load path still reaches it because exa has manifest.origin === "bundled". This confirms the gate is origin === "bundled" specifically, not anything about activation/startup.

Suggested fixes (any one would resolve)

  1. Relax bundled-capability-runtime-BlLJoDsv.js:348 to accept manifest.origin === "global" plugins for capability resolution.
  2. Fold @openclaw/brave-plugin into the gateway's bundled extensions (parallel to exa/perplexity/firecrawl).
  3. Add a loadGlobalCapabilityRuntimeRegistry for npm-installed plugins that mirrors the bundled loader.

Environment

  • openclaw 2026.5.2
  • macOS (Mac Mini, Apple Silicon)
  • Gateway running under launchd
  • @openclaw/[email protected]

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

openclaw - 💡(How to fix) Fix @openclaw/brave-plugin@2026.5.2 cannot activate when installed as standalone npm package (origin: global) — lazy-load path filters by manifest.origin === 'bundled' [1 comments, 2 participants]