1065
return files;
1066
}
1067
>
const enriched = await Promise.all(files.map(async file => {
pluginParsers.ts
1068
>
try {
1069
>
const { name, description } = await parseAgentFile(file.uri, fileService);
1070
>
return {
1071
>
uri: file.uri,
1072
>
name: name || file.name,
1073
>
...(description ? { description } : {}),
1074
>
} satisfies INamedPluginResource;
1075
>
} catch {
1076
return file;
1077
}
1079
>
// De-dupe again in case frontmatter `name` collides; first-seen wins.
1080
>
const seen = new Set<string>();
1081
>
const result: INamedPluginResource[] = [];
1082
>
for (const item of enriched) {
1083
>
if (seen.has(item.name)) {
1084
continue;
1085
}
1087
>
result.push(item);
1088
>
}
1089
>
result.sort((a, b) => a.name.localeCompare(b.name));
1090
>
return result;
1091
>
}
1092
1093
export async function parseAgentFile(uri: URI, fileService: IFileService): Promise<{ name: string; description?: string; userInvocable?: boolean }> {