From b7356e4e5887270e0d7b3f5480141052eff84e41 Mon Sep 17 00:00:00 2001 From: Alex Knight Date: Fri, 22 May 2026 15:14:30 +1000 Subject: [PATCH] fix(ui): clarify inherited thinking off label (#85223) Control UI thinking selectors now show inherited disabled reasoning as Inherited: Off while keeping explicit Off distinct. --- CHANGELOG.md | 1 + docs/tools/thinking.md | 4 ++-- ui/src/ui/thinking-labels.ts | 3 --- ui/src/ui/views/chat.test.ts | 2 +- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 25fc48390ede..03b97934e8a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,7 @@ Docs: https://docs.openclaw.ai - Agents/Codex: promote a completed final assistant response when a prompt timeout races Codex app-server completion instead of returning an empty timeout envelope. Refs #84516. - Agents: cap heartbeat model bleed context hints by the stored session window when runtime model metadata is unavailable, so overflow recovery advice does not suggest a larger window than the active session actually has. - Control UI/Web Push: use `https://openclaw.ai` as the generated default VAPID subject instead of the old localhost mailbox so iOS PWA push setup uses an Apple-acceptable subject when `OPENCLAW_VAPID_SUBJECT` is unset. Fixes #83134. (#83317) Thanks @IWhatsskill. +- Control UI: distinguish inherited thinking-off settings from explicit Off selections so the thinking selector no longer shows two identical Off rows. (#85223) Thanks @amknight. - Agents/Pi: keep embedded session transcript writes from tripping false takeover detection after packaged npm onboarding agent turns. - Codex/TUI: surface Codex-native post-turn compaction failures instead of continuing uncompacted, and keep successful native compaction serialized before local idle/next-turn handling. Fixes #84305. (#85160) Thanks @joshavant. - Memory/search: stop recall tracking from writing dreaming side-effect artifacts when `dreaming.enabled=false`, while preserving normal search results. Fixes #84436. (#84444) Thanks @NianJiuZst. diff --git a/docs/tools/thinking.md b/docs/tools/thinking.md index eb37fa803ca5..c237bdfc15c8 100644 --- a/docs/tools/thinking.md +++ b/docs/tools/thinking.md @@ -124,8 +124,8 @@ Malformed local-model reasoning tags are handled conservatively. Closed ` - The web chat thinking selector mirrors the session's stored level from the inbound session store/config when the page loads. - Picking another level writes the session override immediately via `sessions.patch`; it does not wait for the next send and it is not a one-shot `thinkingOnce` override. -- The first option is always the clear-override choice. It shows `Inherited: ` when the session is inheriting a non-off effective default, or `Off` when inherited thinking is disabled. -- Explicit picker choices are labeled as overrides, while preserving provider labels when present (for example `Override: maximum` for a provider-labeled `max` option). +- The first option is always the clear-override choice. It shows `Inherited: `, including `Inherited: Off` when inherited thinking is disabled. +- Explicit picker choices use their direct level labels while preserving provider labels when present (for example `Maximum` for a provider-labeled `max` option). - The picker uses `thinkingLevels` returned by the gateway session row/defaults, with `thinkingOptions` kept as a legacy label list. The browser UI does not keep its own provider regex list; plugins own model-specific level sets. - `/think:` still works and updates the same stored session level, so chat directives and the picker stay in sync. diff --git a/ui/src/ui/thinking-labels.ts b/ui/src/ui/thinking-labels.ts index c4e9d58a796f..b586fcf19777 100644 --- a/ui/src/ui/thinking-labels.ts +++ b/ui/src/ui/thinking-labels.ts @@ -7,9 +7,6 @@ export function normalizeThinkingOptionValue(raw: string): string { export function formatInheritedThinkingLabel(effectiveLevel: string | null | undefined): string { const normalized = effectiveLevel ? normalizeThinkingOptionValue(effectiveLevel) : "off"; - if (!normalized || normalized === "off") { - return "Off"; - } return `Inherited: ${formatThinkingLevelDisplayLabel(normalized)}`; } diff --git a/ui/src/ui/views/chat.test.ts b/ui/src/ui/views/chat.test.ts index c7c0fc17c9d4..91dd8d9ff172 100644 --- a/ui/src/ui/views/chat.test.ts +++ b/ui/src/ui/views/chat.test.ts @@ -1407,7 +1407,7 @@ describe("chat session controls", () => { ]); expect( [...(thinkingSelect?.options ?? [])].map((option) => option.textContent?.trim()), - ).toEqual(["Off", "Off", "Adaptive", "Extra high", "Maximum"]); + ).toEqual(["Inherited: Off", "Off", "Adaptive", "Extra high", "Maximum"]); }); it("labels chat thinking default from the active session row", () => {