diff --git a/CHANGELOG.md b/CHANGELOG.md index 1fa7da1a603..739ea03c741 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,6 @@ Docs: https://docs.openclaw.ai ### Fixes - ## 2026.3.22 ### Breaking @@ -114,6 +113,7 @@ Docs: https://docs.openclaw.ai ### Fixes +- Doctor/WhatsApp: stop auto-enable from appending built-in channel ids like `whatsapp` to `plugins.allow`, so `openclaw doctor --fix` no longer writes schema-invalid plugin allowlist entries when repairing built-in channels. Fixes #52931. Thanks @vincentkoc. - Agents/Anthropic: preserve latest assistant thinking and redacted-thinking block ordering during transcript image sanitization so follow-up turns do not trip Anthropic's unmodified-thinking validation. Thanks @vincentkoc. - Models/OpenAI Codex OAuth and Plugins/MiniMax OAuth: ensure env-configured HTTP/HTTPS proxy dispatchers are initialized before OAuth preflight and token exchange requests so proxy-required environments can complete MiniMax and OpenAI Codex sign-in flows again. (#52228; fixes #51619, #51569) Thanks @openperf. - Plugins/DeepSeek: refactor the bundled DeepSeek provider onto the shared single-provider plugin entry, move its coverage into the extension test lane, and keep bundled auth env-var metadata on the generated manifest path. (#48762) Thanks @07akioni. diff --git a/src/config/plugin-auto-enable.test.ts b/src/config/plugin-auto-enable.test.ts index 0df79dabf3d..088ba2c4ae0 100644 --- a/src/config/plugin-auto-enable.test.ts +++ b/src/config/plugin-auto-enable.test.ts @@ -127,12 +127,12 @@ afterEach(() => { }); describe("applyPluginAutoEnable", () => { - it("auto-enables built-in channels and appends to existing allowlist", () => { + it("auto-enables built-in channels without appending to plugins.allow", () => { const result = applyWithSlackConfig({ plugins: { allow: ["telegram"] } }); expect(result.config.channels?.slack?.enabled).toBe(true); expect(result.config.plugins?.entries?.slack).toBeUndefined(); - expect(result.config.plugins?.allow).toEqual(["telegram", "slack"]); + expect(result.config.plugins?.allow).toEqual(["telegram"]); expect(result.changes.join("\n")).toContain("Slack configured, enabled automatically."); }); @@ -179,6 +179,27 @@ describe("applyPluginAutoEnable", () => { expect(validated.ok).toBe(true); }); + it("does not append built-in WhatsApp to plugins.allow during auto-enable", () => { + const result = applyPluginAutoEnable({ + config: { + channels: { + whatsapp: { + allowFrom: ["+15555550123"], + }, + }, + plugins: { + allow: ["telegram"], + }, + }, + env: {}, + }); + + expect(result.config.channels?.whatsapp?.enabled).toBe(true); + expect(result.config.plugins?.allow).toEqual(["telegram"]); + const validated = validateConfigObject(result.config); + expect(validated.ok).toBe(true); + }); + it("respects explicit disable", () => { const result = applyPluginAutoEnable({ config: { diff --git a/src/config/plugin-auto-enable.ts b/src/config/plugin-auto-enable.ts index 1476e4cf900..ceedd38a12b 100644 --- a/src/config/plugin-auto-enable.ts +++ b/src/config/plugin-auto-enable.ts @@ -478,7 +478,7 @@ export function applyPluginAutoEnable(params: { continue; } next = registerPluginEntry(next, entry.pluginId); - if (allowMissing || !builtInChannelId) { + if (!builtInChannelId) { next = ensurePluginAllowlisted(next, entry.pluginId); } changes.push(formatAutoEnableChange(entry));