Skip to content

Commit 1cd219e

Browse files
committed
Allow switching GLM session mode
1 parent 95fdcdb commit 1cd219e

1 file changed

Lines changed: 47 additions & 5 deletions

File tree

packages/frontend/src/pages/SessionPage.tsx

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)