Add executor-owned plugin resolution#27692
Merged
Merged
Conversation
Base automatically changed from
jif/mcp-thread-scoped-registration-context
to
main
June 12, 2026 09:20
f12de5d to
8a69762
Compare
Collaborator
Author
|
@codex review |
Contributor
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8a69762b3a
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
CCA can select a capability root that lives in an executor environment, but
Codex only had a host-filesystem plugin loader. Before selected executor
plugins can contribute MCP servers, we need a small package boundary that can
answer:
The answer must come from the selected environment's filesystem. A failed
executor lookup must never fall back to the orchestrator filesystem.
What this changes
This PR introduces:
ExecutorPluginProviderresolves oneSelectedCapabilityRootthrough itsexact
environment_id. It checks the recognized manifest locations, reads themanifest through that environment's
ExecutorFileSystem, and returns an inertResolvedPlugincontaining:Descriptor construction rejects manifest or component paths outside the
selected package root, so consumers cannot accidentally lose the package
boundary when they receive a resolved plugin.
If the root has no plugin manifest, resolution returns
None, allowing thecaller to treat it as a standalone capability such as a skill.
The existing host loader and the new executor provider now share the same
manifest parser. Existing
codex-core-plugins::manifesttype paths remainavailable through re-exports, so host behavior and callers are unchanged.
Scope
This is intentionally a non-user-visible package-resolution PR. It does not:
#27670 has merged, and this PR is now based directly on
main. Together withthe resolved MCP catalog from #27634, it establishes the inputs needed for the
executor stdio MCP vertical without changing the existing MCP runtime.
Follow-up
The next PR will consume
ResolvedPlugin, read its declared/default MCP configthrough the same executor filesystem, bind supported stdio servers to that
environment, and feed those registrations into the resolved MCP catalog. An
app-server E2E will prove that selecting an executor plugin exposes and invokes
its tool on the owning executor.
Resume/fork semantics, dynamic environment replacement, and non-stdio
placement remain separate lifecycle decisions.
Validation
just fmtcargo check --tests -p codex-plugin -p codex-core-pluginsjust bazel-lock-checkgit diff --checkTest targets were compiled but not executed locally; CI will run the test and
Clippy suites.