diff --git a/src/muse-settings.ts b/src/muse-settings.ts index 1e5bfc3..b970ab8 100644 --- a/src/muse-settings.ts +++ b/src/muse-settings.ts @@ -1,6 +1,7 @@ import { readFileSync } from "node:fs"; import { homedir } from "node:os"; import { join } from "node:path"; +import { EFFORT_LEVELS, isReasoningEffort } from "./config-options.js"; import { Logger } from "./logger.js"; /** @@ -36,10 +37,20 @@ export function readMuseSettings( return {}; } const settings = raw as Record; + const reasoningEffort = + typeof settings.reasoning_effort === "string" ? settings.reasoning_effort : undefined; + // The muse CLI documents efforts this adapter cannot carry (`max`), so a + // value copied from `muse exec --help` would otherwise fall back to the + // default with nothing said anywhere. + if (reasoningEffort !== undefined && !isReasoningEffort(reasoningEffort)) { + logger.log( + `muse settings at ${path}: unknown reasoning_effort "${reasoningEffort}"; ` + + `using the default (supported: ${EFFORT_LEVELS.join(", ")})`, + ); + } return { provider: typeof settings.provider === "string" ? settings.provider : undefined, model: typeof settings.model === "string" ? settings.model : undefined, - reasoningEffort: - typeof settings.reasoning_effort === "string" ? settings.reasoning_effort : undefined, + reasoningEffort, }; } diff --git a/src/tests/muse-settings.test.ts b/src/tests/muse-settings.test.ts index 12f6b7f..2d02806 100644 --- a/src/tests/muse-settings.test.ts +++ b/src/tests/muse-settings.test.ts @@ -31,6 +31,26 @@ describe("readMuseSettings edge cases", () => { expect(lines.some((line) => line.includes("is not an object"))).toBe(true); }); + it("reports a reasoning_effort the adapter cannot carry", () => { + const lines: string[] = []; + expect( + readMuseSettings( + settingsEnv(JSON.stringify({ reasoning_effort: "max" })), + capturingLogger(lines), + ), + ).toEqual({ reasoningEffort: "max" }); + expect(lines.some((line) => line.includes('unknown reasoning_effort "max"'))).toBe(true); + }); + + it("stays quiet on a reasoning_effort it supports", () => { + const lines: string[] = []; + readMuseSettings( + settingsEnv(JSON.stringify({ reasoning_effort: "xhigh" })), + capturingLogger(lines), + ); + expect(lines.some((line) => line.includes("reasoning_effort"))).toBe(false); + }); + it("ignores non-string fields while keeping valid ones", () => { expect( readMuseSettings(