@@ -8,6 +8,7 @@ import { useDismissedReportsStore } from "@/features/inbox/stores/dismissedRepor
88import { usePushTokenStore } from "@/features/notifications/stores/pushTokenStore" ;
99import {
1010 type CompletionSound ,
11+ type DefaultReasoningEffort ,
1112 type InitialTaskMode ,
1213 type ThemePreference ,
1314 usePreferencesStore ,
@@ -59,6 +60,23 @@ const TASK_MODE_OPTIONS = [
5960 } ,
6061] as const ;
6162
63+ const REASONING_EFFORT_OPTIONS : ReadonlyArray < {
64+ value : DefaultReasoningEffort ;
65+ label : string ;
66+ description ?: string ;
67+ } > = [
68+ {
69+ value : "last_used" ,
70+ label : "Last used" ,
71+ description : "Remember the effort level you picked last time" ,
72+ } ,
73+ { value : "low" , label : "Low" } ,
74+ { value : "medium" , label : "Medium" } ,
75+ { value : "high" , label : "High" } ,
76+ { value : "xhigh" , label : "Extra High" } ,
77+ { value : "max" , label : "Max" } ,
78+ ] ;
79+
6280function themeLabel ( theme : ThemePreference ) : string {
6381 return THEME_OPTIONS . find ( ( o ) => o . value === theme ) ?. label ?? "Match system" ;
6482}
@@ -78,6 +96,13 @@ function taskModeLabel(mode: InitialTaskMode): string {
7896 return TASK_MODE_OPTIONS . find ( ( o ) => o . value === mode ) ?. label ?? "Plan" ;
7997}
8098
99+ function reasoningEffortLabel ( effort : DefaultReasoningEffort ) : string {
100+ return (
101+ REASONING_EFFORT_OPTIONS . find ( ( o ) => o . value === effort ) ?. label ??
102+ "Last used"
103+ ) ;
104+ }
105+
81106export default function SettingsScreen ( ) {
82107 const themeColors = useThemeColors ( ) ;
83108 const { insets, bottom } = useScreenInsets ( ) ;
@@ -113,6 +138,12 @@ export default function SettingsScreen() {
113138 const setDefaultInitialTaskMode = usePreferencesStore (
114139 ( s ) => s . setDefaultInitialTaskMode ,
115140 ) ;
141+ const defaultReasoningEffort = usePreferencesStore (
142+ ( s ) => s . defaultReasoningEffort ,
143+ ) ;
144+ const setDefaultReasoningEffort = usePreferencesStore (
145+ ( s ) => s . setDefaultReasoningEffort ,
146+ ) ;
116147 const decidedCount = useDismissedReportsStore (
117148 ( s ) => s . dismissedIds . length + s . acceptedIds . length ,
118149 ) ;
@@ -122,6 +153,8 @@ export default function SettingsScreen() {
122153 const [ soundSheetOpen , setSoundSheetOpen ] = useState ( false ) ;
123154 const [ volumeSheetOpen , setVolumeSheetOpen ] = useState ( false ) ;
124155 const [ taskModeSheetOpen , setTaskModeSheetOpen ] = useState ( false ) ;
156+ const [ reasoningEffortSheetOpen , setReasoningEffortSheetOpen ] =
157+ useState ( false ) ;
125158 const [ projectSheetOpen , setProjectSheetOpen ] = useState ( false ) ;
126159
127160 // The selected project's name. Prefer the names fetched for the scoped teams
@@ -272,7 +305,6 @@ export default function SettingsScreen() {
272305 label = "Initial task mode"
273306 description = "What mode new tasks start in"
274307 onPress = { ( ) => setTaskModeSheetOpen ( true ) }
275- showDivider = { false }
276308 rightSlot = {
277309 < >
278310 < Text className = "text-[14px] text-gray-11" >
@@ -282,6 +314,20 @@ export default function SettingsScreen() {
282314 </ >
283315 }
284316 />
317+ < SettingsRow
318+ label = "Default effort level"
319+ description = "Reasoning effort to pre-fill on new tasks"
320+ onPress = { ( ) => setReasoningEffortSheetOpen ( true ) }
321+ showDivider = { false }
322+ rightSlot = {
323+ < >
324+ < Text className = "text-[14px] text-gray-11" >
325+ { reasoningEffortLabel ( defaultReasoningEffort ) }
326+ </ Text >
327+ < CaretRight size = { 14 } color = { themeColors . gray [ 10 ] } />
328+ </ >
329+ }
330+ />
285331 </ SettingsSection >
286332
287333 { /* Integrations */ }
@@ -508,6 +554,21 @@ export default function SettingsScreen() {
508554 } ) ) }
509555 />
510556
557+ < SelectSheet
558+ open = { reasoningEffortSheetOpen }
559+ title = "Default effort level"
560+ value = { defaultReasoningEffort }
561+ onChange = { ( value ) =>
562+ setDefaultReasoningEffort ( value as DefaultReasoningEffort )
563+ }
564+ onClose = { ( ) => setReasoningEffortSheetOpen ( false ) }
565+ options = { REASONING_EFFORT_OPTIONS . map ( ( option ) => ( {
566+ value : option . value ,
567+ label : option . label ,
568+ description : option . description ,
569+ } ) ) }
570+ />
571+
511572 < SelectSheet
512573 open = { projectSheetOpen }
513574 title = "Active project"
0 commit comments