From c6a1dcbca7852628b4c2620dac261b521d6e8240 Mon Sep 17 00:00:00 2001 From: brokemac79 Date: Wed, 29 Apr 2026 00:59:47 +0100 Subject: [PATCH] fix(plugins): avoid unscoped media generation fallback loads --- .../capability-provider-runtime.test.ts | 31 +++++++++++++++++++ src/plugins/capability-provider-runtime.ts | 3 ++ 2 files changed, 34 insertions(+) diff --git a/src/plugins/capability-provider-runtime.test.ts b/src/plugins/capability-provider-runtime.test.ts index 1ea7cd5b7b3..7c16cd29299 100644 --- a/src/plugins/capability-provider-runtime.test.ts +++ b/src/plugins/capability-provider-runtime.test.ts @@ -678,6 +678,37 @@ describe("resolvePluginCapabilityProviders", () => { ]); }); + it("does not unscoped-load media generation capabilities without bundled owners", () => { + const cfg = { plugins: { allow: ["openai"] } } as OpenClawConfig; + mocks.loadPluginManifestRegistry.mockReturnValue({ + plugins: [ + { + id: "openai", + origin: "bundled", + contracts: { + imageGenerationProviders: ["openai"], + }, + }, + ] as never, + diagnostics: [], + }); + + expectNoResolvedCapabilityProviders( + resolvePluginCapabilityProviders({ key: "imageGenerationProviders", cfg }), + ); + expectNoResolvedCapabilityProviders( + resolvePluginCapabilityProviders({ key: "musicGenerationProviders", cfg }), + ); + + const snapshotLoadOptions = mocks.resolveRuntimePluginRegistry.mock.calls + .map(([options]) => options) + .filter( + (options): options is { activate: boolean; onlyPluginIds?: string[] } => + Boolean(options && typeof options === "object" && "activate" in options), + ); + expect(snapshotLoadOptions.map((options) => options.onlyPluginIds)).toEqual([["openai"]]); + }); + it("loads only the bundled owner plugin for a targeted provider lookup", () => { const cfg = { plugins: { allow: ["custom-plugin"] } } as OpenClawConfig; const allowlistCompat = { diff --git a/src/plugins/capability-provider-runtime.ts b/src/plugins/capability-provider-runtime.ts index 8d30641b35b..bea4fa6e13f 100644 --- a/src/plugins/capability-provider-runtime.ts +++ b/src/plugins/capability-provider-runtime.ts @@ -262,6 +262,9 @@ export function resolvePluginCapabilityProviders entry.provider) as CapabilityProviderForKey[]; + } const compatConfig = resolveCapabilityProviderConfig({ key: params.key, cfg: params.cfg,