From 60acfd9dfe0e28533dc8473c8684844dea5faef6 Mon Sep 17 00:00:00 2001 From: stainlu Date: Sun, 10 May 2026 22:07:15 +0800 Subject: [PATCH] fix(doctor): include fallback channel warnings --- .../doctor/shared/preview-warnings.test.ts | 40 +++++++++++++++++++ .../doctor/shared/preview-warnings.ts | 13 ++++-- 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/commands/doctor/shared/preview-warnings.test.ts b/src/commands/doctor/shared/preview-warnings.test.ts index 8d9c977ccfc..e3186b6e1f5 100644 --- a/src/commands/doctor/shared/preview-warnings.test.ts +++ b/src/commands/doctor/shared/preview-warnings.test.ts @@ -573,4 +573,44 @@ describe("doctor preview warnings", () => { expect(warnings.join("\n")).not.toContain("slack"); expect(warnings.join("\n")).not.toContain("defaults"); }); + + it("warns for default-routed configured channels when other routes exist", () => { + const warnings = collectChannelBoundMessageToolPolicyWarnings({ + channels: { + discord: {}, + telegram: {}, + }, + agents: { + list: [ + { + id: "main", + default: true, + tools: { + allow: ["read"], + }, + }, + { + id: "commander", + tools: { + profile: "messaging", + }, + }, + ], + }, + bindings: [ + { + agentId: "commander", + match: { + channel: "discord", + }, + }, + ], + }); + + expect(warnings).toEqual([ + expect.stringContaining('Agent "main" is routed from channel "telegram"'), + ]); + expect(warnings.join("\n")).not.toContain("commander"); + expect(warnings.join("\n")).not.toContain("discord"); + }); }); diff --git a/src/commands/doctor/shared/preview-warnings.ts b/src/commands/doctor/shared/preview-warnings.ts index 0c1c253be9c..68b2dc23836 100644 --- a/src/commands/doctor/shared/preview-warnings.ts +++ b/src/commands/doctor/shared/preview-warnings.ts @@ -242,13 +242,18 @@ function collectBoundChannelTargets(cfg: OpenClawConfig): Array<{ }; const routeBindings: AgentRouteBinding[] = listRouteBindings(cfg); + const explicitlyBoundChannels = new Set(); for (const binding of routeBindings) { - add(binding.agentId, binding.match.channel); + const channel = binding.match.channel.trim(); + add(binding.agentId, channel); + if (channel) { + explicitlyBoundChannels.add(channel); + } } - if (routeBindings.length === 0) { - const defaultAgentId = resolveDefaultAgentId(cfg); - for (const channel of listConfiguredChannelIds(cfg)) { + const defaultAgentId = resolveDefaultAgentId(cfg); + for (const channel of listConfiguredChannelIds(cfg)) { + if (!explicitlyBoundChannels.has(channel)) { add(defaultAgentId, channel); } }