Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions src/muse-settings.ts
Original file line number Diff line number Diff line change
@@ -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";

/**
Expand Down Expand Up @@ -36,10 +37,20 @@ export function readMuseSettings(
return {};
}
const settings = raw as Record<string, unknown>;
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,
};
}
20 changes: 20 additions & 0 deletions src/tests/muse-settings.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down