diff --git a/src/auto-reply/reply/directive-handling.model.test.ts b/src/auto-reply/reply/directive-handling.model.test.ts index 4588908d157..807118ab7e7 100644 --- a/src/auto-reply/reply/directive-handling.model.test.ts +++ b/src/auto-reply/reply/directive-handling.model.test.ts @@ -161,4 +161,39 @@ describe("handleDirectiveOnly model persist behavior (fixes #1435)", () => { expect(result?.text ?? "").not.toContain("Model set to"); expect(result?.text ?? "").not.toContain("failed"); }); + + it("persists thinkingLevel=off (does not clear)", async () => { + const directives = parseInlineDirectives("/think off"); + const sessionEntry: SessionEntry = { + sessionId: "s1", + updatedAt: Date.now(), + thinkingLevel: "low", + }; + const sessionStore = { "agent:main:dm:1": sessionEntry }; + + const result = await handleDirectiveOnly({ + cfg: baseConfig(), + directives, + sessionEntry, + sessionStore, + sessionKey: "agent:main:dm:1", + storePath: "/tmp/sessions.json", + elevatedEnabled: false, + elevatedAllowed: false, + defaultProvider: "anthropic", + defaultModel: "claude-opus-4-5", + aliasIndex: baseAliasIndex(), + allowedModelKeys, + allowedModelCatalog, + resetModelOverride: false, + provider: "anthropic", + model: "claude-opus-4-5", + initialModelLabel: "anthropic/claude-opus-4-5", + formatModelSwitchEvent: (label) => `Switched to ${label}`, + }); + + expect(result?.text ?? "").not.toContain("failed"); + expect(sessionEntry.thinkingLevel).toBe("off"); + expect(sessionStore["agent:main:dm:1"]?.thinkingLevel).toBe("off"); + }); }); diff --git a/src/gateway/sessions-patch.test.ts b/src/gateway/sessions-patch.test.ts index eb109601ab5..768e3c54d8b 100644 --- a/src/gateway/sessions-patch.test.ts +++ b/src/gateway/sessions-patch.test.ts @@ -4,6 +4,38 @@ import type { SessionEntry } from "../config/sessions.js"; import { applySessionsPatchToStore } from "./sessions-patch.js"; describe("gateway sessions patch", () => { + test("persists thinkingLevel=off (does not clear)", async () => { + const store: Record = {}; + const res = await applySessionsPatchToStore({ + cfg: {} as OpenClawConfig, + store, + storeKey: "agent:main:main", + patch: { thinkingLevel: "off" }, + }); + expect(res.ok).toBe(true); + if (!res.ok) { + return; + } + expect(res.entry.thinkingLevel).toBe("off"); + }); + + test("clears thinkingLevel when patch sets null", async () => { + const store: Record = { + "agent:main:main": { thinkingLevel: "low" } as SessionEntry, + }; + const res = await applySessionsPatchToStore({ + cfg: {} as OpenClawConfig, + store, + storeKey: "agent:main:main", + patch: { thinkingLevel: null }, + }); + expect(res.ok).toBe(true); + if (!res.ok) { + return; + } + expect(res.entry.thinkingLevel).toBeUndefined(); + }); + test("persists elevatedLevel=off (does not clear)", async () => { const store: Record = {}; const res = await applySessionsPatchToStore({