mirror of
https://github.com/pchuan98/codex.git
synced 2026-07-01 00:31:56 +08:00
[codex] Canonicalize shared workspace plugin IDs (#22564)
## Summary - Canonicalize private and unlisted workspace shared plugin IDs to `workspace-shared-with-me`. - Keep `plugin/list` private/unlisted shared-with-me buckets as UI grouping only. - Update share read/list/checkout and cache cleanup coverage for the canonical namespace. ## Tests - `cargo test -p codex-app-server --test all plugin_list_fetches_shared_with_me_kind` - `cargo test -p codex-app-server --test all plugin_read_returns_share_context_for_shared_remote_plugin` - `cargo test -p codex-app-server --test all suite::v2::plugin_share` - `cargo test -p codex-core-plugins list_remote_plugin_shares_fetches_created_workspace_plugins` - `cargo test -p codex-core-plugins stale_remote_plugin_cleanup_removes_old_shared_with_me_cache_and_keeps_canonical_cache` - `git diff --check`
This commit is contained in:
committed by
GitHub
Unverified
parent
3c3e18c222
commit
e3bf0cfc63
@@ -48,6 +48,7 @@ pub use share::update_remote_plugin_share_targets;
|
||||
|
||||
pub const REMOTE_GLOBAL_MARKETPLACE_NAME: &str = "chatgpt-global";
|
||||
pub const REMOTE_WORKSPACE_MARKETPLACE_NAME: &str = "workspace-directory";
|
||||
pub const REMOTE_WORKSPACE_SHARED_WITH_ME_MARKETPLACE_NAME: &str = "workspace-shared-with-me";
|
||||
pub const REMOTE_WORKSPACE_SHARED_WITH_ME_PRIVATE_MARKETPLACE_NAME: &str =
|
||||
"workspace-shared-with-me-private";
|
||||
pub const REMOTE_WORKSPACE_SHARED_WITH_ME_UNLISTED_MARKETPLACE_NAME: &str =
|
||||
@@ -296,6 +297,7 @@ impl RemotePluginScope {
|
||||
match name {
|
||||
REMOTE_GLOBAL_MARKETPLACE_NAME => Some(Self::Global),
|
||||
REMOTE_WORKSPACE_MARKETPLACE_NAME
|
||||
| REMOTE_WORKSPACE_SHARED_WITH_ME_MARKETPLACE_NAME
|
||||
| REMOTE_WORKSPACE_SHARED_WITH_ME_PRIVATE_MARKETPLACE_NAME
|
||||
| REMOTE_WORKSPACE_SHARED_WITH_ME_UNLISTED_MARKETPLACE_NAME => Some(Self::Workspace),
|
||||
_ => None,
|
||||
@@ -397,11 +399,9 @@ fn remote_plugin_canonical_marketplace_name(
|
||||
RemotePluginScope::Global => Ok(REMOTE_GLOBAL_MARKETPLACE_NAME),
|
||||
RemotePluginScope::Workspace => match workspace_plugin_discoverability(plugin)? {
|
||||
RemotePluginShareDiscoverability::Listed => Ok(REMOTE_WORKSPACE_MARKETPLACE_NAME),
|
||||
RemotePluginShareDiscoverability::Unlisted => {
|
||||
Ok(REMOTE_WORKSPACE_SHARED_WITH_ME_UNLISTED_MARKETPLACE_NAME)
|
||||
}
|
||||
RemotePluginShareDiscoverability::Private => {
|
||||
Ok(REMOTE_WORKSPACE_SHARED_WITH_ME_PRIVATE_MARKETPLACE_NAME)
|
||||
RemotePluginShareDiscoverability::Private
|
||||
| RemotePluginShareDiscoverability::Unlisted => {
|
||||
Ok(REMOTE_WORKSPACE_SHARED_WITH_ME_MARKETPLACE_NAME)
|
||||
}
|
||||
},
|
||||
}
|
||||
@@ -505,20 +505,29 @@ pub async fn fetch_remote_marketplaces(
|
||||
}
|
||||
}
|
||||
RemoteMarketplaceSource::SharedWithMe => {
|
||||
let private_plugins = fetch_shared_workspace_plugins(config, auth)
|
||||
.await?
|
||||
// The shared endpoint is the source of truth for plugins explicitly shared
|
||||
// with the user. Installed unlisted plugins that are not returned there are
|
||||
// link-installed and stay in the separate unlisted bucket.
|
||||
let shared_plugins = fetch_shared_workspace_plugins(config, auth).await?;
|
||||
let shared_plugin_ids = shared_plugins
|
||||
.iter()
|
||||
.map(|plugin| plugin.id.clone())
|
||||
.collect::<BTreeSet<_>>();
|
||||
let directly_shared_plugins = shared_plugins
|
||||
.into_iter()
|
||||
.filter_map(|plugin| match workspace_plugin_discoverability(&plugin) {
|
||||
Ok(RemotePluginShareDiscoverability::Private) => Some(Ok(plugin)),
|
||||
Ok(RemotePluginShareDiscoverability::Listed)
|
||||
| Ok(RemotePluginShareDiscoverability::Unlisted) => None,
|
||||
Ok(
|
||||
RemotePluginShareDiscoverability::Private
|
||||
| RemotePluginShareDiscoverability::Unlisted,
|
||||
) => Some(Ok(plugin)),
|
||||
Ok(RemotePluginShareDiscoverability::Listed) => None,
|
||||
Err(err) => Some(Err(err)),
|
||||
})
|
||||
.collect::<Result<Vec<_>, _>>()?;
|
||||
if let Some(marketplace) = build_remote_marketplace(
|
||||
REMOTE_WORKSPACE_SHARED_WITH_ME_PRIVATE_MARKETPLACE_NAME,
|
||||
REMOTE_WORKSPACE_SHARED_WITH_ME_PRIVATE_MARKETPLACE_DISPLAY_NAME,
|
||||
private_plugins,
|
||||
directly_shared_plugins,
|
||||
workspace_installed_plugins.clone().unwrap_or_default(),
|
||||
/*include_installed_only*/ false,
|
||||
)? {
|
||||
@@ -531,7 +540,12 @@ pub async fn fetch_remote_marketplaces(
|
||||
.into_iter()
|
||||
.filter_map(
|
||||
|plugin| match workspace_plugin_discoverability(&plugin.plugin) {
|
||||
Ok(RemotePluginShareDiscoverability::Unlisted) => Some(Ok(plugin)),
|
||||
Ok(RemotePluginShareDiscoverability::Unlisted)
|
||||
if !shared_plugin_ids.contains(&plugin.plugin.id) =>
|
||||
{
|
||||
Some(Ok(plugin))
|
||||
}
|
||||
Ok(RemotePluginShareDiscoverability::Unlisted) => None,
|
||||
Ok(RemotePluginShareDiscoverability::Listed)
|
||||
| Ok(RemotePluginShareDiscoverability::Private) => None,
|
||||
Err(err) => Some(Err(err)),
|
||||
|
||||
Reference in New Issue
Block a user