chore(deadcode): remove unused plugin contract registry paths

This commit is contained in:
Vincent Koc
2026-06-22 09:21:20 +08:00
parent 45a93b8450
commit 2800ce4e28

View File

@@ -4,37 +4,14 @@ import { normalizeLowercaseStringOrEmpty } from "@openclaw/normalization-core/st
import { loadBundledCapabilityRuntimeRegistry } from "../bundled-capability-runtime.js";
import { discoverOpenClawPlugins } from "../discovery.js";
import { loadPluginManifestRegistry } from "../manifest-registry.js";
import { resolveManifestContractPluginIds } from "../plugin-registry.js";
import { resolveBundledExplicitProviderContractsFromPublicArtifacts } from "../provider-contract-public-artifacts.js";
import type {
ImageGenerationProviderPlugin,
MediaUnderstandingProviderPlugin,
TranscriptSourceProvider,
MusicGenerationProviderPlugin,
ProviderPlugin,
RealtimeTranscriptionProviderPlugin,
RealtimeVoiceProviderPlugin,
SpeechProviderPlugin,
VideoGenerationProviderPlugin,
WebFetchProviderPlugin,
WebSearchProviderPlugin,
} from "../types.js";
import type { ProviderPlugin, WebFetchProviderPlugin, WebSearchProviderPlugin } from "../types.js";
import { resolveBundledExplicitWebSearchProvidersFromPublicArtifacts } from "../web-provider-public-artifacts.explicit.js";
import {
BUNDLED_PLUGIN_CONTRACT_SNAPSHOTS,
type BundledPluginContractSnapshot,
} from "./inventory/bundled-capability-metadata.js";
import { uniqueStrings } from "./shared.js";
import {
loadVitestImageGenerationProviderContractRegistry,
loadVitestMediaUnderstandingProviderContractRegistry,
loadVitestTranscriptsSourceProviderContractRegistry,
loadVitestMusicGenerationProviderContractRegistry,
loadVitestRealtimeTranscriptionProviderContractRegistry,
loadVitestRealtimeVoiceProviderContractRegistry,
loadVitestSpeechProviderContractRegistry,
loadVitestVideoGenerationProviderContractRegistry,
} from "./speech-vitest-registry.js";
type BundledCapabilityRuntimeRegistry = ReturnType<typeof loadBundledCapabilityRuntimeRegistry>;
type CapabilityContractEntry<T> = {
@@ -49,38 +26,9 @@ type WebSearchProviderContractEntry = CapabilityContractEntry<WebSearchProviderP
type WebFetchProviderContractEntry = CapabilityContractEntry<WebFetchProviderPlugin> & {
credentialValue: unknown;
};
type SpeechProviderContractEntry = CapabilityContractEntry<SpeechProviderPlugin>;
type RealtimeTranscriptionProviderContractEntry =
CapabilityContractEntry<RealtimeTranscriptionProviderPlugin>;
type RealtimeVoiceProviderContractEntry = CapabilityContractEntry<RealtimeVoiceProviderPlugin>;
type MediaUnderstandingProviderContractEntry =
CapabilityContractEntry<MediaUnderstandingProviderPlugin>;
type TranscriptsSourceProviderContractEntry = CapabilityContractEntry<TranscriptSourceProvider>;
type ImageGenerationProviderContractEntry = CapabilityContractEntry<ImageGenerationProviderPlugin>;
type VideoGenerationProviderContractEntry = CapabilityContractEntry<VideoGenerationProviderPlugin>;
type MusicGenerationProviderContractEntry = CapabilityContractEntry<MusicGenerationProviderPlugin>;
type PluginRegistrationContractEntry = BundledPluginContractSnapshot;
type ManifestContractKey =
| "embeddingProviders"
| "speechProviders"
| "realtimeTranscriptionProviders"
| "realtimeVoiceProviders"
| "mediaUnderstandingProviders"
| "transcriptSourceProviders"
| "documentExtractors"
| "imageGenerationProviders"
| "videoGenerationProviders"
| "musicGenerationProviders"
| "webContentExtractors"
| "webFetchProviders"
| "webSearchProviders"
| "migrationProviders"
| "tools";
type ManifestRegistryContractKey = "webFetchProviders" | "webSearchProviders";
function normalizeProviderEnvVars(
providerEnvVars: Record<string, string[]> | undefined,
): Record<string, string[]> {
@@ -201,55 +149,6 @@ function resolveBundledProviderContractPluginIds(): string[] {
).toSorted((left, right) => left.localeCompare(right));
}
function resolveBundledManifestContractPluginIds(contract: ManifestRegistryContractKey): string[] {
return resolveManifestContractPluginIds({
contract,
origin: "bundled",
});
}
function resolveBundledManifestPluginIdsForContract(contract: ManifestContractKey): string[] {
return uniqueStrings(
resolveBundledManifestContracts()
.filter((entry) => {
switch (contract) {
case "embeddingProviders":
return entry.embeddingProviderIds.length > 0;
case "speechProviders":
return entry.speechProviderIds.length > 0;
case "realtimeTranscriptionProviders":
return entry.realtimeTranscriptionProviderIds.length > 0;
case "realtimeVoiceProviders":
return entry.realtimeVoiceProviderIds.length > 0;
case "mediaUnderstandingProviders":
return entry.mediaUnderstandingProviderIds.length > 0;
case "transcriptSourceProviders":
return entry.transcriptSourceProviderIds.length > 0;
case "documentExtractors":
return entry.documentExtractorIds.length > 0;
case "imageGenerationProviders":
return entry.imageGenerationProviderIds.length > 0;
case "videoGenerationProviders":
return entry.videoGenerationProviderIds.length > 0;
case "musicGenerationProviders":
return entry.musicGenerationProviderIds.length > 0;
case "webContentExtractors":
return entry.webContentExtractorIds.length > 0;
case "webFetchProviders":
return entry.webFetchProviderIds.length > 0;
case "webSearchProviders":
return entry.webSearchProviderIds.length > 0;
case "migrationProviders":
return entry.migrationProviderIds.length > 0;
case "tools":
return entry.toolNames.length > 0;
}
throw new Error("Unsupported manifest contract key");
})
.map((entry) => entry.pluginId),
).toSorted((left, right) => left.localeCompare(right));
}
export let providerContractLoadError: Error | undefined;
function formatBundledCapabilityPluginLoadError(params: {
@@ -360,45 +259,6 @@ function loadProviderContractEntriesForPluginId(pluginId: string): ProviderContr
}
}
function loadProviderContractRegistry(): ProviderContractEntry[] {
try {
providerContractLoadError = undefined;
const pluginIds = resolveBundledProviderContractPluginIds();
const publicArtifactEntries = pluginIds.flatMap(
(pluginId) =>
resolveBundledExplicitProviderContractsFromPublicArtifacts({
onlyPluginIds: [pluginId],
}) ?? [],
);
const coveredPluginIds = new Set(publicArtifactEntries.map((entry) => entry.pluginId));
const remainingPluginIds = resolveBundledProviderContractPluginIds().filter(
(pluginId) => !coveredPluginIds.has(pluginId),
);
const runtimeEntries =
remainingPluginIds.length > 0
? loadBundledCapabilityRuntimeRegistry({
pluginIds: remainingPluginIds,
pluginSdkResolution: "dist",
}).providers.map((entry) => ({
pluginId: entry.pluginId,
provider: entry.provider,
}))
: [];
return [...publicArtifactEntries, ...runtimeEntries];
} catch (error) {
providerContractLoadError = error instanceof Error ? error : new Error(String(error));
return [];
}
}
function loadUniqueProviderContractProviders(): ProviderPlugin[] {
return [
...new Map(
loadProviderContractRegistry().map((entry) => [entry.provider.id, entry.provider]),
).values(),
];
}
function loadProviderContractPluginIds(): string[] {
return [...resolveBundledProviderContractPluginIds()];
}
@@ -436,18 +296,6 @@ function resolveWebFetchCredentialValue(provider: WebFetchProviderPlugin): unkno
: "sk-test";
}
function loadWebFetchProviderContractRegistry(): WebFetchProviderContractEntry[] {
const registry = loadBundledCapabilityRuntimeRegistry({
pluginIds: resolveBundledManifestContractPluginIds("webFetchProviders"),
pluginSdkResolution: "dist",
});
return registry.webFetchProviders.map((entry) => ({
pluginId: entry.pluginId,
provider: entry.provider,
credentialValue: resolveWebFetchCredentialValue(entry.provider),
}));
}
export function resolveWebFetchProviderContractEntriesForPluginId(
pluginId: string,
): WebFetchProviderContractEntry[] {
@@ -466,37 +314,6 @@ export function resolveWebFetchProviderContractEntriesForPluginId(
});
}
function loadWebSearchProviderContractRegistry(): WebSearchProviderContractEntry[] {
const pluginIds = resolveBundledManifestContractPluginIds("webSearchProviders");
const publicArtifactEntries = pluginIds.flatMap((pluginId) =>
(
resolveBundledExplicitWebSearchProvidersFromPublicArtifacts({
onlyPluginIds: [pluginId],
}) ?? []
).map((provider) => ({
pluginId: provider.pluginId,
provider,
credentialValue: resolveWebSearchCredentialValue(provider),
})),
);
const coveredPluginIds = new Set(publicArtifactEntries.map((entry) => entry.pluginId));
const remainingPluginIds = resolveBundledManifestContractPluginIds("webSearchProviders").filter(
(pluginId) => !coveredPluginIds.has(pluginId),
);
const runtimeEntries =
remainingPluginIds.length > 0
? loadBundledCapabilityRuntimeRegistry({
pluginIds: remainingPluginIds,
pluginSdkResolution: "dist",
}).webSearchProviders.map((entry) => ({
pluginId: entry.pluginId,
provider: entry.provider,
credentialValue: resolveWebSearchCredentialValue(entry.provider),
}))
: [];
return [...publicArtifactEntries, ...runtimeEntries];
}
export function resolveWebSearchProviderContractEntriesForPluginId(
pluginId: string,
): WebSearchProviderContractEntry[] {
@@ -526,102 +343,6 @@ export function resolveWebSearchProviderContractEntriesForPluginId(
});
}
function loadSpeechProviderContractRegistry(): SpeechProviderContractEntry[] {
return process.env.VITEST
? loadVitestSpeechProviderContractRegistry()
: loadBundledCapabilityRuntimeRegistry({
pluginIds: resolveBundledManifestPluginIdsForContract("speechProviders"),
pluginSdkResolution: "dist",
}).speechProviders.map((entry) => ({
pluginId: entry.pluginId,
provider: entry.provider,
}));
}
function loadRealtimeVoiceProviderContractRegistry(): RealtimeVoiceProviderContractEntry[] {
return process.env.VITEST
? loadVitestRealtimeVoiceProviderContractRegistry()
: loadBundledCapabilityRuntimeRegistry({
pluginIds: resolveBundledManifestPluginIdsForContract("realtimeVoiceProviders"),
pluginSdkResolution: "dist",
}).realtimeVoiceProviders.map((entry) => ({
pluginId: entry.pluginId,
provider: entry.provider,
}));
}
function loadRealtimeTranscriptionProviderContractRegistry(): RealtimeTranscriptionProviderContractEntry[] {
return process.env.VITEST
? loadVitestRealtimeTranscriptionProviderContractRegistry()
: loadBundledCapabilityRuntimeRegistry({
pluginIds: resolveBundledManifestPluginIdsForContract("realtimeTranscriptionProviders"),
pluginSdkResolution: "dist",
}).realtimeTranscriptionProviders.map((entry) => ({
pluginId: entry.pluginId,
provider: entry.provider,
}));
}
function loadMediaUnderstandingProviderContractRegistry(): MediaUnderstandingProviderContractEntry[] {
return process.env.VITEST
? loadVitestMediaUnderstandingProviderContractRegistry()
: loadBundledCapabilityRuntimeRegistry({
pluginIds: resolveBundledManifestPluginIdsForContract("mediaUnderstandingProviders"),
pluginSdkResolution: "dist",
}).mediaUnderstandingProviders.map((entry) => ({
pluginId: entry.pluginId,
provider: entry.provider,
}));
}
function loadTranscriptsSourceProviderContractRegistry(): TranscriptsSourceProviderContractEntry[] {
return process.env.VITEST
? loadVitestTranscriptsSourceProviderContractRegistry()
: loadBundledCapabilityRuntimeRegistry({
pluginIds: resolveBundledManifestPluginIdsForContract("transcriptSourceProviders"),
pluginSdkResolution: "dist",
}).transcriptSourceProviders.map((entry) => ({
pluginId: entry.pluginId,
provider: entry.provider,
}));
}
function loadImageGenerationProviderContractRegistry(): ImageGenerationProviderContractEntry[] {
return process.env.VITEST
? loadVitestImageGenerationProviderContractRegistry()
: loadBundledCapabilityRuntimeRegistry({
pluginIds: resolveBundledManifestPluginIdsForContract("imageGenerationProviders"),
pluginSdkResolution: "dist",
}).imageGenerationProviders.map((entry) => ({
pluginId: entry.pluginId,
provider: entry.provider,
}));
}
function loadVideoGenerationProviderContractRegistry(): VideoGenerationProviderContractEntry[] {
return process.env.VITEST
? loadVitestVideoGenerationProviderContractRegistry()
: loadBundledCapabilityRuntimeRegistry({
pluginIds: resolveBundledManifestPluginIdsForContract("videoGenerationProviders"),
pluginSdkResolution: "dist",
}).videoGenerationProviders.map((entry) => ({
pluginId: entry.pluginId,
provider: entry.provider,
}));
}
function loadMusicGenerationProviderContractRegistry(): MusicGenerationProviderContractEntry[] {
return process.env.VITEST
? loadVitestMusicGenerationProviderContractRegistry()
: loadBundledCapabilityRuntimeRegistry({
pluginIds: resolveBundledManifestPluginIdsForContract("musicGenerationProviders"),
pluginSdkResolution: "dist",
}).musicGenerationProviders.map((entry) => ({
pluginId: entry.pluginId,
provider: entry.provider,
}));
}
function createLazyArrayView<T>(load: () => T[]): T[] {
return new Proxy([] as T[], {
get(_target, prop) {
@@ -654,19 +375,6 @@ function createLazyArrayView<T>(load: () => T[]): T[] {
});
}
export const providerContractRegistry: ProviderContractEntry[] = createLazyArrayView(
loadProviderContractRegistry,
);
export const uniqueProviderContractProviders: ProviderPlugin[] = createLazyArrayView(
loadUniqueProviderContractProviders,
);
export const providerContractPluginIds: string[] = createLazyArrayView(
loadProviderContractPluginIds,
);
export const providerContractCompatPluginIds: string[] = createLazyArrayView(
loadProviderContractCompatPluginIds,
);
export function requireProviderContractProvider(providerId: string): ProviderPlugin {
const pluginIds = resolveBundledProviderContractPluginIdsByProviderId().get(providerId) ?? [];
const entries = loadProviderContractEntriesForPluginIds(pluginIds);
@@ -732,27 +440,12 @@ export function resolveProviderContractProvidersForPluginIds(
];
}
export const webSearchProviderContractRegistry: WebSearchProviderContractEntry[] =
createLazyArrayView(loadWebSearchProviderContractRegistry);
export const webFetchProviderContractRegistry: WebFetchProviderContractEntry[] =
createLazyArrayView(loadWebFetchProviderContractRegistry);
export const speechProviderContractRegistry: SpeechProviderContractEntry[] = createLazyArrayView(
loadSpeechProviderContractRegistry,
export const providerContractPluginIds: string[] = createLazyArrayView(
loadProviderContractPluginIds,
);
export const providerContractCompatPluginIds: string[] = createLazyArrayView(
loadProviderContractCompatPluginIds,
);
export const realtimeTranscriptionProviderContractRegistry: RealtimeTranscriptionProviderContractEntry[] =
createLazyArrayView(loadRealtimeTranscriptionProviderContractRegistry);
export const realtimeVoiceProviderContractRegistry: RealtimeVoiceProviderContractEntry[] =
createLazyArrayView(loadRealtimeVoiceProviderContractRegistry);
export const mediaUnderstandingProviderContractRegistry: MediaUnderstandingProviderContractEntry[] =
createLazyArrayView(loadMediaUnderstandingProviderContractRegistry);
export const transcriptsSourceProviderContractRegistry: TranscriptsSourceProviderContractEntry[] =
createLazyArrayView(loadTranscriptsSourceProviderContractRegistry);
export const imageGenerationProviderContractRegistry: ImageGenerationProviderContractEntry[] =
createLazyArrayView(loadImageGenerationProviderContractRegistry);
export const videoGenerationProviderContractRegistry: VideoGenerationProviderContractEntry[] =
createLazyArrayView(loadVideoGenerationProviderContractRegistry);
export const musicGenerationProviderContractRegistry: MusicGenerationProviderContractEntry[] =
createLazyArrayView(loadMusicGenerationProviderContractRegistry);
function loadPluginRegistrationContractRegistry(): PluginRegistrationContractEntry[] {
return resolveBundledManifestContracts();