[Feature]: Setting to disable the hosted plugin catalog feed

#164620 · open · 2 comments

View on GitHub ↗

olyapop

### Summary Add a setting to disable the hosted plugin catalog feed. ### Problem to solve The gateway fetches `https://clawhub.ai/v1/feeds/plugins` when it lists or inspects plugins, and there's no way to turn that off. The URL is hardcoded in `official-external-plugin-catalog-source.ts`, and `OPENCLAW_CLAWHUB_URL` doesn't cover it. ### Proposed solution A config key, e.g. `plugins.catalog.hosted: false`, that skips the hosted feed and uses only the bundled catalog metadata. ### Alternatives considered Blocking the host at the network layer, which works but leaves the request firing. ### Impact Deployments that pin their plugins and restrict egress don't need the feed. ### Do you plan to open a PR for this? Maybe, with maintainer guidance

Comments

clawsweeper[bot]

Codex review: this still needs some work. _Reviewed October 3, 2026, 7:43 PM ET / 23:43 UTC._ **Summary** The requested deployment control is still missing. Marketplace entries support a command-specific offline mode, but Gateway listing and inspection still load the hosted catalog; a new persistent control needs maintainer agreement. Reproducibility: not applicable. as a bug reproduction: source confirms the missing configuration capability and the Gateway’s hosted-loader call; no runtime execution was performed. **Maintainer decision needed** | Question | Recommendation | |---|---| | Should OpenClaw expose a persistent bundled-only plugin catalog setting that suppresses hosted requests and previously cached hosted catalog data? | **Support persistent bundled-only mode:** Approve a default-preserving catalog setting shared by Gateway and CLI consumers, with explicit refresh behavior documented. | Why: Existing offline behavior retains hosted snapshots; choosing bundled-only semantics and the scope of explicit refresh commands creates a new operator-facing contract. **Next step** Confirm bundled-only semantics and refresh scope before assigning a focused implementation; a new configuration contract is ineligible for strict bug automation. <details> <summary>Review details</summary> Best possible solution: Use one catalog-owner policy to provide a documented bundled-only mode across Gateway listing, inspection, and CLI callers, preserving current defaults and invalidating cached hosted presentation when the policy changes. Do we have a high-confidence way to reproduce the issue? Not applicable as a bug reproduction: source confirms the missing configuration capability and the Gateway’s hosted-loader call; no runtime execution was performed. Is this the best way to solve the issue? Unclear until maintainers choose the contract. A policy at the existing catalog owner is the narrowest path; reusing offline mode unchanged would still expose cached hosted metadata. AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning medium; reviewed against [89c984736562](https://github.com/openclaw/openclaw/commit/89c984736562959b3e6160dc118d4b84e18aabe6). </details> <details> <summary>Label changes</summary> Label changes: - add `P2`: This is a bounded deployment-control improvement without evidence of a broken core workflow. - add `impact:other`: Pinned-plugin deployments cannot suppress optional hosted catalog egress through a persistent supported setting. - add `issue-rating: 🌊 off-meta tidepool`: Current issue advisory state selects this label. - add `clawsweeper:no-new-fix-pr`: Current issue advisory state selects this label. - add `clawsweeper:needs-maintainer-review`: Current issue advisory state selects this label. - add `clawsweeper:needs-product-decision`: Current issue advisory state selects this label. Label justifications: - `P2`: This is a bounded deployment-control improvement without evidence of a broken core workflow. - `impact:other`: Pinned-plugin deployments cannot suppress optional hosted catalog egress through a persistent supported setting. </details> <details> <summary>Evidence reviewed</summary> What I checked: - **Gateway catalog requests remain enabled:** loadOfficialCatalog calls the hosted loader without an offline or disable parameter and caches its result. listManagedPlugins and inspectManagedPlugin consume this owner at lines 242 and 588. ([`src/plugins/management-catalog.ts:273`](https://github.com/openclaw/openclaw/blob/89c984736562959b3e6160dc118d4b84e18aabe6/src/plugins/management-catalog.ts#L273), [89c984736562](https://github.com/openclaw/openclaw/commit/89c984736562959b3e6160dc118d4b84e18aabe6)) - **Existing offline behavior has a narrower contract:** The hosted loader checks an explicit offline parameter before network I/O, but offline mode selects an accepted hosted snapshot before bundled fallback. It therefore differs from the requested persistent bundled-only mode. ([`src/plugins/official-external-plugin-catalog-hosted.ts:425`](https://github.com/openclaw/openclaw/blob/89c984736562959b3e6160dc118d4b84e18aabe6/src/plugins/official-external-plugin-catalog-hosted.ts#L425), [89c984736562](https://github.com/openclaw/openclaw/commit/89c984736562959b3e6160dc118d4b84e18aabe6)) - **Documented command-specific workaround:** Marketplace documentation describes entries --offline as reading the latest accepted snapshot without fetching. This is useful for that CLI command but does not establish a deployment-wide Gateway setting. Public docs: [`docs/cli/plugins/marketplace.md`](https://docs.openclaw.ai/cli/plugins/marketplace). ([`docs/cli/plugins/marketplace.md:28`](https://docs.openclaw.ai/cli/plugins/marketplace), [89c984736562](https://github.com/openclaw/openclaw/commit/89c984736562959b3e6160dc118d4b84e18aabe6)) - **No persistent catalog configuration:** The strict plugins schema supports loading, allow/deny lists, slots, and entries, but has no catalog configuration. The proposed key would introduce a new supported configuration surface. ([`src/config/zod-schema.root-shape.ts:579`](https://github.com/openclaw/openclaw/blob/89c984736562959b3e6160dc118d4b84e18aabe6/src/config/zod-schema.root-shape.ts#L579), [89c984736562](https://github.com/openclaw/openclaw/commit/89c984736562959b3e6160dc118d4b84e18aabe6)) - **Catalog feed and registry overrides are separate:** The feed source supplies the default clawhub.ai feed independently of the ClawHub client’s registry URL resolver. OPENCLAW_CLAWHUB_URL changes the latter and is not a hosted-feed disable control. ([`src/plugins/official-external-plugin-catalog-source.ts:24`](https://github.com/openclaw/openclaw/blob/89c984736562959b3e6160dc118d4b84e18aabe6/src/plugins/official-external-plugin-catalog-source.ts#L24), [89c984736562](https://github.com/openclaw/openclaw/commit/89c984736562959b3e6160dc118d4b84e18aabe6)) - **Latest release also lacks the proposed setting:** GitHub contents reads at v2026.9.8 confirmed the public feed default and a strict plugins schema without a catalog setting. Local historical blob reads failed because the remote rejected retrieval; release inspection was completed through GitHub’s read API. ([`src/config/zod-schema.root-shape.ts`](https://github.com/openclaw/openclaw/blob/fc23bc864e4553c2d215e479eeec47b67a0bf943/src/config/zod-schema.root-shape.ts), [fc23bc864e45](https://github.com/openclaw/openclaw/commit/fc23bc864e4553c2d215e479eeec47b67a0bf943)) Likely related people: - **steipete:** Suggested for follow-up; no historical authorship or introduction is verified. (role: unverified routing candidate; confidence: low) </details> <details> <summary>How this review workflow works</summary> - ClawSweeper keeps one durable marker-backed review comment per issue or PR. - Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments. - A fresh review can be triggered by eligible `@clawsweeper re-review` comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch. - PR/issue authors and users with repository write access can comment `@clawsweeper re-review` or `@clawsweeper re-run` on an open PR or issue to request a fresh review only. - Maintainers can also comment `@clawsweeper review` to request a fresh review only. - Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge. - Maintainer-only repair and merge flows require explicit commands such as `@clawsweeper autofix`, `@clawsweeper automerge`, `@clawsweeper fix ci`, or `@clawsweeper address review`. - Maintainers can comment `@clawsweeper explain` to ask for more context, or `@clawsweeper stop` to stop active automation. </details> <!-- clawsweeper-review-version item=164620 reviewed_at=2026-10-03T23:43:46.135Z sha=na source_revision=17865610350c2d901ba53017ab07090460525ae27ec4100a1a29e3e7ea1c8d96 lease_owner=github-run-37162492974-1 lease_comment_id=5974681143 v=1 --> <!-- clawsweeper-review item=164620 -->

Joelincn

Same problem from a fake-IP environment (Clash/mihomo, `198.18.0.0/15` + `fc00::/7`) — supporting this request with an additional reason. On this host `https://clawhub.ai/v1/feeds/plugins` is **refused by the SSRF guard** (`Blocked: resolves to private/internal/special-use IP address`) on every plugin list/inspect and at gateway startup — 20 blocked lines in one day — and the skill-icon fetches (`/api/v1/skill-icons/...`) each burn a 5 s timeout. So on fake-IP networks the feed isn't just unnecessary, it actively fails and spams the log. Related same-class issues: #152765 (remote model catalog refresh ignores `ssrfPolicy.allowRfc2544BenchmarkRange`) and #168356 (provider discovery hardcodes ~5 s and ignores `models.providers.<id>.timeoutSeconds`). One more data point: fake-IP handling in OpenClaw feels **regressive** — earlier releases handled several of these paths (there are closed issues like #68192, #88984, #55058 for web_fetch/QQ/auth paths), but recent versions re-introduced the same failure shape on the catalog/discovery/plugin-feed paths. A `plugins.catalog.hosted: false`-style toggle — or consistently honoring the `allowRfc2544BenchmarkRange` / `allowIpv6UniqueLocalRange` flags on all three paths — would resolve this class once instead of per-path regressions.