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
101 changes: 101 additions & 0 deletions artifacts/github/bundles/openai-codex-pr-26409.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
{
"analysis_mode": "pr_first",
"commits": [
{
"author": "adaley-openai",
"committed_at": "2026-06-04T15:46:54Z",
"message": "Inject remote plugin identity into install elicitations",
"sha": "158fd3ea6eda3a6ee1ba95ad0de76f5cee4f0540",
"url": "https://github.com/openai/codex/commit/158fd3ea6eda3a6ee1ba95ad0de76f5cee4f0540"
}
],
"default_branch": "main",
"docs_refs": [],
"examples_refs": [],
"extracted_flags": [
"--check",
"MCP",
"REQUEST_PLUGIN_INSTALL_APPROVAL_KIND_VALUE",
"REQUEST_PLUGIN_INSTALL_PERSIST_ALWAYS_VALUE"
],
"files": [
{
"additions": 3,
"deletions": 0,
"patch_excerpt": "@@ -64,6 +64,7 @@ pub struct ToolSuggestPluginDiscoveryInput {\n #[derive(Clone, Debug, PartialEq, Eq)]\n pub struct ToolSuggestDiscoverablePlugin {\n pub id: String,\n+ pub remote_plugin_id: Option<String>,\n pub name: String,\n pub description: Option<String>,\n pub has_skills: bool,\n@@ -145,6 +146,7 @@ impl PluginsManager {\n \n discoverable_plugins.push(ToolSuggestDiscoverablePlugin {\n id: plugin.config_name,\n+ remote_plugin_id: None,\n name: plugin.display_name,\n description: plugin.description,\n has_skills: plugin.has_skills,\n@@ -200,6 +202,7 @@ impl PluginsManager {\n \n discoverable_plugins.push(ToolSuggestDiscoverablePlugin {\n id: plugin.config_id,\n+ remote_...",
"path": "codex-rs/core-plugins/src/discoverable.rs",
"status": "modified"
},
{
"additions": 1,
"deletions": 0,
"patch_excerpt": "@@ -41,6 +41,7 @@ pub(crate) async fn list_tool_suggest_discoverable_plugins(\n .into_iter()\n .map(|plugin| DiscoverablePluginInfo {\n id: plugin.id,\n+ remote_plugin_id: plugin.remote_plugin_id,\n name: plugin.name,\n description: plugin.description,\n has_skills: plugin.has_skills,",
"path": "codex-rs/core/src/plugins/discoverable.rs",
"status": "modified"
},
{
"additions": 3,
"deletions": 0,
"patch_excerpt": "@@ -393,6 +393,7 @@ remote_plugin = true\n remote_plugins,\n vec![DiscoverablePluginInfo {\n id: \"github@openai-curated-remote\".to_string(),\n+ remote_plugin_id: Some(\"plugins~Plugin_remote_github\".to_string()),\n name: \"Remote GitHub\".to_string(),\n description: Some(\"Remote GitHub short\".to_string()),\n has_skills: true,\n@@ -680,6 +681,7 @@ async fn list_tool_suggest_discoverable_plugins_normalizes_description() {\n discoverable_plugins,\n vec![DiscoverablePluginInfo {\n id: \"slack@openai-curated\".to_string(),\n+ remote_plugin_id: None,\n name: \"slack\".to_string(),\n description: Some(\"Plugin with extra spacing\".to_string()),\n has_skills: true,\n@@ -816,6 +818,7 @@ discoverables = [{ type = \"plugin\", id = \"sample@openai-curated\" }]\n discoverabl...",
"path": "codex-rs/core/src/plugins/discoverable_tests.rs",
"status": "modified"
},
{
"additions": 1,
"deletions": 0,
"patch_excerpt": "@@ -130,6 +130,7 @@ async fn persist_disabled_install_request_writes_plugin_config() {\n let codex_home = tempdir().expect(\"tempdir should succeed\");\n let tool = DiscoverableTool::Plugin(Box::new(DiscoverablePluginInfo {\n id: \"slack@openai-curated\".to_string(),\n+ remote_plugin_id: None,\n name: \"Slack\".to_string(),\n description: None,\n has_skills: true,",
"path": "codex-rs/core/src/tools/handlers/request_plugin_install_tests.rs",
"status": "modified"
},
{
"additions": 1,
"deletions": 0,
"patch_excerpt": "@@ -406,6 +406,7 @@ fn dynamic_tool(namespace: Option<&str>, name: &str, defer_loading: bool) -> Dyn\n fn discoverable_plugin(id: &str, name: &str) -> DiscoverableTool {\n DiscoverablePluginInfo {\n id: id.to_string(),\n+ remote_plugin_id: None,\n name: name.to_string(),\n description: Some(format!(\"{name} plugin\")),\n has_skills: false,",
"path": "codex-rs/core/src/tools/spec_plan_tests.rs",
"status": "modified"
},
{
"additions": 18,
"deletions": 11,
"patch_excerpt": "@@ -47,6 +47,10 @@ pub struct RequestPluginInstallMeta<'a> {\n pub tool_name: &'a str,\n #[serde(skip_serializing_if = \"Option::is_none\")]\n pub install_url: Option<&'a str>,\n+ #[serde(skip_serializing_if = \"Option::is_none\")]\n+ pub remote_plugin_id: Option<&'a str>,\n+ #[serde(skip_serializing_if = \"Option::is_none\")]\n+ pub app_connector_ids: Option<&'a [String]>,\n }\n \n pub fn build_request_plugin_install_elicitation_request(\n@@ -57,8 +61,6 @@ pub fn build_request_plugin_install_elicitation_request(\n suggest_reason: &str,\n tool: &DiscoverableTool,\n ) -> McpServerElicitationRequestParams {\n- let tool_name = tool.name().to_string();\n- let install_url = tool.install_url().map(ToString::to_string);\n let message = suggest_reason.to_string();\n \n McpServerElicitationRequestParams {\n@@ -70,9 +72,7 @@ pub fn build_request_plugin_install_elicitation_reque...",
"path": "codex-rs/tools/src/request_plugin_install.rs",
"status": "modified"
},
{
"additions": 29,
"deletions": 7,
"patch_excerpt": "@@ -57,6 +57,8 @@ fn build_request_plugin_install_elicitation_request_uses_expected_shape() {\n install_url: Some(\n \"https://chatgpt.com/apps/google-calendar/connector_2128aebfecb84f64a069897515042a44\"\n ),\n+ remote_plugin_id: None,\n+ app_connector_ids: None,\n })),\n message: \"Plan and reference events from your calendar\".to_string(),\n requested_schema: McpElicitationSchema {\n@@ -71,15 +73,16 @@ fn build_request_plugin_install_elicitation_request_uses_expected_shape() {\n }\n \n #[test]\n-fn build_request_plugin_install_elicitation_request_for_plugin_omits_install_url() {\n+fn build_request_plugin_install_elicitation_request_injects_plugin_metadata() {\n let args = RequestPluginInstallArgs {\n tool_type: DiscoverableToolType::Plugin,\n ...",
"path": "codex-rs/tools/src/request_plugin_install_tests.rs",
"status": "modified"
},
{
"additions": 1,
"deletions": 0,
"patch_excerpt": "@@ -93,6 +93,7 @@ pub fn filter_request_plugin_install_discoverable_tools_for_client(\n #[derive(Clone, Debug, PartialEq, Eq)]\n pub struct DiscoverablePluginInfo {\n pub id: String,\n+ pub remote_plugin_id: Option<String>,\n pub name: String,\n pub description: Option<String>,\n pub has_skills: bool,",
"path": "codex-rs/tools/src/tool_discovery.rs",
"status": "modified"
},
{
"additions": 1,
"deletions": 0,
"patch_excerpt": "@@ -37,6 +37,7 @@ fn filter_request_plugin_install_discoverable_tools_for_codex_tui_omits_plugins(\n })),\n DiscoverableTool::Plugin(Box::new(DiscoverablePluginInfo {\n id: \"slack@openai-curated\".to_string(),\n+ remote_plugin_id: None,\n name: \"Slack\".to_string(),\n description: Some(\"Search Slack messages\".to_string()),\n has_skills: true,",
"path": "codex-rs/tools/src/tool_discovery_tests.rs",
"status": "modified"
}
],
"linked_issues": [],
"notes": [
"Built from GitHub pull-request, commits, files, and repo endpoints."
],
"primary_pr": {
"body": "Summary\n- Propagate cached remote plugin IDs through Codex plugin discovery.\n- Inject `remote_plugin_id` and connector IDs into `request_plugin_install` elicitation `_meta` from the resolved plugin.\n- Keep the remote plugin ID out of the model-facing tool schema, arguments, and result.\n\nValidation\n- `just test -p codex-tools`\n- `just test -p codex-core-plugins`\n- `just test -p codex-core list_tool_suggest_discoverable_plugins_includes_cached_remote_global_plugins`\n- `just fix -p codex-tools`\n- `just fix -p codex-core-plugins`\n- `just fix -p codex-core`\n- `git diff --check`\n- `just test -p codex-core` was also attempted: 2,581 passed, 55 failed, and 1 timed out across unrelated sandbox/environment-sensitive integration tests.",
"labels": [],
"merged_at": "2026-06-10T19:01:04Z",
"number": 26409,
"state": "merged",
"title": "[plugins] Inject remote_plugin_id into install elicitations",
"url": "https://github.com/openai/codex/pull/26409"
},
"repo": "openai/codex",
"schema": "github_change_bundle/v1"
}
Loading