Skip to content

Add hosted catalog config profiles#95981

Merged
giodl73-repo merged 1 commit into
mainfrom
feeds-hosted-catalog-config-profiles
Jun 28, 2026
Merged

Add hosted catalog config profiles#95981
giodl73-repo merged 1 commit into
mainfrom
feeds-hosted-catalog-config-profiles

Conversation

@giodl73-repo

@giodl73-repo giodl73-repo commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

Hosted Marketplace Feed Stack

This is PR6 in the hosted marketplace feed stack. The stack should land in order, with maintainer review at each step before the later PRs wire hosted marketplace data into broader user flows.

  1. Refactor external plugin catalog toward feeds #95846: refactor the bundled external plugin catalog toward the feed-shaped data model.
  2. Add hosted external catalog feed loader #95868: add the lazy hosted marketplace feed loader for the configured public feed URL, with guarded HTTPS fetch, checksum, schema, size, timeout, and bundled fallback behavior.
  3. Add hosted catalog snapshot fallback #95877: add accepted hosted snapshot fallback so a failed or unchanged hosted fetch can reuse the last valid feed payload.
  4. Persist hosted catalog snapshots in state #95964: persist hosted marketplace feed snapshots in OpenClaw state.
  5. Add hosted catalog source profile validation #95969: add marketplace source profile validation for hosted feed install candidates.
  6. Add hosted catalog config profiles #95981: add configurable marketplaces.feeds and marketplaces.sources profiles.
  7. Add marketplace feed refresh command #96155: add openclaw plugins marketplace refresh as the explicit manual snapshot refresh path.
  8. Add marketplace feed entries command #96158: add openclaw plugins marketplace entries as the explicit manual read path over hosted, snapshot, or bundled fallback entries.
  9. Add marketplace feed telemetry #96194: add marketplace feed telemetry.

The broader follow-up after this stack is to decide whether and how marketplace entries should feed install/search/startup behavior, add automatic conditional refresh using ETag / Last-Modified, or move to ClawHub producer-side validation for /v1/feeds/plugins and /v1/feeds/skills.

Summary

This is PR6 in the hosted feeds stack. It wires the local OpenClaw config surface for marketplace feed profiles and local package source profiles, then adds a small bridge so the hosted external plugin catalog loader can consume config.marketplaces instead of taking only ad hoc in-memory profile config.

This sits on PR5's live ClawHub defaults: clawhub-public points at https://clawhub.ai/v1/feeds/plugins, public-clawhub represents ClawHub candidates, and public-npm remains available for npm-backed candidates. The config schema examples use that shape so reviewers can see how tenant or organization marketplace profiles would extend the same model.

Source profiles intentionally carry only a local source name and type in this slice; registry/base URL endpoints are rejected until installer resolution can enforce them. Feed profile URLs are also plain HTTPS URLs only: credentials, query strings, and fragments are rejected while feed auth/SecretRef support is not implemented.

This update also addresses Patrick's naming/API-shape feedback by using marketplace terminology for the persisted config surface: marketplaces.feeds and marketplaces.sources, rather than catalog.feeds and catalog.sources.

This intentionally does not implement product activation of configured feeds, feed refresh scheduling, feed auth execution, signed feed verification, or installer registry switching. Auth and signed verification are rejected by this config schema until the corresponding loader/envelope enforcement exists. The purpose of this PR is to make the RFC's local ownership model concrete: feeds and sources are local config, while remote feed entries can only refer to configured source names.

What Changed

  • Adds marketplaces.feeds and marketplaces.sources config types and Zod schema validation.
  • Supports the concrete local fields used by this stack today: plain HTTPS feed URL, unsigned verification opt-in, and npm/ClawHub/Git source profile names/types.
  • Rejects feed auth, URL credentials/query/fragments, signed verification config, and source endpoint fields for now so users cannot configure security or installer contracts the loader does not yet enforce.
  • Adds config labels/help so the new section appears coherently in generated schema/docs surfaces.
  • Adds loadConfiguredHostedOfficialExternalPluginCatalogEntries(...) as the bridge from OpenClaw config to the hosted catalog loader introduced by the earlier stack.

Validation

  • pnpm exec oxfmt src/config/schema.help.ts src/config/schema.labels.ts src/config/types.marketplaces.ts src/config/types.openclaw.ts src/config/types.ts src/config/zod-schema.marketplaces.test.ts src/config/zod-schema.ts src/plugins/official-external-plugin-catalog.ts src/plugins/official-external-plugin-catalog.test.ts scripts/plugin-sdk-surface-report.mjs
  • pnpm exec oxlint --deny-warnings src/config/schema.help.ts src/config/schema.labels.ts src/config/types.marketplaces.ts src/config/types.openclaw.ts src/config/types.ts src/config/zod-schema.marketplaces.test.ts src/config/zod-schema.ts src/plugins/official-external-plugin-catalog.ts src/plugins/official-external-plugin-catalog.test.ts scripts/plugin-sdk-surface-report.mjs
  • CI=1 node scripts/test-projects.mjs src/plugins/official-external-plugin-catalog.test.ts src/config/zod-schema.marketplaces.test.ts (10 marketplace schema tests, 45 hosted catalog/plugin tests)
  • node scripts/plugin-sdk-surface-report.mjs --check
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.tooling.config.ts --reporter=verbose test/scripts/plugin-sdk-surface-report.test.ts (8 tests passed after one transient rerun)
  • pnpm tsgo:core:test
  • pnpm tsgo:core
  • pnpm config:docs:gen and pnpm config:docs:check (docs/.generated/config-baseline.sha256 updated)
  • git diff --check origin/main...HEAD and git diff --check
  • GitHub required checks on head ef4d81cd08: pass/skip only
  • codex review --base origin/main (no actionable correctness issues before the URL hardening; ClawSweeper then requested the plain-URL hardening now included)

Real behavior proof

Behavior or issue addressed:
OpenClaw config can provide a named hosted marketplace feed profile and local source profiles, and the hosted loader uses that config.marketplaces bridge to load the live ClawHub feed.

Real environment tested:
Windows checkout C:\src\openclaw-prflow\.worktrees\pr-95981 at pushed PR6 head ef4d81cd08, source harness via node --import tsx, live HTTPS request to https://clawhub.ai/v1/feeds/plugins.

Exact steps or command run after this patch:

  1. Set OpenClaw config with marketplaces.feeds.clawhub.url = https://clawhub.ai/v1/feeds/plugins.
  2. Set source profiles public-clawhub.type = clawhub and public-npm.type = npm.
  3. Ran loadConfiguredHostedOfficialExternalPluginCatalogEntries(config, { feedProfile: "clawhub", snapshotStore: null }).
  4. Resolved the sample entry through resolveOfficialExternalPluginInstall(entry, { catalogConfig: config.marketplaces }).
  5. Final stack validation passed formatter, lint, focused tests, tsgo:core:test, tsgo:core, git diff --check, GitHub required checks, and Codex review.

Evidence after fix:

{
  "head": "ef4d81cd08",
  "resultSource": "hosted",
  "metadata": {
    "url": "https://clawhub.ai/v1/feeds/plugins",
    "status": 200,
    "etag": "\"sha256:76a49aad745fe828c7f88b5a870ad67b5953c5235b4c928b1d6189584b257b63-gzip\"",
    "lastModified": "Sun, 28 Jun 2026 12:47:16 GMT",
    "checksum": "sha256:76a49aad745fe828c7f88b5a870ad67b5953c5235b4c928b1d6189584b257b63"
  },
  "entryCount": 59,
  "feed": {
    "id": "clawhub-official",
    "sequence": 19
  },
  "firstEntry": {
    "id": "@expediagroup/expedia-openclaw",
    "install": {
      "clawhubSpec": "clawhub:@expediagroup/[email protected]",
      "defaultChoice": "clawhub",
      "expectedIntegrity": "sha256-s1XdoEQDvsqri7qwaf0eewV4Ji50WeWYzFsZYVtb2rk="
    }
  }
}

Observed result after fix:
The configured marketplaces feed profile loaded the live hosted feed as hosted, validated configured source refs, and produced 59 entries. The sample ClawHub entry resolves to a ClawHub install spec and expected ClawHub artifact integrity, with no npm install spec emitted for that ClawHub-source candidate.

What was not tested:
Signed-feed enforcement and authenticated private feed profiles are intentionally later slices.

@Patrick-Erichsen

Copy link
Copy Markdown
Contributor

One naming/API-shape thought before this config surface hardens: should this be marketplaces.{feeds,sources} instead of catalog.{feeds,sources}?

I checked the closest adjacent tools we likely want to rhyme with. Codex uses top-level [marketplaces.<name>] for plugin marketplace sources, separate from [plugins."plugin@marketplace"] for installed/enabled plugins. Claude Code also uses marketplace terminology for this supply-chain surface (extraKnownMarketplaces, strictKnownMarketplaces) and keeps MCP/connectors as a separate config concern.

Given this slice is making the persisted OpenClaw config surface, marketplaces seems closer to the product concept than catalog: these entries define locally trusted extension/plugin feed/source roots, while catalog is more generic and already overloaded with model/provider catalogs.

@giodl73-repo
giodl73-repo force-pushed the feeds-hosted-catalog-source-profiles branch from 7ab496e to 21ef7fb Compare June 23, 2026 13:31
@giodl73-repo
giodl73-repo force-pushed the feeds-hosted-catalog-config-profiles branch from a40fa1c to e8c9fcd Compare June 23, 2026 13:40
@giodl73-repo
giodl73-repo force-pushed the feeds-hosted-catalog-source-profiles branch from 21ef7fb to ceef5a5 Compare June 23, 2026 13:49
@giodl73-repo
giodl73-repo force-pushed the feeds-hosted-catalog-config-profiles branch 4 times, most recently from 4034a03 to ae43014 Compare June 23, 2026 16:03
@giodl73-repo

Copy link
Copy Markdown
Contributor Author

Addressed the naming feedback here: the persisted config surface is now marketplaces.feeds / marketplaces.sources, the config bridge reads config.marketplaces, and the PR body/validation have been updated to match.

@giodl73-repo
giodl73-repo force-pushed the feeds-hosted-catalog-source-profiles branch from ceef5a5 to 30fbce9 Compare June 23, 2026 16:12
@giodl73-repo
giodl73-repo force-pushed the feeds-hosted-catalog-config-profiles branch from ae43014 to fdd7f78 Compare June 23, 2026 16:15
@clawsweeper

clawsweeper Bot commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed June 28, 2026, 10:46 AM ET / 14:46 UTC.

Summary
The branch adds marketplace feed/source config schema, types, help labels, generated baseline updates, and a config-to-hosted-catalog loader bridge.

PR surface: Source +681, Tests +1792, Docs -2, Generated 0, Other +32. Total +2503 across 69 files.

Reproducibility: not applicable. this is a feature/config-surface PR rather than a bug report. The changed behavior is demonstrated by PR-head source, focused tests, and the PR body's live hosted-feed output.

Review metrics: 3 noteworthy metrics.

  • Marketplace config surface: 1 top-level section, 2 profile maps, 3 source types, 1 verification mode. These accepted names and shapes become compatibility-sensitive user config once released.
  • Hosted loader controls: 2 optional params added. offline and requireSnapshotWrite alter hosted-loader behavior that dependent marketplace command slices will rely on.
  • Plugin SDK config-type budget: config-types +4, public exports +4. The broad config-types surface makes marketplace config types visible to plugin-facing type consumers.

Stored data model
Persistent data-model change detected: database schema: src/gateway/server.sessions.create.test.ts, database schema: src/plugins/official-external-plugin-catalog.test.ts, migration/backfill/repair: src/gateway/server-startup-session-migration.test.ts, migration/backfill/repair: src/infra/state-migrations.orphan-keys.test.ts, migration/backfill/repair: src/plugins/doctor-contract-registry.load-paths.test.ts, serialized state: extensions/zalo/src/api.test.ts, and 19 more. Confirm migration or upgrade compatibility proof before merge.

Root-cause cluster
Relationship: canonical
Canonical: #95981
Summary: This PR is the config-profile slice in the hosted marketplace feed stack; the listed related PRs are merged prerequisites or later dependent activation/telemetry slices, not duplicates.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🦞 diamond lobster
Patch quality: 🐚 platinum hermit
Result: ready for maintainer review.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • [P2] Record maintainer acceptance of the marketplaces.* config names and hosted-feed trust boundary before merge.

Risk before merge

  • [P1] The new marketplaces.feeds and marketplaces.sources names, source-type set, and unsigned verification shape become durable user config once shipped, so later renames or stricter validation need an upgrade path.
  • [P1] Marketplace feed and source profiles define local trust roots for hosted package metadata; maintainers should explicitly accept that boundary before refresh, listing, install, or startup flows rely on it.
  • [P1] The added offline and requireSnapshotWrite loader options are activation controls for dependent marketplace command slices, so maintainers should decide whether they belong in this config-profile PR.

Maintainer options:

  1. Confirm the marketplace config contract (recommended)
    Maintainers can merge after affirming marketplaces.feeds and marketplaces.sources as durable local trust-root config names and accepted shapes.
  2. Move activation controls later
    If this PR should stay limited to persisted config profiles, move offline and requireSnapshotWrite into the refresh/read command PRs that first consume them.
  3. Pause until activation policy settles
    Keep the PR paused if refresh, listing, install, or startup activation may require different feed/source naming or trust semantics.

Next step before merge

  • [P2] Manual review is required because the protected maintainer label and new durable config/trust boundary need maintainer acceptance, not a narrow ClawSweeper repair.

Security
Cleared: No concrete security or supply-chain defect was found; the diff adds no dependencies or workflows and rejects credentialed, query-bearing, authenticated, signed, or endpoint-rich feed config until enforcement exists.

Review details

Best possible solution:

Land after maintainers explicitly accept the durable marketplaces.* config contract and hosted-feed trust model, keeping unsupported auth, signed verification, and source endpoints rejected until enforcement exists.

Do we have a high-confidence way to reproduce the issue?

Not applicable: this is a feature/config-surface PR rather than a bug report. The changed behavior is demonstrated by PR-head source, focused tests, and the PR body's live hosted-feed output.

Is this the best way to solve the issue?

Yes for the implementation shape, pending product acceptance: the schema and config bridge sit at the config/catalog boundary, and current main does not already provide this hosted marketplace config surface.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 9241b9701d9c.

Label changes

Label justifications:

  • P2: This is normal-priority hosted marketplace config work with bounded immediate blast radius but real compatibility and trust-boundary review needs.
  • merge-risk: 🚨 compatibility: The PR adds durable marketplaces.* config keys, profile maps, source types, loader options, and plugin-facing type exports that later marketplace flows may depend on.
  • merge-risk: 🚨 security-boundary: The PR defines local trust-root profiles for hosted marketplace metadata, even though it rejects unsupported credentials, query strings, auth, signed verification, and source endpoints.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (live_output): The PR body includes after-change live output from a Windows source harness against the live ClawHub feed showing the new config bridge working.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes after-change live output from a Windows source harness against the live ClawHub feed showing the new config bridge working.
Evidence reviewed

PR surface:

Source +681, Tests +1792, Docs -2, Generated 0, Other +32. Total +2503 across 69 files.

View PR surface stats
Area Files Added Removed Net
Source 34 846 165 +681
Tests 25 1855 63 +1792
Docs 2 7 9 -2
Config 0 0 0 0
Generated 2 5 5 0
Other 6 38 6 +32
Total 69 2751 248 +2503

What I checked:

  • Repository policy marks this compatibility-sensitive: Root policy treats config/default additions, fallback behavior, and provider/plugin-affecting config loading as compatibility-sensitive merge risk, and asks for metrics on config/default surface changes. (AGENTS.md:31, 9241b9701d9c)
  • Plugin SDK/public config surface policy applies: The Plugin SDK scoped guide says this directory is a public contract between plugins and core; the PR updates SDK surface budgets for config types. (src/plugin-sdk/AGENTS.md:3, 9241b9701d9c)
  • Current main does not already implement this config surface: The current main checkout has no MarketplacesSchema, types.marketplaces, MarketplaceFeedProfileConfig, or configured hosted-catalog loader bridge. (9241b9701d9c)
  • PR adds strict marketplace config schema: PR head adds a plain HTTPS URL guard, unsigned-only verification, feed/source profile maps, source types, and top-level marketplaces parsing in OpenClawSchema. (src/config/zod-schema.ts:487, ef4d81cd0824)
  • PR adds marketplace config types: PR head adds MarketplaceFeedVerificationConfig, MarketplaceFeedProfileConfig, MarketplaceSourceProfileConfig, and MarketplacesConfig. (src/config/types.marketplaces.ts:1, ef4d81cd0824)
  • PR bridges config into hosted catalog loading: PR head adds loadConfiguredHostedOfficialExternalPluginCatalogEntries, preserves hosted fallback behavior, and adds offline plus requireSnapshotWrite loader controls. (src/plugins/official-external-plugin-catalog.ts:759, ef4d81cd0824)

Likely related people:

  • giodl73-repo: Authored the merged hosted-feed catalog loader, snapshot, and source-profile validation stack that this config-profile PR extends. (role: recent feature owner; confidence: high; commits: c29e1fe764f3, d1b917120a47, 1b0766080a30; files: src/plugins/official-external-plugin-catalog.ts, src/plugins/official-external-plugin-catalog.test.ts)
  • Patrick-Erichsen: Provided the marketplace naming/API-shape feedback in the PR discussion that the branch adopted for the persisted config surface. (role: API naming reviewer; confidence: medium; files: src/config/types.marketplaces.ts, src/config/zod-schema.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • 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.

@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. labels Jun 23, 2026
@giodl73-repo
giodl73-repo force-pushed the feeds-hosted-catalog-source-profiles branch from 30fbce9 to 3032d05 Compare June 24, 2026 02:48
@giodl73-repo
giodl73-repo force-pushed the feeds-hosted-catalog-config-profiles branch from fdd7f78 to 05a3e13 Compare June 24, 2026 02:48
@giodl73-repo
giodl73-repo force-pushed the feeds-hosted-catalog-config-profiles branch from 71c70dd to dcf2194 Compare June 28, 2026 04:57
@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jun 28, 2026
@giodl73-repo
giodl73-repo force-pushed the feeds-hosted-catalog-config-profiles branch from dcf2194 to de557ea Compare June 28, 2026 05:07
@openclaw-barnacle openclaw-barnacle Bot added the docs Improvements or additions to documentation label Jun 28, 2026
@giodl73-repo

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 28, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@giodl73-repo
giodl73-repo marked this pull request as ready for review June 28, 2026 12:38
@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Jun 28, 2026
@giodl73-repo
giodl73-repo force-pushed the feeds-hosted-catalog-config-profiles branch from de557ea to 35eeb6d Compare June 28, 2026 12:56
@openclaw-barnacle openclaw-barnacle Bot added the scripts Repository scripts label Jun 28, 2026
@giodl73-repo

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 28, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. labels Jun 28, 2026
@giodl73-repo

Copy link
Copy Markdown
Contributor Author

Merged via squash.

Thanks @giodl73-repo!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs Improvements or additions to documentation maintainer Maintainer-authored PR merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. P2 Normal backlog priority with limited blast radius. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. scripts Repository scripts size: M status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants