
























@@ -20,6 +20,7 @@ import {
2020resolveOfficialExternalPluginInstall,
2121resolveOfficialExternalPluginLabel,
2222} from "../../../plugins/official-external-plugin-catalog.js";
23+import type { PluginMetadataSnapshot } from "../../../plugins/plugin-metadata-snapshot.types.js";
2324import { resolveProviderInstallCatalogEntries } from "../../../plugins/provider-install-catalog.js";
2425import { updateNpmInstalledPlugins } from "../../../plugins/update.js";
2526import { resolveWebSearchInstallCatalogEntry } from "../../../plugins/web-search-install-catalog.js";
@@ -48,6 +49,8 @@ const RUNTIME_PLUGIN_INSTALL_CANDIDATES: readonly DownloadableInstallCandidate[]
4849},
4950];
505152+const MISSING_CHANNEL_CONFIG_DESCRIPTOR_DIAGNOSTIC = "without channelConfigs metadata";
53+5154function shouldFallbackClawHubToNpm(result: { ok: false; code?: string }): boolean {
5255return (
5356result.code === CLAWHUB_INSTALL_ERROR_CODE.PACKAGE_NOT_FOUND ||
@@ -264,6 +267,29 @@ function collectDownloadableInstallCandidates(params: {
264267);
265268}
266269270+function collectConfiguredPluginIdsWithMissingChannelConfigDescriptors(params: {
271+snapshot: PluginMetadataSnapshot;
272+configuredPluginIds: ReadonlySet<string>;
273+configuredChannelIds: ReadonlySet<string>;
274+}): Set<string> {
275+const stalePluginIds = new Set<string>();
276+const pluginsById = new Map(params.snapshot.plugins.map((plugin) => [plugin.id, plugin]));
277+for (const diagnostic of params.snapshot.diagnostics) {
278+const pluginId = diagnostic.pluginId?.trim();
279+if (!pluginId || !diagnostic.message.includes(MISSING_CHANNEL_CONFIG_DESCRIPTOR_DIAGNOSTIC)) {
280+continue;
281+}
282+const plugin = pluginsById.get(pluginId);
283+const ownsConfiguredChannel = plugin?.channels.some((channelId) =>
284+params.configuredChannelIds.has(channelId),
285+);
286+if (params.configuredPluginIds.has(pluginId) || ownsConfiguredChannel) {
287+stalePluginIds.add(pluginId);
288+}
289+}
290+return stalePluginIds;
291+}
292+267293async function installCandidate(params: {
268294candidate: DownloadableInstallCandidate;
269295records: Record<string, PluginInstallRecord>;
@@ -405,15 +431,22 @@ async function repairMissingPluginInstalls(params: {
405431env?: NodeJS.ProcessEnv;
406432}): Promise<{ changes: string[]; warnings: string[] }> {
407433const env = params.env ?? process.env;
408-const knownIds = new Set(
409-loadManifestMetadataSnapshot({
410-config: params.cfg,
411- env,
412-}).plugins.map((plugin) => plugin.id),
413-);
434+const snapshot = loadManifestMetadataSnapshot({
435+config: params.cfg,
436+ env,
437+});
438+const knownIds = new Set(snapshot.plugins.map((plugin) => plugin.id));
439+const configuredPluginIdsWithStaleDescriptors =
440+collectConfiguredPluginIdsWithMissingChannelConfigDescriptors({
441+ snapshot,
442+configuredPluginIds: params.pluginIds,
443+configuredChannelIds: params.channelIds,
444+});
414445const records = await loadInstalledPluginIndexInstallRecords({ env });
415446const missingRecordedPluginIds = Object.keys(records).filter(
416-(pluginId) => params.pluginIds.has(pluginId) && !knownIds.has(pluginId),
447+(pluginId) =>
448+(params.pluginIds.has(pluginId) && !knownIds.has(pluginId)) ||
449+configuredPluginIdsWithStaleDescriptors.has(pluginId),
417450);
418451const changes: string[] = [];
419452const warnings: string[] = [];
@@ -429,6 +462,7 @@ async function repairMissingPluginInstalls(params: {
429462},
430463},
431464pluginIds: missingRecordedPluginIds,
465+updateChannel: params.cfg.update?.channel,
432466logger: {
433467warn: (message) => warnings.push(message),
434468error: (message) => warnings.push(message),
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。