























@@ -315,7 +315,7 @@ describe("config plugin validation", () => {
315315}
316316});
317317318-it("reports catalog install hints for missing configured official external plugins", () => {
318+it("deduplicates catalog install hints for missing configured official external plugins", () => {
319319const res = validateConfigObjectWithPlugins(
320320{
321321agents: { list: [{ id: "pi" }] },
@@ -339,7 +339,7 @@ describe("config plugin validation", () => {
339339const message =
340340"plugin not installed: brave — install the official external plugin with: openclaw plugins install @openclaw/brave-plugin";
341341expectPathMessage(res.warnings, "plugins.entries.brave", message);
342-expectPathMessage(res.warnings, "plugins.allow", message);
342+expect((res.warnings ?? []).filter((warning) => warning.message === message)).toHaveLength(1);
343343expect(
344344(res.warnings ?? []).some(
345345(warning) =>
@@ -403,14 +403,41 @@ describe("config plugin validation", () => {
403403const message =
404404"plugin not installed: memory-lancedb — install the official external plugin with: openclaw plugins install @openclaw/memory-lancedb";
405405expectPathMessage(res.warnings, "plugins.entries.memory-lancedb", message);
406-expectPathMessage(res.warnings, "plugins.allow", message);
406+expect((res.warnings ?? []).filter((warning) => warning.message === message)).toHaveLength(1);
407407expect(
408408(res.warnings ?? []).some((warning) =>
409409warning.message.includes("gateway will run without persistent memory"),
410410),
411411).toBe(false);
412412});
413413414+it("deduplicates yuanbao missing-plugin warnings across entries and allow", () => {
415+const res = validateConfigObjectWithPlugins(
416+{
417+agents: { list: [{ id: "pi" }] },
418+plugins: {
419+entries: { yuanbao: { enabled: true } },
420+allow: ["yuanbao"],
421+},
422+},
423+{
424+env: suiteEnv(),
425+pluginMetadataSnapshot: {
426+manifestRegistry: {
427+plugins: [],
428+diagnostics: [],
429+},
430+},
431+},
432+);
433+434+expect(res.ok).toBe(true);
435+const message =
436+"plugin not installed: yuanbao — install the official external plugin with: openclaw plugins install openclaw-plugin-yuanbao@2.13.1";
437+expectPathMessage(res.warnings, "plugins.entries.yuanbao", message);
438+expect((res.warnings ?? []).filter((warning) => warning.message === message)).toHaveLength(1);
439+});
440+414441it("keeps official external non-memory plugins fatal in the memory slot", () => {
415442const res = validateConfigObjectWithPlugins(
416443{
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。