diff --git a/apps/web/src/components/chat/ClaudeTraitsPicker.browser.tsx b/apps/web/src/components/chat/ClaudeTraitsPicker.browser.tsx index a675a82d8..42ab15db2 100644 --- a/apps/web/src/components/chat/ClaudeTraitsPicker.browser.tsx +++ b/apps/web/src/components/chat/ClaudeTraitsPicker.browser.tsx @@ -148,7 +148,7 @@ describe("ClaudeTraitsPicker", () => { } }); - it("shows prompt-controlled Ultrathink state with disabled effort controls", async () => { + it("shows prompt-controlled Ultrathink state with selectable effort controls", async () => { const mounted = await mountPicker({ effort: "high", model: "claude-opus-4-6", @@ -166,8 +166,7 @@ describe("ClaudeTraitsPicker", () => { await vi.waitFor(() => { const text = document.body.textContent ?? ""; expect(text).toContain("Effort"); - expect(text).toContain("Remove Ultrathink from the prompt to change effort."); - expect(text).not.toContain("Fallback Effort"); + expect(text).not.toContain("Remove Ultrathink from the prompt to change effort."); }); } finally { await mounted.cleanup(); diff --git a/apps/web/src/components/chat/ClaudeTraitsPicker.tsx b/apps/web/src/components/chat/ClaudeTraitsPicker.tsx index d6585d43d..a92d22e44 100644 --- a/apps/web/src/components/chat/ClaudeTraitsPicker.tsx +++ b/apps/web/src/components/chat/ClaudeTraitsPicker.tsx @@ -107,7 +107,6 @@ export const ClaudeTraitsMenuContent = memo(function ClaudeTraitsMenuContentImpl const handleEffortChange = useCallback( (value: ClaudeCodeEffort) => { - if (ultrathinkPromptControlled) return; if (!value) return; const nextEffort = options.find((option) => option === value); if (!nextEffort) return; @@ -119,6 +118,10 @@ export const ClaudeTraitsMenuContent = memo(function ClaudeTraitsMenuContentImpl onPromptChange(nextPrompt); return; } + if (ultrathinkPromptControlled) { + const stripped = prompt.replace(/\bultrathink\b:?\s*/i, ""); + onPromptChange(stripped); + } setProviderModelOptions( threadId, PROVIDER, @@ -151,14 +154,12 @@ export const ClaudeTraitsMenuContent = memo(function ClaudeTraitsMenuContentImpl <>
Effort
- {ultrathinkPromptControlled ? ( -
- Remove Ultrathink from the prompt to change effort. -
- ) : null} - + {options.map((option) => ( - + {CLAUDE_EFFORT_LABELS[option]} {option === defaultReasoningEffort ? " (default)" : ""} diff --git a/apps/web/src/components/chat/CompactComposerControlsMenu.browser.tsx b/apps/web/src/components/chat/CompactComposerControlsMenu.browser.tsx index 83716d619..f83937896 100644 --- a/apps/web/src/components/chat/CompactComposerControlsMenu.browser.tsx +++ b/apps/web/src/components/chat/CompactComposerControlsMenu.browser.tsx @@ -159,7 +159,7 @@ describe("CompactComposerControlsMenu", () => { } }); - it("shows prompt-controlled Ultrathink messaging with disabled effort controls", async () => { + it("shows prompt-controlled Ultrathink state with selectable effort controls", async () => { const mounted = await mountMenu({ model: "claude-opus-4-6", prompt: "Ultrathink:\nInvestigate this", @@ -176,8 +176,7 @@ describe("CompactComposerControlsMenu", () => { await vi.waitFor(() => { const text = document.body.textContent ?? ""; expect(text).toContain("Effort"); - expect(text).toContain("Remove Ultrathink from the prompt to change effort."); - expect(text).not.toContain("Fallback Effort"); + expect(text).not.toContain("Remove Ultrathink from the prompt to change effort."); }); } finally { await mounted.cleanup();