From c06dcf6b8b4bc57addaa9a83d29b1908befedf0b Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Sat, 28 Mar 2026 15:46:24 +0530 Subject: [PATCH] fix(plugins): preserve active capability providers --- .../capability-provider-runtime.test.ts | 37 ++++++++++++++++++- src/plugins/capability-provider-runtime.ts | 5 +++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/plugins/capability-provider-runtime.test.ts b/src/plugins/capability-provider-runtime.test.ts index 5ecd3afef8a..b3116f122bc 100644 --- a/src/plugins/capability-provider-runtime.test.ts +++ b/src/plugins/capability-provider-runtime.test.ts @@ -171,7 +171,42 @@ describe("resolvePluginCapabilityProviders", () => { expectResolvedCapabilityProviderIds(providers, ["openai"]); expect(mocks.loadPluginManifestRegistry).not.toHaveBeenCalled(); - expect(mocks.resolveRuntimePluginRegistry).toHaveBeenCalledWith(undefined); + expect(mocks.resolveRuntimePluginRegistry).toHaveBeenCalledWith(); + }); + + it("keeps active capability providers even when cfg is passed", () => { + const active = createEmptyPluginRegistry(); + active.speechProviders.push({ + pluginId: "microsoft", + pluginName: "microsoft", + source: "test", + provider: { + id: "microsoft", + label: "microsoft", + aliases: ["edge"], + isConfigured: () => true, + synthesize: async () => ({ + audioBuffer: Buffer.from("x"), + outputFormat: "mp3", + voiceCompatible: false, + fileExtension: ".mp3", + }), + }, + } as never); + mocks.resolveRuntimePluginRegistry.mockImplementation((params?: unknown) => + params === undefined ? active : createEmptyPluginRegistry(), + ); + + const providers = resolvePluginCapabilityProviders({ + key: "speechProviders", + cfg: { messages: { tts: { provider: "edge" } } } as OpenClawConfig, + }); + + expectResolvedCapabilityProviderIds(providers, ["microsoft"]); + expect(mocks.resolveRuntimePluginRegistry).toHaveBeenCalledWith(); + expect(mocks.resolveRuntimePluginRegistry).not.toHaveBeenCalledWith({ + config: expect.anything(), + }); }); it.each([ diff --git a/src/plugins/capability-provider-runtime.ts b/src/plugins/capability-provider-runtime.ts index 628768d5431..36e581e7a78 100644 --- a/src/plugins/capability-provider-runtime.ts +++ b/src/plugins/capability-provider-runtime.ts @@ -67,6 +67,11 @@ export function resolvePluginCapabilityProviders[] { + const activeRegistry = resolveRuntimePluginRegistry(); + const activeProviders = activeRegistry?.[params.key] ?? []; + if (activeProviders.length > 0) { + return activeProviders.map((entry) => entry.provider) as CapabilityProviderForKey[]; + } const loadOptions = params.cfg === undefined ? undefined