fix(marketplace): use external icon URL when icon field is absolute

Many MCP / skill records store their icon as an absolute external URL
(simpleicons.org / iconify.design) rather than an uploaded file, so the
/resources/icon endpoint 404s and the card icon breaks. Add
resolveMarketplaceIconURL() which prefers an absolute http(s) icon field
and otherwise falls back to the resources endpoint.
This commit is contained in:
RockChinQ
2026-06-06 03:52:09 -04:00
parent f54ae4b91c
commit dff80a0c0a
4 changed files with 44 additions and 18 deletions
@@ -216,12 +216,12 @@ function MarketPageContent({
const transformToVO = useCallback(
(plugin: PluginV4): PluginMarketCardVO => {
const cloudClient = getCloudServiceClientSync();
const iconURL =
plugin.type === 'mcp'
? cloudClient.getMCPMarketplaceIconURL(plugin.author, plugin.name)
: plugin.type === 'skill'
? cloudClient.getSkillMarketplaceIconURL(plugin.author, plugin.name)
: cloudClient.getPluginIconURL(plugin.author, plugin.name);
const iconURL = cloudClient.resolveMarketplaceIconURL(
plugin.type,
plugin.author,
plugin.name,
plugin.icon,
);
return new PluginMarketCardVO({
pluginId: plugin.author + ' / ' + plugin.name,
@@ -23,13 +23,14 @@ function pluginToVO(
t: (key: string) => string,
): PluginMarketCardVO {
const cloudClient = getCloudServiceClientSync();
// Recommendation lists are mixed-type; resolve the icon per extension type.
const iconURL =
plugin.type === 'mcp'
? cloudClient.getMCPMarketplaceIconURL(plugin.author, plugin.name)
: plugin.type === 'skill'
? cloudClient.getSkillMarketplaceIconURL(plugin.author, plugin.name)
: cloudClient.getPluginIconURL(plugin.author, plugin.name);
// Recommendation lists are mixed-type; resolve the icon per extension type,
// preferring an absolute external icon URL when the record carries one.
const iconURL = cloudClient.resolveMarketplaceIconURL(
plugin.type,
plugin.author,
plugin.name,
plugin.icon,
);
return new PluginMarketCardVO({
pluginId: plugin.author + ' / ' + plugin.name,