From 81fea91fdaeeec9b4fb6247cb5a1c0a6efec4675 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 3 May 2026 13:16:09 +0100 Subject: [PATCH] fix: restore config dry-run schema validation --- src/cli/config-cli.ts | 1 + src/config/schema.base.generated.ts | 5 +++-- src/config/validation.ts | 7 +++++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/cli/config-cli.ts b/src/cli/config-cli.ts index 5bb3eff8b58..a9f38c47065 100644 --- a/src/cli/config-cli.ts +++ b/src/cli/config-cli.ts @@ -1313,6 +1313,7 @@ function collectDryRunSchemaErrors(params: { }): ConfigSetDryRunError[] { const validated = validateConfigObjectRaw(params.config, { touchedPaths: params.operations.map((operation) => operation.setPath), + validateBundledChannels: true, }); if (validated.ok) { return []; diff --git a/src/config/schema.base.generated.ts b/src/config/schema.base.generated.ts index 350d9a4b89b..b3ce72b3784 100644 --- a/src/config/schema.base.generated.ts +++ b/src/config/schema.base.generated.ts @@ -21989,12 +21989,13 @@ export const GENERATED_BASE_CONFIG_SCHEMA: BaseConfigSchemaResponse = { "Web channel runtime settings for heartbeat and reconnect behavior when operating web-based chat surfaces. Use reconnect values tuned to your network reliability profile and expected uptime needs.", }, channels: { + type: "object", + properties: {}, + additionalProperties: true, title: "Channels", description: "Channel provider configurations plus shared defaults that control access policies, heartbeat visibility, and per-surface behavior. Keep defaults centralized and override per provider only where required.", - properties: {}, required: [], - additionalProperties: true, }, discovery: { type: "object", diff --git a/src/config/validation.ts b/src/config/validation.ts index 0836590f8b0..7564d765f99 100644 --- a/src/config/validation.ts +++ b/src/config/validation.ts @@ -621,9 +621,10 @@ function validateGatewayTailscaleBind(config: OpenClawConfig): ConfigValidationI */ export function validateConfigObjectRaw( raw: unknown, - _opts?: { + opts?: { sourceRaw?: unknown; touchedPaths?: ReadonlyArray>; + validateBundledChannels?: boolean; }, ): { ok: true; config: OpenClawConfig } | { ok: false; issues: ConfigValidationIssue[] } { const normalizedRaw = stripDeprecatedValidationKeys(raw); @@ -638,7 +639,9 @@ export function validateConfigObjectRaw( } const validatedConfig = validated.data as OpenClawConfig; const channelIssues = - policyIssues.length > 0 ? collectRawBundledChannelConfigIssues(validatedConfig) : []; + policyIssues.length > 0 || opts?.validateBundledChannels + ? collectRawBundledChannelConfigIssues(validatedConfig) + : []; if (channelIssues.length > 0) { return { ok: false,