Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
215 changes: 215 additions & 0 deletions artifacts/github/bundles/openai-codex-pr-27071.json

Large diffs are not rendered by default.

87 changes: 87 additions & 0 deletions artifacts/github/bundles/openai-codex-pr-27311.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
{
"analysis_mode": "pr_first",
"commits": [
{
"author": "xl-openai",
"committed_at": "2026-06-10T04:41:58Z",
"message": "Skip local curated discovery for remote plugins",
"sha": "a323ed156e4bf7c1ae57cb0bb2d7f7d0d8a83b75",
"url": "https://github.com/openai/codex/commit/a323ed156e4bf7c1ae57cb0bb2d7f7d0d8a83b75"
}
],
"default_branch": "main",
"docs_refs": [],
"examples_refs": [],
"extracted_flags": [
"CPU",
"--check",
"OPENAI_CURATED_MARKETPLACE_NAME",
"CONFIG_TOML_FILE"
],
"files": [
{
"additions": 1,
"deletions": 1,
"patch_excerpt": "@@ -1147,7 +1147,7 @@ fn configured_marketplace_plugins(\n ) -> io::Result<BTreeMap<String, HashSet<String>>> {\n let plugins_input = config.plugins_config_input();\n let marketplaces = plugins_manager\n- .list_marketplaces_for_config(&plugins_input, &[])\n+ .list_marketplaces_for_config(&plugins_input, &[], /*include_openai_curated*/ true)\n .map_err(|err| {\n invalid_data_error(format!(\"failed to list configured marketplaces: {err}\"))\n })?;",
"path": "codex-rs/app-server/src/config/external_agent_config.rs",
"status": "modified"
},
{
"additions": 6,
"deletions": 2,
"patch_excerpt": "@@ -573,6 +573,7 @@ impl PluginRequestProcessor {\n .list_marketplaces_for_config(\n &config_for_marketplace_listing,\n &roots_for_marketplace_listing,\n+ /*include_openai_curated*/ true,\n )?;\n Ok::<\n (\n@@ -837,8 +838,11 @@ impl PluginRequestProcessor {\n let config_for_marketplace_listing = plugins_input.clone();\n let shared_plugin_ids_by_local_path = load_shared_plugin_ids_by_local_path(config)?;\n match tokio::task::spawn_blocking(move || {\n- let outcome = plugins_manager\n- .list_marketplaces_for_config(&config_for_marketplace_listing, &roots)?;\n+ let outcome = plugins_manager.list_marketplaces_for_config(\n+ &config_for_marketplace_listing,\n+ &roots,\n+ ...",
"path": "codex-rs/app-server/src/request_processors/plugins.rs",
"status": "modified"
},
{
"additions": 2,
"deletions": 2,
"patch_excerpt": "@@ -204,7 +204,7 @@ pub async fn run_plugin_list(\n ..\n } = load_plugin_command_context(overrides).await?;\n let outcome = manager\n- .list_marketplaces_for_config(&plugins_input, &[])\n+ .list_marketplaces_for_config(&plugins_input, &[], /*include_openai_curated*/ true)\n .context(\"failed to list marketplace plugins\")?;\n ensure_configured_marketplace_snapshots_loaded(\n codex_home.as_path(),\n@@ -609,7 +609,7 @@ fn find_marketplace_for_plugin(\n plugin_name: &str,\n ) -> Result<ConfiguredMarketplace> {\n let outcome = manager\n- .list_marketplaces_for_config(plugins_input, &[])\n+ .list_marketplaces_for_config(plugins_input, &[], /*include_openai_curated*/ true)\n .context(\"failed to list marketplace plugins\")?;\n ensure_configured_marketplace_snapshots_loaded(\n codex_home,",
"path": "codex-rs/cli/src/plugin_cmd.rs",
"status": "modified"
},
{
"additions": 5,
"deletions": 6,
"patch_excerpt": "@@ -86,7 +86,11 @@ impl PluginsManager {\n }\n \n let marketplaces = self\n- .list_marketplaces_for_config(&input.plugins, &[])\n+ .list_marketplaces_for_config(\n+ &input.plugins,\n+ &[],\n+ /*include_openai_curated*/ !input.plugins.remote_plugin_enabled,\n+ )\n .context(\"failed to list plugin marketplaces for tool suggestions\")?\n .marketplaces;\n let mut installed_app_connector_ids = self\n@@ -109,11 +113,6 @@ impl PluginsManager {\n let mut discoverable_plugins = Vec::<ToolSuggestDiscoverablePlugin>::new();\n for marketplace in marketplaces {\n let marketplace_name = marketplace.name;\n- if input.plugins.remote_plugin_enabled\n- && marketplace_name == OPENAI_CURATED_MARKETPLACE_NAME\n- {\n- continue;\n...",
"path": "codex-rs/core-plugins/src/discoverable.rs",
"status": "modified"
},
{
"additions": 7,
"deletions": 2,
"patch_excerpt": "@@ -992,14 +992,19 @@ impl PluginsManager {\n &self,\n config: &PluginsConfigInput,\n additional_roots: &[AbsolutePathBuf],\n+ include_openai_curated: bool,\n ) -> Result<ConfiguredMarketplaceListOutcome, MarketplaceError> {\n if !config.plugins_enabled {\n return Ok(ConfiguredMarketplaceListOutcome::default());\n }\n \n let (installed_plugins, enabled_plugins) = self.configured_plugin_states(config);\n- let marketplace_outcome =\n- self.discover_marketplaces_for_config(config, additional_roots)?;\n+ let mut marketplace_roots = self.marketplace_roots(config, additional_roots);\n+ if !include_openai_curated {\n+ let curated_repo_root = curated_plugins_repo_path(self.codex_home.as_path());\n+ marketplace_roots.retain(|root| root.as_path() != curated_repo_root.as_path());\n+ }\n...",
"path": "codex-rs/core-plugins/src/manager.rs",
"status": "modified"
},
{
"additions": 61,
"deletions": 9,
"patch_excerpt": "@@ -1815,7 +1815,11 @@ enabled = false\n \n let config = load_config(tmp.path(), &repo_root).await;\n let marketplaces = PluginsManager::new(tmp.path().to_path_buf())\n- .list_marketplaces_for_config(&config, &[AbsolutePathBuf::try_from(repo_root).unwrap()])\n+ .list_marketplaces_for_config(\n+ &config,\n+ &[AbsolutePathBuf::try_from(repo_root).unwrap()],\n+ /*include_openai_curated*/ true,\n+ )\n .unwrap()\n .marketplaces;\n \n@@ -1917,7 +1921,11 @@ enabled = true\n \n let config = load_config(tmp.path(), &repo_root).await;\n let marketplaces = PluginsManager::new(tmp.path().to_path_buf())\n- .list_marketplaces_for_config(&config, &[AbsolutePathBuf::try_from(repo_root).unwrap()])\n+ .list_marketplaces_for_config(\n+ &config,\n+ &[AbsolutePathBuf::try_from(repo_root).unwrap()],\n+ ...",
"path": "codex-rs/core-plugins/src/manager_tests.rs",
"status": "modified"
},
{
"additions": 1,
"deletions": 1,
"patch_excerpt": "@@ -358,7 +358,7 @@ fn verified_plugin_install_completed(\n ) -> bool {\n let plugins_input = config.plugins_config_input();\n plugins_manager\n- .list_marketplaces_for_config(&plugins_input, &[])\n+ .list_marketplaces_for_config(&plugins_input, &[], /*include_openai_curated*/ true)\n .ok()\n .into_iter()\n .flat_map(|outcome| outcome.marketplaces)",
"path": "codex-rs/core/src/tools/handlers/request_plugin_install.rs",
"status": "modified"
}
],
"linked_issues": [],
"notes": [
"Built from GitHub pull-request, commits, files, and repo endpoints."
],
"primary_pr": {
"body": "## Summary\n\n- skip the local `openai-curated` marketplace before marketplace loading when tool-suggest discovery uses remote plugins\n- preserve existing marketplace listing behavior for all other callers and when remote plugins are disabled\n- add regression coverage proving the curated marketplace is excluded before its malformed manifest can be read\n\n## Why\n\nTool-suggest discovery previously loaded every local `openai-curated` plugin manifest and only discarded that marketplace afterward when remote plugins were enabled. The remote catalog is used in that mode, so the local scan consumed CPU without contributing discoverable plugins.\n\n## Impact\n\nRemote-plugin tool suggestion discovery no longer reads the local curated marketplace and its plugin manifests. `openai-bundled`, configured marketplaces, normal `plugin/list` behavior, and local curated discovery when remote plugins are disabled are unchanged.\n\n## Validation\n\n- `just test -p codex-core-plugins list_marketplaces_can_skip_openai_curated_before_loading`\n- `just test -p codex-core list_tool_suggest_discoverable_plugins_omits_openai_curated_when_remote_enabled`\n- `just fmt`\n- `git diff --check`",
"labels": [],
"merged_at": "2026-06-10T20:11:09Z",
"number": 27311,
"state": "merged",
"title": "[codex] Skip local curated discovery for remote plugins",
"url": "https://github.com/openai/codex/pull/27311"
},
"repo": "openai/codex",
"schema": "github_change_bundle/v1"
}
57 changes: 57 additions & 0 deletions artifacts/github/bundles/openai-codex-pr-27414.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
{
"analysis_mode": "pr_first",
"commits": [
{
"author": "e-provencher",
"committed_at": "2026-06-10T16:23:36Z",
"message": "preserve disabled MCP servers across runtime overlays",
"sha": "679f3b6b5677d685581358f37e7a3a7ddce2466d",
"url": "https://github.com/openai/codex/commit/679f3b6b5677d685581358f37e7a3a7ddce2466d"
},
{
"author": "e-provencher",
"committed_at": "2026-06-10T16:36:55Z",
"message": "Merge branch 'main' into eprovencher/fix-disabled-mcp-initialization",
"sha": "d1db1d33d190781ea06aa44692e9c31c4c45c683",
"url": "https://github.com/openai/codex/commit/d1db1d33d190781ea06aa44692e9c31c4c45c683"
}
],
"default_branch": "main",
"docs_refs": [],
"examples_refs": [],
"extracted_flags": [
"MCP",
"CODEX_APPS_MCP_SERVER_NAME"
],
"files": [
{
"additions": 11,
"deletions": 0,
"patch_excerpt": "@@ -45,6 +45,12 @@ impl McpManager {\n /// runtime-only extension overlays.\n pub async fn runtime_config(&self, config: &Config) -> McpConfig {\n let mut mcp_config = config.to_mcp_config(self.plugins_manager.as_ref()).await;\n+ let disabled_server_names = mcp_config\n+ .configured_mcp_servers\n+ .iter()\n+ .filter(|(_, server)| !server.enabled)\n+ .map(|(name, _)| name.clone())\n+ .collect::<Vec<_>>();\n if mcp_config.apps_enabled {\n mcp_config.configured_mcp_servers.insert(\n CODEX_APPS_MCP_SERVER_NAME.to_string(),\n@@ -60,6 +66,11 @@ impl McpManager {\n }\n let contributions = self.contributions(config).await;\n Self::apply_to_configured_servers(&contributions, &mut mcp_config.configured_mcp_servers);\n+ for name in disabled_server_names {\n+ if l...",
"path": "codex-rs/core/src/mcp.rs",
"status": "modified"
},
{
"additions": 28,
"deletions": 0,
"patch_excerpt": "@@ -42,6 +42,34 @@ async fn contributes_hosted_plugin_runtime_without_an_executor() -> TestResult {\n Ok(())\n }\n \n+#[tokio::test]\n+async fn runtime_overlay_preserves_disabled_server() -> TestResult {\n+ let codex_home = tempfile::tempdir()?;\n+ let config = ConfigBuilder::default()\n+ .codex_home(codex_home.path().to_path_buf())\n+ .fallback_cwd(Some(codex_home.path().to_path_buf()))\n+ .cli_overrides(vec![\n+ (\"features.apps\".to_string(), true.into()),\n+ (\n+ \"mcp_servers.codex_apps.url\".to_string(),\n+ \"https://example.com/mcp\".into(),\n+ ),\n+ (\"mcp_servers.codex_apps.enabled\".to_string(), false.into()),\n+ ])\n+ .build()\n+ .await?;\n+ let auth = CodexAuth::create_dummy_chatgpt_auth_for_testing();\n+ let manager = installed_manager(&config);\n+\n+ let servers = manager...",
"path": "codex-rs/ext/mcp/tests/hosted_apps_mcp.rs",
"status": "modified"
}
],
"linked_issues": [],
"notes": [
"Built from GitHub pull-request, commits, files, and repo endpoints."
],
"primary_pr": {
"body": "## Why\n\nRecent MCP runtime overlay changes replace same-name configured server entries with compatibility or extension-provided configs. Those replacement configs default to enabled, so an MCP server explicitly configured with `enabled = false` could be initialized anyway.\n\nThe connection manager still filters disabled servers correctly, but the configured disabled state was lost before initialization reached that filter.\n\n## What changed\n\n- Remember MCP servers that are disabled in the configured view before applying runtime fallbacks and extension overlays.\n- Restore `enabled = false` for those servers after overlays, while leaving all other overlay fields and `Remove` precedence unchanged.\n- Add focused extension-backed regression coverage for a disabled `codex_apps` server.\n\n## Testing\n\n- `just fmt`\n- `just test -p codex-mcp-extension`\n- `just fix -p codex-core`\n- `just fix -p codex-mcp-extension`\n\nThe full workspace `just test` suite was not run.",
"labels": [],
"merged_at": "2026-06-10T20:11:20Z",
"number": 27414,
"state": "merged",
"title": "[codex] Preserve disabled MCP servers across runtime overlays",
"url": "https://github.com/openai/codex/pull/27414"
},
"repo": "openai/codex",
"schema": "github_change_bundle/v1"
}
Loading