diff --git a/src/channels/plugins/read-only.test.ts b/src/channels/plugins/read-only.test.ts index 52c7eb81f7f..0871b9c4ef2 100644 --- a/src/channels/plugins/read-only.test.ts +++ b/src/channels/plugins/read-only.test.ts @@ -325,6 +325,29 @@ afterAll(() => { }); describe("listReadOnlyChannelPluginsForConfig", () => { + it("does not load setup-only channel plugin runtime by default", () => { + const { pluginDir, fullMarker, setupMarker } = writeExternalSetupChannelPlugin(); + const plugins = listReadOnlyChannelPluginsForConfig( + { + channels: { + "external-chat": { token: "configured" }, + }, + plugins: { + load: { paths: [pluginDir] }, + allow: ["external-chat"], + }, + } as never, + { + env: { ...process.env }, + includePersistedAuthState: false, + }, + ); + + expect(plugins.some((entry) => entry.id === "external-chat")).toBe(false); + expect(fs.existsSync(setupMarker)).toBe(false); + expect(fs.existsSync(fullMarker)).toBe(false); + }); + it("loads configured external channel setup metadata without importing full runtime", () => { const { pluginDir, fullMarker, setupMarker } = writeExternalSetupChannelPlugin(); const plugins = listReadOnlyChannelPluginsForConfig( @@ -340,6 +363,7 @@ describe("listReadOnlyChannelPluginsForConfig", () => { { env: { ...process.env }, includePersistedAuthState: false, + includeSetupRuntimeFallback: true, }, ); @@ -365,6 +389,7 @@ describe("listReadOnlyChannelPluginsForConfig", () => { { env: { ...process.env }, includePersistedAuthState: false, + includeSetupRuntimeFallback: true, }, ); @@ -396,6 +421,7 @@ describe("listReadOnlyChannelPluginsForConfig", () => { { env: { ...process.env }, includePersistedAuthState: false, + includeSetupRuntimeFallback: true, }, ); @@ -442,6 +468,7 @@ describe("listReadOnlyChannelPluginsForConfig", () => { { env: { ...process.env }, includePersistedAuthState: false, + includeSetupRuntimeFallback: true, }, ); @@ -481,6 +508,7 @@ describe("listReadOnlyChannelPluginsForConfig", () => { { env: { ...process.env }, includePersistedAuthState: false, + includeSetupRuntimeFallback: true, }, ); @@ -711,6 +739,7 @@ describe("listReadOnlyChannelPluginsForConfig", () => { { env: { ...process.env, EXTERNAL_CHAT_TOKEN: "configured" }, includePersistedAuthState: false, + includeSetupRuntimeFallback: true, }, ); @@ -754,6 +783,7 @@ describe("listReadOnlyChannelPluginsForConfig", () => { { env: { ...process.env, [envVar]: "configured" }, includePersistedAuthState: false, + includeSetupRuntimeFallback: true, }, ); @@ -779,6 +809,7 @@ describe("listReadOnlyChannelPluginsForConfig", () => { { env: { ...process.env, [envVar]: "configured" }, includePersistedAuthState: false, + includeSetupRuntimeFallback: true, }, ); @@ -831,6 +862,7 @@ describe("listReadOnlyChannelPluginsForConfig", () => { EXTERNAL_CHAT_TOKEN: "configured", workspaceDir: "workspace-env-value", }, + includeSetupRuntimeFallback: true, }, ); @@ -866,6 +898,7 @@ describe("listReadOnlyChannelPluginsForConfig", () => { { env: { ...process.env }, includePersistedAuthState: false, + includeSetupRuntimeFallback: true, }, ); @@ -894,6 +927,7 @@ describe("listReadOnlyChannelPluginsForConfig", () => { } as never, { env: { ...process.env }, + includeSetupRuntimeFallback: true, }, ); diff --git a/src/channels/plugins/read-only.ts b/src/channels/plugins/read-only.ts index 86d64c2bef9..836dce85653 100644 --- a/src/channels/plugins/read-only.ts +++ b/src/channels/plugins/read-only.ts @@ -24,6 +24,7 @@ type ReadOnlyChannelPluginOptions = { workspaceDir?: string; activationSourceConfig?: OpenClawConfig; includePersistedAuthState?: boolean; + includeSetupRuntimeFallback?: boolean; cache?: boolean; }; @@ -585,7 +586,7 @@ export function resolveReadOnlyChannelPluginsForConfig( [pluginId, channelIds.filter((channelId) => missingChannelIdSet.has(channelId))] as const, ), ); - if (setupMissingChannelIds.length > 0) { + if (setupMissingChannelIds.length > 0 && options.includeSetupRuntimeFallback === true) { const registry = loadOpenClawPlugins({ config: cfg, activationSourceConfig: options.activationSourceConfig ?? cfg, diff --git a/src/commands/doctor/shared/channel-doctor.ts b/src/commands/doctor/shared/channel-doctor.ts index adf206b1cde..6a6cc6fa2e0 100644 --- a/src/commands/doctor/shared/channel-doctor.ts +++ b/src/commands/doctor/shared/channel-doctor.ts @@ -134,6 +134,7 @@ function safeListReadOnlyChannelPlugins(context: ChannelDoctorLookupContext) { return resolveReadOnlyChannelPluginsForConfig(context.cfg, { ...(context.env ? { env: context.env } : {}), includePersistedAuthState: false, + includeSetupRuntimeFallback: true, }).plugins; } catch { return [];