From 5eb3ea3028d2be6145cfe3bc3364796c7b46533d Mon Sep 17 00:00:00 2001 From: Tak Hoffman <781889+Takhoffman@users.noreply.github.com> Date: Fri, 27 Mar 2026 20:16:20 -0500 Subject: [PATCH] fix(regression): tolerate legacy skill source metadata --- src/agents/skills.source.test.ts | 24 ++++++++++++++++++++++++ src/agents/skills/source.ts | 9 ++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 src/agents/skills.source.test.ts diff --git a/src/agents/skills.source.test.ts b/src/agents/skills.source.test.ts new file mode 100644 index 00000000000..83ea4ec5eb9 --- /dev/null +++ b/src/agents/skills.source.test.ts @@ -0,0 +1,24 @@ +import { describe, expect, it } from "vitest"; +import { resolveSkillSource } from "./skills/source.js"; + +describe("resolveSkillSource", () => { + it("prefers sourceInfo.source when present", () => { + expect( + resolveSkillSource({ + sourceInfo: { source: "openclaw-bundled" }, + } as never), + ).toBe("openclaw-bundled"); + }); + + it("falls back to legacy top-level source", () => { + expect( + resolveSkillSource({ + source: "openclaw-managed", + } as never), + ).toBe("openclaw-managed"); + }); + + it("returns unknown when neither source shape is present", () => { + expect(resolveSkillSource({} as never)).toBe("unknown"); + }); +}); diff --git a/src/agents/skills/source.ts b/src/agents/skills/source.ts index 8ff52620d10..a44819722e4 100644 --- a/src/agents/skills/source.ts +++ b/src/agents/skills/source.ts @@ -9,5 +9,12 @@ type SkillSourceShapeCompat = Skill & { export function resolveSkillSource(skill: Skill): string { const compatSkill = skill as SkillSourceShapeCompat; - return compatSkill.source ?? compatSkill.sourceInfo?.source ?? "unknown"; + const sourceInfoSource = + typeof compatSkill.sourceInfo?.source === "string" ? compatSkill.sourceInfo.source.trim() : ""; + if (sourceInfoSource) { + return sourceInfoSource; + } + const legacySource = + typeof compatSkill.source === "string" ? compatSkill.source.trim() : ""; + return legacySource || "unknown"; }