From ffd1c366eb5ee932fb66afe90a6187d2a3d5e565 Mon Sep 17 00:00:00 2001 From: claude-code-best Date: Sat, 11 Apr 2026 11:09:03 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=A8=A1=E5=9E=8B=20?= =?UTF-8?q?1M=20=E4=B8=8A=E4=B8=8B=E6=96=87=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/ModelPicker.tsx | 37 +++++++++++++++++++++++++++++- src/keybindings/defaultBindings.ts | 1 + src/keybindings/schema.ts | 1 + 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/components/ModelPicker.tsx b/src/components/ModelPicker.tsx index 4977dbbcb..b9f5155bc 100644 --- a/src/components/ModelPicker.tsx +++ b/src/components/ModelPicker.tsx @@ -1,6 +1,7 @@ import capitalize from 'lodash-es/capitalize.js' import * as React from 'react' import { useCallback, useMemo, useState } from 'react' +import { has1mContext } from '../utils/context.js' import { useExitOnCtrlCDWithKeybindings } from 'src/hooks/useExitOnCtrlCDWithKeybindings.js' import { type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, @@ -83,6 +84,23 @@ export function ModelPicker({ isFastModeEnabled() ? s.fastMode : false, ) + const [marked1MValues, setMarked1MValues] = useState>( + () => new Set(has1mContext(initialValue) ? [initialValue.replace(/\[1m\]/i, '')] : []) + ) + + const handleToggle1M = useCallback(() => { + if (!focusedValue || focusedValue === NO_PREFERENCE) return + setMarked1MValues(prev => { + const next = new Set(prev) + if (next.has(focusedValue)) { + next.delete(focusedValue) + } else { + next.add(focusedValue) + } + return next + }) + }, [focusedValue]) + const [hasToggledEffort, setHasToggledEffort] = useState(false) const effortValue = useAppState(s => s.effortValue) const [effort, setEffort] = useState( @@ -136,6 +154,7 @@ export function ModelPicker({ opt => opt.value === focusedValue, )?.label const focusedModel = resolveOptionModel(focusedValue) + const is1MMarked = focusedValue !== undefined && focusedValue !== NO_PREFERENCE && marked1MValues.has(focusedValue) const focusedSupportsEffort = focusedModel ? modelSupportsEffort(focusedModel) : false @@ -178,6 +197,7 @@ export function ModelPicker({ { 'modelPicker:decreaseEffort': () => handleCycleEffort('left'), 'modelPicker:increaseEffort': () => handleCycleEffort('right'), + 'modelPicker:toggle1M': () => handleToggle1M(), }, { context: 'ModelPicker' }, ) @@ -215,7 +235,11 @@ export function ModelPicker({ onSelect(null, selectedEffort) return } - onSelect(value, selectedEffort) + // Apply or strip [1m] suffix based on user toggle + const wants1M = marked1MValues.has(value) + const baseValue = value.replace(/\[1m\]/i, '') + const finalValue = wants1M ? `${baseValue}[1m]` : baseValue + onSelect(finalValue, selectedEffort) } const content = ( @@ -270,6 +294,17 @@ export function ModelPicker({ {focusedModelName ? ` for ${focusedModelName}` : ''} )} + {is1MMarked ? ( + + 1M context on + ยท Space to toggle + + ) : ( + + 1M context off + {focusedModelName ? ` for ${focusedModelName}` : ''} + + )} {isFastModeEnabled() ? ( diff --git a/src/keybindings/defaultBindings.ts b/src/keybindings/defaultBindings.ts index f33e764ac..1414ee8f1 100644 --- a/src/keybindings/defaultBindings.ts +++ b/src/keybindings/defaultBindings.ts @@ -322,6 +322,7 @@ export const DEFAULT_BINDINGS: KeybindingBlock[] = [ bindings: { left: 'modelPicker:decreaseEffort', right: 'modelPicker:increaseEffort', + space: 'modelPicker:toggle1M', }, }, // Select component navigation (used by /model, /resume, permission prompts, etc.) diff --git a/src/keybindings/schema.ts b/src/keybindings/schema.ts index 3e61d63a5..8f15231d2 100644 --- a/src/keybindings/schema.ts +++ b/src/keybindings/schema.ts @@ -153,6 +153,7 @@ export const KEYBINDING_ACTIONS = [ // Model picker actions (ant-only) 'modelPicker:decreaseEffort', 'modelPicker:increaseEffort', + 'modelPicker:toggle1M', // Select component actions (distinct from confirm: to avoid collisions) 'select:next', 'select:previous',