Skip to content

[codex] Add created-by-me remote plugin marketplace#28203

Open
ericning-o wants to merge 2 commits into
mainfrom
codex/created-by-me-remote-marketplace
Open

[codex] Add created-by-me remote plugin marketplace#28203
ericning-o wants to merge 2 commits into
mainfrom
codex/created-by-me-remote-marketplace

Conversation

@ericning-o

@ericning-o ericning-o commented Jun 14, 2026

Copy link
Copy Markdown
Contributor

Summary

  • add the created-by-me-remote marketplace backed by paginated scope=USER plugin directory and installed-plugin requests
  • include USER plugins in installed-plugin caching, bundle sync, and stale-cache cleanup without client-side discoverability filtering
  • expose the marketplace through app-server v2 and regenerate the protocol schemas

Testing

  • cargo build -p codex-app-server --bin codex-app-server
  • production-auth plugin/list smoke test for created-by-me-remote (returned the expected USER plugin as installed and enabled)
  • just test -p codex-core-plugins (221 passed)
  • just test -p codex-app-server-protocol (231 passed)
  • just test -p codex-app-server suite::v2::plugin_list:: (37 passed)
  • just fix -p codex-core-plugins -p codex-app-server-protocol -p codex-app-server
  • just fmt

@ericning-o ericning-o marked this pull request as ready for review June 14, 2026 15:57

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f5c4df12fc

ℹ️ 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".

Comment on lines +168 to +170
#[serde(rename = "created-by-me-remote")]
#[ts(rename = "created-by-me-remote")]
CreatedByMeRemote,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Update the Python SDK enum for this new kind

Adding the created-by-me-remote wire value here updates the Rust protocol and TS/schema fixtures, but the Python SDK artifact is still stale: sdk/python/src/openai_codex/generated/v2_all.py's PluginListMarketplaceKind only contains local, vertical, workspace-directory, and shared-with-me. Typed Python clients cannot construct or validate the new marketplaceKinds value even though the app-server README now documents that clients can request it.

Useful? React with 👍 / 👎.


let (global, workspace) = tokio::try_join!(global, workspace)?;
let mut installed_plugins = [global, workspace]
let (global, workspace, user) = tokio::try_join!(global, workspace, user)?;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Don't let USER scope failures suppress existing installed plugins

Because this new USER request is included in the same try_join! as the existing GLOBAL and WORKSPACE requests, any failure or unsupported response for the newly added scope makes fetch_remote_installed_plugins fail as a whole. On a fresh cache, plugin/installed then falls back to local-only results and drops already-working global/workspace remote installed plugins, even when plugin_sharing is off and created-by-me-remote is not visible. Please gate or tolerate the optional USER scope separately from the pre-existing scopes.

Useful? React with 👍 / 👎.

};

let (global, workspace) = tokio::try_join!(global, workspace)?;
let (global, workspace, user) = tokio::try_join!(global, workspace, user)?;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Gate created-by-me bundle sync on plugin_sharing

Adding the USER scope to this sync makes created-by-me installed plugins get downloaded whenever plugins are enabled, even when Feature::PluginSharing is false and the marketplace is intentionally hidden from plugin/list/plugin/installed. Since the remote-installed cache is later converted into effective plugin config without a visible-marketplace filter, users with a USER-installed bundle can have that plugin activated despite the sharing feature being disabled; please skip the USER scope unless the sharing marketplace is enabled.

Useful? React with 👍 / 👎.

) -> Result<&'static str, RemotePluginCatalogError> {
match plugin.scope {
RemotePluginScope::Global => Ok(REMOTE_GLOBAL_MARKETPLACE_NAME),
RemotePluginScope::User => Ok(REMOTE_CREATED_BY_ME_MARKETPLACE_NAME),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Reject direct USER plugin installs when sharing is disabled

When plugin_sharing is disabled, plugin/list/plugin/installed hide created-by-me-remote, but plugin/install only checks Feature::Plugins before fetching details and installing. With this new USER canonical marketplace, a client that already has a USER remotePluginId can still download/install a created-by-me plugin while the sharing marketplace is disabled; please reject USER/created-by-me details unless Feature::PluginSharing is enabled before materializing the bundle.

Useful? React with 👍 / 👎.

@ericning-o ericning-o requested a review from a team as a code owner June 14, 2026 17:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant