From 02bce20dd0aa14485600157d7b2c2af117e3ed02 Mon Sep 17 00:00:00 2001 From: Tak Hoffman <781889+Takhoffman@users.noreply.github.com> Date: Fri, 27 Mar 2026 20:38:47 -0500 Subject: [PATCH] fix: prefer canonical cli backend config keys --- src/agents/cli-backends.test.ts | 40 +++++++++++++++++++++++++++++++++ src/agents/cli-backends.ts | 4 ++++ 2 files changed, 44 insertions(+) diff --git a/src/agents/cli-backends.test.ts b/src/agents/cli-backends.test.ts index 2618c0c0497..0a554b6f2f0 100644 --- a/src/agents/cli-backends.test.ts +++ b/src/agents/cli-backends.test.ts @@ -310,3 +310,43 @@ describe("resolveCliBackendConfig google-gemini-cli defaults", () => { expect(resolved?.config.modelAliases?.pro).toBe("gemini-3.1-pro-preview"); }); }); + +describe("resolveCliBackendConfig alias precedence", () => { + it("prefers the canonical backend key over legacy aliases when both are configured", () => { + const registry = createEmptyPluginRegistry(); + registry.cliBackends = [ + createBackendEntry({ + pluginId: "moonshot", + id: "kimi", + config: { + command: "kimi", + args: ["--default"], + }, + }), + ]; + setActivePluginRegistry(registry); + + const cfg = { + agents: { + defaults: { + cliBackends: { + "kimi-coding": { + command: "kimi-legacy", + args: ["--legacy"], + }, + kimi: { + command: "kimi-canonical", + args: ["--canonical"], + }, + }, + }, + }, + } satisfies OpenClawConfig; + + const resolved = resolveCliBackendConfig("kimi", cfg); + + expect(resolved).not.toBeNull(); + expect(resolved?.config.command).toBe("kimi-canonical"); + expect(resolved?.config.args).toEqual(["--canonical"]); + }); +}); diff --git a/src/agents/cli-backends.ts b/src/agents/cli-backends.ts index cce4829851a..22aa5168854 100644 --- a/src/agents/cli-backends.ts +++ b/src/agents/cli-backends.ts @@ -18,6 +18,10 @@ function pickBackendConfig( config: Record, normalizedId: string, ): CliBackendConfig | undefined { + const directKey = Object.keys(config).find((key) => key.trim().toLowerCase() === normalizedId); + if (directKey) { + return config[directKey]; + } for (const [key, entry] of Object.entries(config)) { if (normalizeBackendKey(key) === normalizedId) { return entry;