diff --git a/desktop/src/components/controls/PermissionModeSelector.test.tsx b/desktop/src/components/controls/PermissionModeSelector.test.tsx index 98d2bfba..fe242066 100644 --- a/desktop/src/components/controls/PermissionModeSelector.test.tsx +++ b/desktop/src/components/controls/PermissionModeSelector.test.tsx @@ -38,6 +38,7 @@ vi.mock('../../i18n', () => ({ 'permMode.permShell': 'Run shell commands', 'permMode.permPackages': 'Install packages', 'permMode.enableBypassBtn': 'Enable bypass', + 'permMode.disabledDuringTurn': 'Cannot switch permissions while session is active', 'common.cancel': 'Cancel', 'tabs.close': 'Close', }[key] ?? key), @@ -159,4 +160,46 @@ describe('PermissionModeSelector', () => { expect(screen.getByText('C:\\Users\\LinTan\\MyScript\\test5')).toBeInTheDocument() expect(screen.queryByText('C:\\Users\\LinTan')).not.toBeInTheDocument() }) + + it('disables the trigger button when the session turn is active', () => { + const setSessionPermissionMode = vi.fn() + useChatStore.setState({ + setSessionPermissionMode, + sessions: { + 'current-tab': { chatState: 'thinking' }, + }, + } as Partial>) + useSessionStore.setState({ + activeSessionId: 'current-tab', + sessions: [ + { + id: 'current-tab', + title: 'Current', + createdAt: '2026-05-24T00:00:00.000Z', + modifiedAt: '2026-05-24T00:00:00.000Z', + messageCount: 1, + projectPath: '/repo', + projectRoot: '/repo', + workDir: '/repo', + workDirExists: true, + permissionMode: 'default', + }, + ], + }) + useTabStore.setState({ + activeTabId: 'current-tab', + tabs: [{ sessionId: 'current-tab', title: 'Current', type: 'session', status: 'idle' }], + }) + + render() + + const trigger = screen.getByRole('button', { name: 'Ask permissions' }) + expect(trigger).toBeDisabled() + expect(trigger).toHaveAttribute('title', 'Cannot switch permissions while session is active') + + fireEvent.click(trigger) + // Menu should not open when disabled + expect(screen.queryByRole('menu')).not.toBeInTheDocument() + expect(setSessionPermissionMode).not.toHaveBeenCalled() + }) }) diff --git a/desktop/src/components/controls/PermissionModeSelector.tsx b/desktop/src/components/controls/PermissionModeSelector.tsx index f7d094ac..50da59ef 100644 --- a/desktop/src/components/controls/PermissionModeSelector.tsx +++ b/desktop/src/components/controls/PermissionModeSelector.tsx @@ -36,6 +36,10 @@ export function PermissionModeSelector({ workDir: workDirProp, compact = false, const setSessionPermissionMode = useChatStore((s) => s.setSessionPermissionMode) const activeTabId = useTabStore((s) => s.activeTabId) const sessions = useSessionStore((s) => s.sessions) + const chatState = useChatStore((s) => + activeTabId ? s.sessions[activeTabId]?.chatState ?? 'idle' : 'idle', + ) + const isTurnActive = chatState !== 'idle' const [open, setOpen] = useState(false) const [confirmDialog, setConfirmDialog] = useState(false) const ref = useRef(null) @@ -179,15 +183,16 @@ export function PermissionModeSelector({ workDir: workDirProp, compact = false, return (