From 6472949f25250a58382c0fbeed436e3fb3875954 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 13 Mar 2026 04:09:57 +0000 Subject: [PATCH] fix(plugins): normalize bundled provider ids --- src/plugins/discovery.test.ts | 23 +++++++++++++++++++++++ src/plugins/discovery.ts | 10 ++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/plugins/discovery.test.ts b/src/plugins/discovery.test.ts index 65873cbc2..400094c1f 100644 --- a/src/plugins/discovery.test.ts +++ b/src/plugins/discovery.test.ts @@ -200,6 +200,29 @@ describe("discoverOpenClawPlugins", () => { expect(ids).toContain("voice-call"); }); + it("normalizes bundled provider package ids to canonical plugin ids", async () => { + const stateDir = makeTempDir(); + const globalExt = path.join(stateDir, "extensions", "ollama-provider-pack"); + mkdirSafe(path.join(globalExt, "src")); + + writePluginPackageManifest({ + packageDir: globalExt, + packageName: "@openclaw/ollama-provider", + extensions: ["./src/index.ts"], + }); + fs.writeFileSync( + path.join(globalExt, "src", "index.ts"), + "export default function () {}", + "utf-8", + ); + + const { candidates } = await discoverWithStateDir(stateDir, {}); + + const ids = candidates.map((c) => c.idHint); + expect(ids).toContain("ollama"); + expect(ids).not.toContain("ollama-provider"); + }); + it("treats configured directory paths as plugin packages", async () => { const stateDir = makeTempDir(); const packDir = path.join(stateDir, "packs", "demo-plugin-dir"); diff --git a/src/plugins/discovery.ts b/src/plugins/discovery.ts index 398a202d1..0ccf10831 100644 --- a/src/plugins/discovery.ts +++ b/src/plugins/discovery.ts @@ -333,11 +333,17 @@ function deriveIdHint(params: { const unscoped = rawPackageName.includes("/") ? (rawPackageName.split("/").pop() ?? rawPackageName) : rawPackageName; + const canonicalPackageId = + { + "ollama-provider": "ollama", + "sglang-provider": "sglang", + "vllm-provider": "vllm", + }[unscoped] ?? unscoped; if (!params.hasMultipleExtensions) { - return unscoped; + return canonicalPackageId; } - return `${unscoped}/${base}`; + return `${canonicalPackageId}/${base}`; } function addCandidate(params: {