[codex] expose remote plugin share URL (#27890)

## Summary

- expose the remote plugin detail endpoint's `share_url` as nullable
`PluginDetail.shareUrl`
- preserve existing `PluginSummary.shareContext` behavior for local and
workspace sharing flows
- regenerate the app-server TypeScript and JSON schema fixtures

## Why

The remote plugin detail response already includes a canonical
`share_url`, but that value was not surfaced by `plugin/read` for global
plugins. Global plugins intentionally have no `shareContext`, so using
that model for the URL would change the semantics consumed by the
existing share modal.

## User impact

Codex clients can use `PluginDetail.shareUrl` for a remote plugin's
copy-link action, including when the plugin is disabled by an
administrator, without changing existing share-modal or ownership
behavior.

## Validation

- `cargo test -p codex-app-server
plugin_read_includes_share_url_for_admin_disabled_remote_plugin`
- `cargo test -p codex-app-server-protocol
typescript_schema_fixtures_match_generated`
- `cargo test -p codex-app-server-protocol
json_schema_fixtures_match_generated`
- `cargo fmt --all`
This commit is contained in:
Eric Ning authored and GitHub committed 2026-06-12 11:53:55 -07:00
1 parent 52a50aec70
commit 9600afb1a1
11 files changed
+86 -47

No files matched your search

@@ -1421,6 +1421,7 @@ pub(super) fn plugins_test_detail(
marketplace_name: "ChatGPT Marketplace".to_string(),
marketplace_path: Some(plugins_test_absolute_path("marketplaces/chatgpt")),
summary,
share_url: None,
description: description.map(str::to_string),
skills: skills
.iter()
@@ -803,6 +803,7 @@ async fn plugin_detail_remote_install_uses_remote_location() {
marketplace_name: "workspace-shared-with-me-private".to_string(),
marketplace_path: None,
summary,
share_url: None,
description: Some("Install shared Linear plugin.".to_string()),
skills: Vec::new(),
hooks: Vec::new(),
@@ -877,6 +878,7 @@ async fn plugin_detail_remote_uninstall_uses_remote_plugin_id() {
marketplace_name: "workspace-shared-with-me-private".to_string(),
marketplace_path: None,
summary,
share_url: None,
description: Some("Installed shared Linear plugin.".to_string()),
skills: Vec::new(),
hooks: Vec::new(),
@@ -949,6 +951,7 @@ async fn plugin_detail_remote_without_remote_id_disables_uninstall_action() {
marketplace_name: "workspace-shared-with-me-private".to_string(),
marketplace_path: None,
summary,
share_url: None,
description: Some("Installed shared Linear plugin.".to_string()),
skills: Vec::new(),
hooks: Vec::new(),