feat(runner): filter marketplace recommendations by explicit usage

This commit is contained in:
RockChinQ
2026-09-12 12:51:16 +08:00
parent fa15f48fd7
commit 1277c6da07
28 changed files with 272 additions and 23 deletions
@@ -52,8 +52,23 @@ export interface PluginV4 {
hot_score?: number;
latest_version: string;
components: Record<string, number>;
runner_usages?: RunnerUsage[];
status: PluginV4Status;
type?: 'plugin' | 'mcp' | 'skill';
created_at: string;
updated_at: string;
}
export type RunnerUsage = 'agent' | 'event';
/** Unknown usage metadata must not become an install recommendation. */
export function supportsRunnerUsage(
plugin: PluginV4,
usage: RunnerUsage,
): boolean {
return Boolean(
plugin.components?.Runner &&
Array.isArray(plugin.runner_usages) &&
plugin.runner_usages.includes(usage),
);
}
+19 -2
View File
@@ -3,7 +3,11 @@ import {
ApiRespMarketplacePluginDetail,
ApiRespMarketplacePlugins,
} from '@/app/infra/entities/api';
import { PluginV4 } from '@/app/infra/entities/plugin';
import {
PluginV4,
RunnerUsage,
supportsRunnerUsage,
} from '@/app/infra/entities/plugin';
import { I18nObject } from '@/app/infra/entities/common';
/**
@@ -39,6 +43,7 @@ export class CloudServiceClient extends BaseHttpClient {
component_filter?: string,
tags_filter?: string[],
type_filter?: string,
runner_usage?: RunnerUsage,
): Promise<ApiRespMarketplacePlugins> {
// Use different endpoints based on type_filter
if (type_filter === 'mcp') {
@@ -90,6 +95,7 @@ export class CloudServiceClient extends BaseHttpClient {
sort_by,
sort_order,
component_filter,
runner_usage,
tags_filter,
type_filter,
},
@@ -104,6 +110,7 @@ export class CloudServiceClient extends BaseHttpClient {
sort_order?: string;
type_filter?: string;
component_filter?: string;
runner_usage?: RunnerUsage;
tags_filter?: string[];
}): Promise<ApiRespMarketplacePlugins> {
return this.post<{ extensions: PluginV4[]; total: number }>(
@@ -125,7 +132,15 @@ export class CloudServiceClient extends BaseHttpClient {
total: resp?.total || 0,
};
})
.catch(() => this.searchMarketplaceExtensionsLegacy(data));
.catch(() => this.searchMarketplaceExtensionsLegacy(data))
.then((result) => ({
...result,
plugins: data.runner_usage
? result.plugins.filter((plugin) =>
supportsRunnerUsage(plugin, data.runner_usage!),
)
: result.plugins,
}));
}
public getMarketplaceLikedExtensions(
@@ -162,6 +177,7 @@ export class CloudServiceClient extends BaseHttpClient {
sort_order?: string;
type_filter?: string;
component_filter?: string;
runner_usage?: RunnerUsage;
tags_filter?: string[];
}): Promise<ApiRespMarketplacePlugins> {
const query = data.query || '';
@@ -183,6 +199,7 @@ export class CloudServiceClient extends BaseHttpClient {
data.component_filter,
data.tags_filter,
data.component_filter ? 'plugin' : data.type_filter,
data.runner_usage,
).catch((error) => {
if (data.type_filter === 'mcp' || data.type_filter === 'skill') {
return { plugins: [], total: 0 };