



























@@ -474,6 +474,40 @@ function pushProviderAuthEnvVarsCompatDiagnostic(params: {
474474});
475475}
476476477+function pushNonBundledChannelConfigDescriptorDiagnostic(params: {
478+record: PluginManifestRecord;
479+diagnostics: PluginDiagnostic[];
480+}): void {
481+if (params.record.origin === "bundled" || params.record.format === "bundle") {
482+return;
483+}
484+const declaredChannels = params.record.channels
485+.map((channelId) => channelId.trim())
486+.filter((channelId) => channelId.length > 0);
487+if (declaredChannels.length === 0) {
488+return;
489+}
490+const channelConfigs = params.record.channelConfigs ?? {};
491+const missingChannels = declaredChannels.filter((channelId) => !channelConfigs[channelId]);
492+if (missingChannels.length === 0) {
493+return;
494+}
495+params.diagnostics.push({
496+level: "warn",
497+pluginId: params.record.id,
498+source: params.record.manifestPath,
499+message: `channel plugin manifest declares ${missingChannels.join(", ")} without channelConfigs metadata; add openclaw.plugin.json#channelConfigs so config schema and setup surfaces work before runtime loads`,
500+});
501+}
502+503+function pushManifestCompatibilityDiagnostics(params: {
504+record: PluginManifestRecord;
505+diagnostics: PluginDiagnostic[];
506+}): void {
507+pushProviderAuthEnvVarsCompatDiagnostic(params);
508+pushNonBundledChannelConfigDescriptorDiagnostic(params);
509+}
510+477511function matchesInstalledPluginRecord(params: {
478512pluginId: string;
479513candidate: PluginCandidate;
@@ -666,7 +700,7 @@ export function loadPluginManifestRegistry(
666700if (PLUGIN_ORIGIN_RANK[candidate.origin] < PLUGIN_ORIGIN_RANK[existing.candidate.origin]) {
667701records[existing.recordIndex] = record;
668702seenIds.set(manifest.id, { candidate, recordIndex: existing.recordIndex });
669-pushProviderAuthEnvVarsCompatDiagnostic({ record, diagnostics });
703+pushManifestCompatibilityDiagnostics({ record, diagnostics });
670704}
671705continue;
672706}
@@ -689,7 +723,7 @@ export function loadPluginManifestRegistry(
689723if (candidateWins) {
690724records[existing.recordIndex] = record;
691725seenIds.set(manifest.id, { candidate, recordIndex: existing.recordIndex });
692-pushProviderAuthEnvVarsCompatDiagnostic({ record, diagnostics });
726+pushManifestCompatibilityDiagnostics({ record, diagnostics });
693727}
694728diagnostics.push({
695729level: "warn",
@@ -702,7 +736,7 @@ export function loadPluginManifestRegistry(
702736703737seenIds.set(manifest.id, { candidate, recordIndex: records.length });
704738records.push(record);
705-pushProviderAuthEnvVarsCompatDiagnostic({ record, diagnostics });
739+pushManifestCompatibilityDiagnostics({ record, diagnostics });
706740}
707741708742const registry = { plugins: records, diagnostics };
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。