Add hosted catalog config profiles#95981
Conversation
774693c to
a40fa1c
Compare
|
One naming/API-shape thought before this config surface hardens: should this be I checked the closest adjacent tools we likely want to rhyme with. Codex uses top-level Given this slice is making the persisted OpenClaw config surface, |
7ab496e to
21ef7fb
Compare
a40fa1c to
e8c9fcd
Compare
21ef7fb to
ceef5a5
Compare
4034a03 to
ae43014
Compare
|
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. |
ceef5a5 to
30fbce9
Compare
ae43014 to
fdd7f78
Compare
|
Codex review: needs maintainer review before merge. Reviewed June 28, 2026, 10:46 AM ET / 14:46 UTC. Summary 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.
Stored data model Root-cause cluster Members:
Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything. Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Risk before merge
Maintainer options:
Next step before merge
Security Review detailsBest possible solution: Land after maintainers explicitly accept the durable 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 changesLabel justifications:
Evidence reviewedPR surface: Source +681, Tests +1792, Docs -2, Generated 0, Other +32. Total +2503 across 69 files. View PR surface stats
What I checked:
Likely related people:
What the crustacean ranks mean
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
|
30fbce9 to
3032d05
Compare
fdd7f78 to
05a3e13
Compare
71c70dd to
dcf2194
Compare
dcf2194 to
de557ea
Compare
|
@clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. |
de557ea to
35eeb6d
Compare
|
@clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. |
|
Merged via squash.
Thanks @giodl73-repo! |
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.
marketplaces.feedsandmarketplaces.sourcesprofiles.openclaw plugins marketplace refreshas the explicit manual snapshot refresh path.openclaw plugins marketplace entriesas the explicit manual read path over hosted, snapshot, or bundled fallback entries.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/pluginsand/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.marketplacesinstead of taking only ad hoc in-memory profile config.This sits on PR5's live ClawHub defaults:
clawhub-publicpoints athttps://clawhub.ai/v1/feeds/plugins,public-clawhubrepresents ClawHub candidates, andpublic-npmremains 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.feedsandmarketplaces.sources, rather thancatalog.feedsandcatalog.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
marketplaces.feedsandmarketplaces.sourcesconfig types and Zod schema validation.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.mjspnpm 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.mjsCI=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 --checknode 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:testpnpm tsgo:corepnpm config:docs:genandpnpm config:docs:check(docs/.generated/config-baseline.sha256updated)git diff --check origin/main...HEADandgit diff --checkef4d81cd08: pass/skip onlycodex 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.marketplacesbridge to load the live ClawHub feed.Real environment tested:
Windows checkout
C:\src\openclaw-prflow\.worktrees\pr-95981at pushed PR6 headef4d81cd08, source harness vianode --import tsx, live HTTPS request tohttps://clawhub.ai/v1/feeds/plugins.Exact steps or command run after this patch:
marketplaces.feeds.clawhub.url = https://clawhub.ai/v1/feeds/plugins.public-clawhub.type = clawhubandpublic-npm.type = npm.loadConfiguredHostedOfficialExternalPluginCatalogEntries(config, { feedProfile: "clawhub", snapshotStore: null }).resolveOfficialExternalPluginInstall(entry, { catalogConfig: config.marketplaces }).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
marketplacesfeed profile loaded the live hosted feed ashosted, 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.