diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c80dcb8145..19c1a8d3fed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ Docs: https://docs.openclaw.ai - Gateway/supervision: stop lock conflicts from crash-looping under launchd and systemd by keeping the duplicate process in a retry wait instead of exiting as a failure while another healthy gateway still owns the lock. Fixes #52922. Thanks @vincentkoc. - Browser/Chrome MCP: wait for existing-session browser tabs to become usable after attach instead of treating the initial Chrome MCP handshake as ready, which reduces user-profile timeouts and repeated consent churn on macOS Chrome attach flows. Fixes #52930. Thanks @vincentkoc. - Gateway/probe: stop successful gateway handshakes from timing out as unreachable while post-connect detail RPCs are still loading, so slow devices report a reachable RPC failure instead of a false negative dead gateway. Fixes #52927. Thanks @vincentkoc. +- Config/plugins: treat stale unknown `plugins.allow` ids as warnings instead of fatal config errors, so recovery commands like `plugins install`, `doctor --fix`, and `status` still run when a plugin is missing locally. Fixes #52992. Thanks @vincentkoc. - Plugins/message tool: make Discord `components` and Slack `blocks` optional again so pin/unpin/react flows stop failing schema validation and Slack media sends are no longer forced into an invalid blocks-plus-media payload. Fixes #52970 and #52962. Thanks @vincentkoc. - Plugins/Feishu: route `message(..., media=...)` sends through the Feishu outbound media path so file and image attachments actually send instead of being silently dropped. Fixes #52962. Thanks @vincentkoc. - ClawHub/skills: resolve the local ClawHub auth token for gateway skill browsing and switch browse-all requests to search so ClawControl stops falling into unauthenticated 429s and empty authenticated skill lists. Fixes #52949. Thanks @vincentkoc. diff --git a/src/config/config.plugin-validation.test.ts b/src/config/config.plugin-validation.test.ts index 7938e733d58..b1fc874ef8f 100644 --- a/src/config/config.plugin-validation.test.ts +++ b/src/config/config.plugin-validation.test.ts @@ -220,11 +220,15 @@ describe("config plugin validation", () => { ).toBe(true); expect(res.issues).toEqual( expect.arrayContaining([ - { path: "plugins.allow", message: "plugin not found: missing-allow" }, { path: "plugins.deny", message: "plugin not found: missing-deny" }, { path: "plugins.slots.memory", message: "plugin not found: missing-slot" }, ]), ); + expect(res.warnings).toContainEqual({ + path: "plugins.allow", + message: + "plugin not found: missing-allow (stale config entry ignored; remove it from plugins config)", + }); expect(res.warnings).toContainEqual({ path: "plugins.entries.missing-plugin", message: diff --git a/src/config/validation.ts b/src/config/validation.ts index bdfd327b1e4..47ffc4b42f4 100644 --- a/src/config/validation.ts +++ b/src/config/validation.ts @@ -567,7 +567,7 @@ function validateConfigObjectWithPluginsBase( continue; } if (!knownIds.has(pluginId)) { - pushMissingPluginIssue("plugins.allow", pluginId); + pushMissingPluginIssue("plugins.allow", pluginId, { warnOnly: true }); } }