1- import { useEffect } from "react" ;
1+ import { useState , useEffect } from "react" ;
22import { usePersistedState } from "./usePersistedState" ;
33import { useThinkingLevel } from "./useThinkingLevel" ;
44import { useMode } from "@/browser/contexts/ModeContext" ;
@@ -10,7 +10,7 @@ import {
1010} from "@/common/types/runtime" ;
1111import {
1212 getModelKey ,
13- getDefaultRuntimeKey ,
13+ getRuntimeKey ,
1414 getTrunkBranchKey ,
1515 getLastSshHostKey ,
1616 getProjectScopeId ,
@@ -29,7 +29,10 @@ export interface DraftWorkspaceSettings {
2929 mode : UIMode ;
3030
3131 // Workspace creation settings (project-specific)
32+ /** Currently selected runtime for this workspace creation (may differ from default) */
3233 runtimeMode : RuntimeMode ;
34+ /** Persisted default runtime for this project (used to initialize selection) */
35+ defaultRuntimeMode : RuntimeMode ;
3336 sshHost : string ;
3437 trunkBranch : string ;
3538}
@@ -49,7 +52,10 @@ export function useDraftWorkspaceSettings(
4952 recommendedTrunk : string | null
5053) : {
5154 settings : DraftWorkspaceSettings ;
55+ /** Set the currently selected runtime mode (does not persist) */
5256 setRuntimeMode : ( mode : RuntimeMode ) => void ;
57+ /** Set the default runtime mode for this project (persists via checkbox) */
58+ setDefaultRuntimeMode : ( mode : RuntimeMode ) => void ;
5359 setSshHost : ( host : string ) => void ;
5460 setTrunkBranch : ( branch : string ) => void ;
5561 getRuntimeString : ( ) => string | undefined ;
@@ -68,11 +74,23 @@ export function useDraftWorkspaceSettings(
6874
6975 // Project-scoped default runtime (worktree by default, only changed via checkbox)
7076 const [ defaultRuntimeString , setDefaultRuntimeString ] = usePersistedState < string | undefined > (
71- getDefaultRuntimeKey ( projectPath ) ,
77+ getRuntimeKey ( projectPath ) ,
7278 undefined , // undefined means worktree (the app default)
7379 { listener : true }
7480 ) ;
7581
82+ // Parse default runtime string into mode (worktree when undefined)
83+ const { mode : defaultRuntimeMode } = parseRuntimeModeAndHost ( defaultRuntimeString ) ;
84+
85+ // Currently selected runtime mode for this session (initialized from default)
86+ // This allows user to select a different runtime without changing the default
87+ const [ selectedRuntimeMode , setSelectedRuntimeMode ] = useState < RuntimeMode > ( defaultRuntimeMode ) ;
88+
89+ // Sync selected mode when default changes (e.g., from checkbox or project switch)
90+ useEffect ( ( ) => {
91+ setSelectedRuntimeMode ( defaultRuntimeMode ) ;
92+ } , [ defaultRuntimeMode ] ) ;
93+
7694 // Project-scoped trunk branch preference (persisted per project)
7795 const [ trunkBranch , setTrunkBranch ] = usePersistedState < string > (
7896 getTrunkBranchKey ( projectPath ) ,
@@ -88,10 +106,6 @@ export function useDraftWorkspaceSettings(
88106 { listener : true }
89107 ) ;
90108
91- // Parse default runtime string into mode (worktree when undefined)
92- // SSH host is stored separately so it persists across mode switches
93- const { mode : runtimeMode } = parseRuntimeModeAndHost ( defaultRuntimeString ) ;
94-
95109 // Initialize trunk branch from backend recommendation or first branch
96110 useEffect ( ( ) => {
97111 if ( ! trunkBranch && branches . length > 0 ) {
@@ -100,32 +114,41 @@ export function useDraftWorkspaceSettings(
100114 }
101115 } , [ branches , recommendedTrunk , trunkBranch , setTrunkBranch ] ) ;
102116
103- // Setter for default runtime mode (only way to change is via checkbox )
117+ // Setter for selected runtime mode (changes current selection, does not persist )
104118 const setRuntimeMode = ( newMode : RuntimeMode ) => {
119+ setSelectedRuntimeMode ( newMode ) ;
120+ } ;
121+
122+ // Setter for default runtime mode (persists via checkbox in tooltip)
123+ const setDefaultRuntimeMode = ( newMode : RuntimeMode ) => {
105124 const newRuntimeString = buildRuntimeString ( newMode , lastSshHost ) ;
106125 setDefaultRuntimeString ( newRuntimeString ) ;
126+ // Also update selection to match new default
127+ setSelectedRuntimeMode ( newMode ) ;
107128 } ;
108129
109130 // Setter for SSH host (persisted separately so it's remembered across mode switches)
110131 const setSshHost = ( newHost : string ) => {
111132 setLastSshHost ( newHost ) ;
112133 } ;
113134
114- // Helper to get runtime string for IPC calls
135+ // Helper to get runtime string for IPC calls (uses selected mode, not default)
115136 const getRuntimeString = ( ) : string | undefined => {
116- return buildRuntimeString ( runtimeMode , lastSshHost ) ;
137+ return buildRuntimeString ( selectedRuntimeMode , lastSshHost ) ;
117138 } ;
118139
119140 return {
120141 settings : {
121142 model,
122143 thinkingLevel,
123144 mode,
124- runtimeMode,
145+ runtimeMode : selectedRuntimeMode ,
146+ defaultRuntimeMode,
125147 sshHost : lastSshHost ,
126148 trunkBranch,
127149 } ,
128150 setRuntimeMode,
151+ setDefaultRuntimeMode,
129152 setSshHost,
130153 setTrunkBranch,
131154 getRuntimeString,
0 commit comments