From 75dd28e0838aac275ca0e1ad0230ed947c041e5c Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 2 May 2026 15:26:52 +0100 Subject: [PATCH] fix(doctor): preserve built-in channel plugin allow entries --- .../doctor/shared/stale-plugin-config.test.ts | 33 +++++++++++++++++++ .../doctor/shared/stale-plugin-config.ts | 4 +-- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/commands/doctor/shared/stale-plugin-config.test.ts b/src/commands/doctor/shared/stale-plugin-config.test.ts index e1e3ca319a3..200070e6046 100644 --- a/src/commands/doctor/shared/stale-plugin-config.test.ts +++ b/src/commands/doctor/shared/stale-plugin-config.test.ts @@ -114,6 +114,39 @@ describe("doctor stale plugin config helpers", () => { ]); }); + it("keeps built-in channel ids in restrictive plugin config", () => { + const result = maybeRepairStalePluginConfig({ + plugins: { + allow: ["telegram", "whatsapp", "acpx"], + entries: { + telegram: { enabled: true }, + whatsapp: { enabled: true }, + acpx: { enabled: true }, + }, + }, + channels: { + whatsapp: { + enabled: true, + allowFrom: ["+15555550123"], + }, + }, + } as OpenClawConfig); + + expect(result.changes).toEqual([ + "- plugins.allow: removed 1 stale plugin id (acpx)", + "- plugins.entries: removed 1 stale plugin entry (acpx)", + ]); + expect(result.config.plugins?.allow).toEqual(["telegram", "whatsapp"]); + expect(result.config.plugins?.entries).toEqual({ + telegram: { enabled: true }, + whatsapp: { enabled: true }, + }); + expect(result.config.channels?.whatsapp).toEqual({ + enabled: true, + allowFrom: ["+15555550123"], + }); + }); + it("removes stale third-party channel config and dependent channel refs", () => { const result = maybeRepairStalePluginConfig({ plugins: { diff --git a/src/commands/doctor/shared/stale-plugin-config.ts b/src/commands/doctor/shared/stale-plugin-config.ts index 775f84bf327..cc9d30acc00 100644 --- a/src/commands/doctor/shared/stale-plugin-config.ts +++ b/src/commands/doctor/shared/stale-plugin-config.ts @@ -104,7 +104,7 @@ function scanStalePluginConfigWithState( continue; } const pluginId = normalizePluginId(rawPluginId); - if (!pluginId || knownIds.has(pluginId)) { + if (!pluginId || knownIds.has(pluginId) || registryState.knownChannelIds.has(pluginId)) { continue; } hits.push({ @@ -119,7 +119,7 @@ function scanStalePluginConfigWithState( if (entries) { for (const rawPluginId of Object.keys(entries)) { const pluginId = normalizePluginId(rawPluginId); - if (!pluginId || knownIds.has(pluginId)) { + if (!pluginId || knownIds.has(pluginId) || registryState.knownChannelIds.has(pluginId)) { continue; } hits.push({