@@ -52,10 +52,12 @@ export function SessionPage() {
5252 const [ mobileView , setMobileView ] = useState < MobileView > ( 'chat' ) ;
5353 const [ showAllowedDirsDialog , setShowAllowedDirsDialog ] = useState ( false ) ;
5454 const [ now , setNow ] = useState ( Date . now ( ) ) ;
55+ const loadedModeForSessionRef = useRef < string | null > ( null ) ;
5556
5657 const { usage, addMessage } = useSessionStore ( ) ;
5758 const { uiProvider } = useProviderStore ( ) ;
5859 const providerLabel = UI_PROVIDER_META [ uiProvider ] . label ;
60+ const sessionModeStorageKey = useMemo ( ( ) => ( id ? `sessionMode:${ id } ` : null ) , [ id ] ) ;
5961
6062 // Mobile swipe gesture navigation
6163 const mobileViewOrder = useMemo ( ( ) : MobileView [ ] => {
@@ -247,6 +249,23 @@ export function SessionPage() {
247249 return `${ seconds } s` ;
248250 } , [ ] ) ;
249251
252+ const allowedSessionModes : SessionMode [ ] = useMemo (
253+ ( ) => [ 'planning' , 'auto-accept' , 'manual' , 'danger' , 'orchestration' ] ,
254+ [ ]
255+ ) ;
256+
257+ const getStoredSessionMode = useCallback ( ( key : string ) => {
258+ try {
259+ const stored = window . localStorage . getItem ( key ) ;
260+ if ( stored && allowedSessionModes . includes ( stored as SessionMode ) ) {
261+ return stored as SessionMode ;
262+ }
263+ } catch {
264+ // Ignore storage errors (private mode, blocked, etc.)
265+ }
266+ return null ;
267+ } , [ allowedSessionModes ] ) ;
268+
250269 // Fetch session details
251270 const { data : session , isLoading : sessionLoading } = useQuery ( {
252271 queryKey : [ 'session' , id ] ,
@@ -264,11 +283,27 @@ export function SessionPage() {
264283 if ( ! id || ! session ) {
265284 return ;
266285 }
267- if ( session . cliProvider === 'glm' && sessionMode === 'auto-accept' ) {
268- setSessionMode ( 'planning' ) ;
269- socketService . setSessionMode ( id , 'planning' ) ;
286+ if ( sessionModeStorageKey && loadedModeForSessionRef . current !== id ) {
287+ const storedMode = getStoredSessionMode ( sessionModeStorageKey ) ;
288+ if ( storedMode ) {
289+ setSessionMode ( storedMode ) ;
290+ socketService . setSessionMode ( id , storedMode ) ;
291+ }
292+ loadedModeForSessionRef . current = id ;
270293 }
271- } , [ id , session , sessionMode ] ) ;
294+ if ( session . cliProvider === 'glm' && sessionModeStorageKey ) {
295+ const storedMode = getStoredSessionMode ( sessionModeStorageKey ) ;
296+ if ( ! storedMode && sessionMode === 'auto-accept' ) {
297+ setSessionMode ( 'planning' ) ;
298+ socketService . setSessionMode ( id , 'planning' ) ;
299+ try {
300+ window . localStorage . setItem ( sessionModeStorageKey , 'planning' ) ;
301+ } catch {
302+ // Ignore storage errors
303+ }
304+ }
305+ }
306+ } , [ id , session , sessionMode , sessionModeStorageKey , getStoredSessionMode ] ) ;
272307
273308 const limitsProvider = session ?. cliProvider ;
274309 const limitsSupported = limitsProvider === 'claude' || limitsProvider === 'glm' ;
@@ -364,7 +399,7 @@ export function SessionPage() {
364399 return ( ) => {
365400 socketService . unsubscribeFromSession ( id ) ;
366401 } ;
367- } , [ id ] ) ;
402+ } , [ id , sessionModeStorageKey ] ) ;
368403
369404 // Scroll to bottom when new messages arrive
370405 useEffect ( ( ) => {
@@ -490,6 +525,13 @@ export function SessionPage() {
490525 if ( id ) {
491526 socketService . setSessionMode ( id , newMode ) ;
492527 }
528+ if ( sessionModeStorageKey ) {
529+ try {
530+ window . localStorage . setItem ( sessionModeStorageKey , newMode ) ;
531+ } catch {
532+ // Ignore storage errors
533+ }
534+ }
493535 } , [ id ] ) ;
494536
495537 // Handler for hooks-based permission response
0 commit comments