Skip to content

[plugins] Enforce marketplace source policy at runtime - #29691

Merged
xl-openai merged 1 commit into
mainfrom
xl/marketplace-runtime-enforcement
Jun 27, 2026
Merged

[plugins] Enforce marketplace source policy at runtime#29691
xl-openai merged 1 commit into
mainfrom
xl/marketplace-runtime-enforcement

Conversation

@xl-openai

Copy link
Copy Markdown
Contributor

Summary

  • project effective marketplace/plugin config through the enterprise source policy so blocked installed plugins become inactive
  • filter plugin list/read/discovery and CLI marketplace source/snapshot reporting using the same policy
  • enforce source admission for background marketplace cache refreshes
  • continue refreshing/upgrading independent marketplaces and plugins when one entry fails, returning per-entry errors
  • include policy-projected plugin state in cache and refresh keys so requirement changes invalidate stale results

Stack

This is PR 2 of 2 and is based on #29690. Review the admission model and source matcher in #29690 first; this PR contains only runtime enforcement.

Test plan

  • just test -p codex-core-plugins (287 tests)
  • just test -p codex-cli plugin_list_ignores_implicit_system_marketplace_roots_without_manifests
  • cargo check -p codex-cli -p codex-app-server --tests
@xl-openai
xl-openai force-pushed the xl/marketplace-source-admission branch from dde08a8 to 74505d8 Compare June 23, 2026 23:14
@xl-openai
xl-openai force-pushed the xl/marketplace-runtime-enforcement branch from 8c09750 to 0be7eb4 Compare June 23, 2026 23:23
@xl-openai
xl-openai force-pushed the xl/marketplace-source-admission branch 4 times, most recently from 712d186 to a749876 Compare June 24, 2026 00:28
@xl-openai
xl-openai force-pushed the xl/marketplace-source-admission branch 2 times, most recently from b6afbd3 to 730a101 Compare June 24, 2026 01:38
xl-openai added a commit that referenced this pull request Jun 24, 2026
## Why

Managed deployments need a mergeable way to declare which marketplace
sources Codex may use. An enterprise-keyed TOML table avoids array merge
ambiguity and lets every requirements layer use the existing config
precedence rules without a marketplace-specific merger.

## Requirements shape

```toml
[marketplaces]
restrict_to_allowed_sources = true

[marketplaces.allowed_sources.company_plugins]
source = "git"
url = "https://github.com/example/company-plugins.git"
ref = "main"

[marketplaces.allowed_sources.internal_git]
source = "host_pattern"
host_pattern = "^git\\.example\\.com$"

[marketplaces.allowed_sources.local_plugins]
source = "local"
path = "/opt/company/codex-plugins"
```

`restrict_to_allowed_sources` follows normal scalar precedence.
`allowed_sources` follows normal recursive TOML table merge behavior:
distinct keys accumulate and fields under the same key use normal layer
precedence. The final `source` value later selects which fields the
marketplace admission policy interprets.

The raw rule fields remain optional while requirements layers are
composed, so a higher-priority layer can override only `ref`, `url`, or
another individual field. Source-specific validation and normalization
intentionally belong to the marketplace admission layer, not
requirements merging.

This initial shape includes `git`, `host_pattern`, and `local` sources.
It does not add npm or path-pattern rules.

## What changed

- Add the marketplace requirements TOML shape to
`ConfigRequirementsToml`, `ConfigRequirementsWithSources`, and
`ConfigRequirements`.
- Carry marketplace requirements through the existing regular
requirements merge path.
- Keep allowed-source entries as raw partial tables for downstream
policy interpretation.
- Cover partial same-key overlays, source changes, unknown fields, and
unmodified local paths.

This PR defines and composes the requirements only. Source admission is
implemented by the next PR in the stack.

## Stack

This is PR 1 of 3. #29753 adds source admission on top of this PR; draft
#29691 will add runtime enforcement after it is rebased later.

## Test plan

- `just test -p codex-config marketplace_`
Base automatically changed from xl/marketplace-source-admission to main June 24, 2026 02:42
xl-openai added a commit that referenced this pull request Jun 24, 2026
## Why

Managed marketplace source requirements only become effective when every
local marketplace mutation path applies the same admission decision.
This change centralizes that decision so CLI, app-server, and
external-agent migration flows cannot add, install from, or refresh a
disallowed source.

## What changed

- Match exact normalized Git repository URLs with an optional exact
`ref`.
- Match Git hosts with managed regular expressions.
- Match local marketplaces by exact absolute path.
- Preserve the expected path/name boundary for managed OpenAI
marketplaces.
- Enforce source admission during marketplace add, plugin install, and
configured Git marketplace upgrade.
- Continue upgrading independent marketplaces when one source is
rejected and return a per-marketplace error.
- Load the effective requirements stack at CLI, app-server, and
external-agent migration entry points.

This PR does not filter already configured marketplaces at runtime; that
remains in draft follow-up #29691.

## Stack

This is PR 2 of 3 and is based on #29690, which introduces the
requirements data shape and merge behavior.

## Test plan

- Source matcher coverage for Git URL/ref, host-pattern, local-path, and
managed marketplace cases.
- Marketplace add and plugin install coverage for allowed and rejected
sources.
- Marketplace upgrade coverage for rejection and per-marketplace
continuation.
@xl-openai
xl-openai force-pushed the xl/marketplace-runtime-enforcement branch from 0be7eb4 to d4a78bc Compare June 24, 2026 23:15
@xl-openai
xl-openai force-pushed the xl/marketplace-runtime-enforcement branch from d4a78bc to 25b4dcf Compare June 27, 2026 02:21
@xl-openai
xl-openai marked this pull request as ready for review June 27, 2026 02:22
@xl-openai
xl-openai merged commit 9dbdb4e into main Jun 27, 2026
35 checks passed
@xl-openai
xl-openai deleted the xl/marketplace-runtime-enforcement branch June 27, 2026 22:22
@github-actions github-actions Bot locked and limited conversation to collaborators Jun 27, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

2 participants