From e20823c7411bf2bab7ebe8439bd7dd35510f62fc Mon Sep 17 00:00:00 2001 From: Tak Hoffman <781889+Takhoffman@users.noreply.github.com> Date: Fri, 27 Mar 2026 22:38:34 -0500 Subject: [PATCH] fix(regression): auto-enable plugin status loads --- src/plugins/status.test.ts | 36 ++++++++++++++++++++++++++++++++++++ src/plugins/status.ts | 7 ++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/plugins/status.test.ts b/src/plugins/status.test.ts index def7d07e3a0..53f12cd81fe 100644 --- a/src/plugins/status.test.ts +++ b/src/plugins/status.test.ts @@ -11,6 +11,7 @@ import { const loadConfigMock = vi.fn(); const loadOpenClawPluginsMock = vi.fn(); +const applyPluginAutoEnableMock = vi.fn(); const resolveBundledProviderCompatPluginIdsMock = vi.fn(); const withBundledPluginAllowlistCompatMock = vi.fn(); const withBundledPluginEnablementCompatMock = vi.fn(); @@ -26,6 +27,10 @@ vi.mock("../config/config.js", () => ({ loadConfig: () => loadConfigMock(), })); +vi.mock("../config/plugin-auto-enable.js", () => ({ + applyPluginAutoEnable: (...args: unknown[]) => applyPluginAutoEnableMock(...args), +})); + vi.mock("./loader.js", () => ({ loadOpenClawPlugins: (...args: unknown[]) => loadOpenClawPluginsMock(...args), })); @@ -107,10 +112,15 @@ describe("buildPluginStatusReport", () => { vi.resetModules(); loadConfigMock.mockReset(); loadOpenClawPluginsMock.mockReset(); + applyPluginAutoEnableMock.mockReset(); resolveBundledProviderCompatPluginIdsMock.mockReset(); withBundledPluginAllowlistCompatMock.mockReset(); withBundledPluginEnablementCompatMock.mockReset(); loadConfigMock.mockReturnValue({}); + applyPluginAutoEnableMock.mockImplementation((params: { config: unknown }) => ({ + config: params.config, + changes: [], + })); resolveBundledProviderCompatPluginIdsMock.mockReturnValue([]); withBundledPluginAllowlistCompatMock.mockImplementation( (params: { config: unknown }) => params.config, @@ -146,6 +156,32 @@ describe("buildPluginStatusReport", () => { }); }); + it("loads plugin status from the auto-enabled config snapshot", () => { + const rawConfig = { + plugins: {}, + channels: { demo: { enabled: true } }, + }; + const autoEnabledConfig = { + ...rawConfig, + plugins: { + entries: { + demo: { enabled: true }, + }, + }, + }; + applyPluginAutoEnableMock.mockReturnValue({ config: autoEnabledConfig, changes: [] }); + + buildPluginStatusReport({ config: rawConfig }); + + expect(applyPluginAutoEnableMock).toHaveBeenCalledWith({ + config: rawConfig, + env: process.env, + }); + expect(loadOpenClawPluginsMock).toHaveBeenCalledWith( + expect.objectContaining({ config: autoEnabledConfig }), + ); + }); + it("applies the full bundled provider compat chain before loading plugins", () => { const config = { plugins: { allow: ["telegram"] } }; loadConfigMock.mockReturnValue(config); diff --git a/src/plugins/status.ts b/src/plugins/status.ts index c88967f2d74..46dde5557ff 100644 --- a/src/plugins/status.ts +++ b/src/plugins/status.ts @@ -1,6 +1,7 @@ import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agents/agent-scope.js"; import { resolveDefaultAgentWorkspaceDir } from "../agents/workspace.js"; import { loadConfig } from "../config/config.js"; +import { applyPluginAutoEnable } from "../config/plugin-auto-enable.js"; import { normalizeOpenClawVersionBase } from "../config/version.js"; import { createSubsystemLogger } from "../logging/subsystem.js"; import { resolveCompatibilityHostVersion } from "../version.js"; @@ -142,7 +143,11 @@ export function buildPluginStatusReport(params?: { /** Use an explicit env when plugin roots should resolve independently from process.env. */ env?: NodeJS.ProcessEnv; }): PluginStatusReport { - const config = params?.config ?? loadConfig(); + const rawConfig = params?.config ?? loadConfig(); + const config = applyPluginAutoEnable({ + config: rawConfig, + env: params?.env ?? process.env, + }).config; const workspaceDir = params?.workspaceDir ? params.workspaceDir : (resolveAgentWorkspaceDir(config, resolveDefaultAgentId(config)) ??