diff --git a/src/components/shell/constants/constants.ts b/src/components/shell/constants/constants.ts index 49dffd50..6880b68c 100644 --- a/src/components/shell/constants/constants.ts +++ b/src/components/shell/constants/constants.ts @@ -1,6 +1,5 @@ import type { ITerminalOptions } from '@xterm/xterm'; -export const CODEX_DEVICE_AUTH_URL = 'https://auth.openai.com/codex/device'; export const SHELL_RESTART_DELAY_MS = 200; export const TERMINAL_INIT_DELAY_MS = 100; export const TERMINAL_RESIZE_DELAY_MS = 50; diff --git a/src/components/shell/hooks/useShellConnection.ts b/src/components/shell/hooks/useShellConnection.ts index 918ed76c..f88372c0 100644 --- a/src/components/shell/hooks/useShellConnection.ts +++ b/src/components/shell/hooks/useShellConnection.ts @@ -24,7 +24,6 @@ type UseShellConnectionOptions = { autoConnect: boolean; closeSocket: () => void; clearTerminalScreen: () => void; - setAuthUrl: (nextAuthUrl: string) => void; onOutputRef?: MutableRefObject<(() => void) | null>; }; @@ -49,7 +48,6 @@ export function useShellConnection({ autoConnect, closeSocket, clearTerminalScreen, - setAuthUrl, onOutputRef, }: UseShellConnectionOptions): UseShellConnectionResult { const [isConnected, setIsConnected] = useState(false); @@ -100,14 +98,8 @@ export function useShellConnection({ return; } - if (message.type === 'auth_url' || message.type === 'url_open') { - const nextAuthUrl = typeof message.url === 'string' ? message.url : ''; - if (nextAuthUrl) { - setAuthUrl(nextAuthUrl); - } - } }, - [handleProcessCompletion, onOutputRef, setAuthUrl, terminalRef], + [handleProcessCompletion, onOutputRef, terminalRef], ); const connectWebSocket = useCallback( @@ -133,7 +125,6 @@ export function useShellConnection({ setIsConnected(true); setIsConnecting(false); connectingRef.current = false; - setAuthUrl(''); window.setTimeout(() => { const currentTerminal = terminalRef.current; @@ -196,7 +187,6 @@ export function useShellConnection({ isPlainShellRef, selectedProjectRef, selectedSessionRef, - setAuthUrl, terminalRef, wsRef, ], @@ -225,8 +215,7 @@ export function useShellConnection({ setIsConnecting(false); connectingRef.current = false; forceRestartOnInitRef.current = false; - setAuthUrl(''); - }, [clearTerminalScreen, closeSocket, setAuthUrl]); + }, [clearTerminalScreen, closeSocket]); useEffect(() => { if ( diff --git a/src/components/shell/hooks/useShellRuntime.ts b/src/components/shell/hooks/useShellRuntime.ts index 2176d109..21054dca 100644 --- a/src/components/shell/hooks/useShellRuntime.ts +++ b/src/components/shell/hooks/useShellRuntime.ts @@ -1,8 +1,9 @@ -import { useCallback, useEffect, useRef, useState } from 'react'; +import { useCallback, useEffect, useRef } from 'react'; import type { FitAddon } from '@xterm/addon-fit'; import type { Terminal } from '@xterm/xterm'; + import type { UseShellRuntimeOptions, UseShellRuntimeResult } from '../types/types'; -import { copyTextToClipboard } from '../../../utils/clipboard'; + import { useShellConnection } from './useShellConnection'; import { useShellTerminal } from './useShellTerminal'; @@ -22,15 +23,11 @@ export function useShellRuntime({ const fitAddonRef = useRef(null); const wsRef = useRef(null); - const [authUrl, setAuthUrl] = useState(''); - const [authUrlVersion, setAuthUrlVersion] = useState(0); - const selectedProjectRef = useRef(selectedProject); const selectedSessionRef = useRef(selectedSession); const initialCommandRef = useRef(initialCommand); const isPlainShellRef = useRef(isPlainShell); const onProcessCompleteRef = useRef(onProcessComplete); - const authUrlRef = useRef(''); const lastSessionIdRef = useRef(selectedSession?.id ?? null); // Keep mutable values in refs so websocket handlers always read current data. @@ -42,12 +39,6 @@ export function useShellRuntime({ onProcessCompleteRef.current = onProcessComplete; }, [selectedProject, selectedSession, initialCommand, isPlainShell, onProcessComplete]); - const setCurrentAuthUrl = useCallback((nextAuthUrl: string) => { - authUrlRef.current = nextAuthUrl; - setAuthUrl(nextAuthUrl); - setAuthUrlVersion((previous) => previous + 1); - }, []); - const closeSocket = useCallback(() => { const activeSocket = wsRef.current; if (!activeSocket) { @@ -64,32 +55,6 @@ export function useShellRuntime({ wsRef.current = null; }, []); - const openAuthUrlInBrowser = useCallback((url = authUrlRef.current) => { - if (!url) { - return false; - } - - const popup = window.open(url, '_blank'); - if (popup) { - try { - popup.opener = null; - } catch { - // Ignore cross-origin restrictions when trying to null opener. - } - return true; - } - - return false; - }, []); - - const copyAuthUrlToClipboard = useCallback(async (url = authUrlRef.current) => { - if (!url) { - return false; - } - - return copyTextToClipboard(url); - }, []); - const { isInitialized, clearTerminalScreen, disposeTerminal } = useShellTerminal({ terminalContainerRef, terminalRef, @@ -98,10 +63,6 @@ export function useShellRuntime({ selectedProject, minimal, isRestarting, - initialCommandRef, - isPlainShellRef, - authUrlRef, - copyAuthUrlToClipboard, closeSocket, }); @@ -118,7 +79,6 @@ export function useShellRuntime({ autoConnect, closeSocket, clearTerminalScreen, - setAuthUrl: setCurrentAuthUrl, onOutputRef, }); @@ -156,11 +116,7 @@ export function useShellRuntime({ isConnected, isInitialized, isConnecting, - authUrl, - authUrlVersion, connectToShell, disconnectFromShell, - openAuthUrlInBrowser, - copyAuthUrlToClipboard, }; } diff --git a/src/components/shell/hooks/useShellTerminal.ts b/src/components/shell/hooks/useShellTerminal.ts index d39cda15..0cdfe3ac 100644 --- a/src/components/shell/hooks/useShellTerminal.ts +++ b/src/components/shell/hooks/useShellTerminal.ts @@ -27,10 +27,6 @@ type UseShellTerminalOptions = { selectedProject: Project | null | undefined; minimal: boolean; isRestarting: boolean; - initialCommandRef: MutableRefObject; - isPlainShellRef: MutableRefObject; - authUrlRef: MutableRefObject; - copyAuthUrlToClipboard: (url?: string) => Promise; closeSocket: () => void; }; diff --git a/src/components/shell/types/types.ts b/src/components/shell/types/types.ts index 72a19785..a164e9cd 100644 --- a/src/components/shell/types/types.ts +++ b/src/components/shell/types/types.ts @@ -4,8 +4,6 @@ import type { Terminal } from '@xterm/xterm'; import type { Project, ProjectSession } from '../../../types/app'; -export type AuthCopyStatus = 'idle' | 'copied' | 'failed'; - export type ShellInitMessage = { type: 'init'; projectPath: string; @@ -54,7 +52,6 @@ export type ShellSharedRefs = { wsRef: MutableRefObject; terminalRef: MutableRefObject; fitAddonRef: MutableRefObject; - authUrlRef: MutableRefObject; selectedProjectRef: MutableRefObject; selectedSessionRef: MutableRefObject; initialCommandRef: MutableRefObject; @@ -69,10 +66,6 @@ export type UseShellRuntimeResult = { isConnected: boolean; isInitialized: boolean; isConnecting: boolean; - authUrl: string; - authUrlVersion: number; connectToShell: (options?: { forceRestart?: boolean }) => void; disconnectFromShell: (options?: { suppressAutoConnect?: boolean }) => void; - openAuthUrlInBrowser: (url?: string) => boolean; - copyAuthUrlToClipboard: (url?: string) => Promise; }; diff --git a/src/components/shell/utils/auth.ts b/src/components/shell/utils/auth.ts index d55041b1..fde9d4bc 100644 --- a/src/components/shell/utils/auth.ts +++ b/src/components/shell/utils/auth.ts @@ -1,17 +1,4 @@ import type { ProjectSession } from '../../../types/app'; -import { CODEX_DEVICE_AUTH_URL } from '../constants/constants'; - -export function isCodexLoginCommand(command: string | null | undefined): boolean { - return typeof command === 'string' && /\bcodex\s+login\b/i.test(command); -} - -export function resolveAuthUrlForDisplay(command: string | null | undefined, authUrl: string): string { - if (isCodexLoginCommand(command)) { - return CODEX_DEVICE_AUTH_URL; - } - - return authUrl; -} export function getSessionDisplayName(session: ProjectSession | null | undefined): string | null { if (!session) { @@ -21,4 +8,4 @@ export function getSessionDisplayName(session: ProjectSession | null | undefined return session.__provider === 'cursor' ? session.name || 'Untitled Session' : session.summary || 'New Session'; -} \ No newline at end of file +} diff --git a/src/components/shell/view/Shell.tsx b/src/components/shell/view/Shell.tsx index 575b0ac3..c133378d 100644 --- a/src/components/shell/view/Shell.tsx +++ b/src/components/shell/view/Shell.tsx @@ -59,12 +59,8 @@ export default function Shell({ isConnected, isInitialized, isConnecting, - authUrl, - authUrlVersion, connectToShell, disconnectFromShell, - openAuthUrlInBrowser, - copyAuthUrlToClipboard, } = useShellRuntime({ selectedProject, selectedSession, @@ -243,15 +239,7 @@ export default function Shell({ if (minimal) { return ( <> - + ; - authUrl: string; - authUrlVersion: number; - initialCommand: string | null | undefined; - isConnected: boolean; - openAuthUrlInBrowser: (url: string) => boolean; - copyAuthUrlToClipboard: (url: string) => Promise; }; export default function ShellMinimalView({ terminalContainerRef, - authUrl, - authUrlVersion, - initialCommand, - isConnected, - openAuthUrlInBrowser, - copyAuthUrlToClipboard, }: ShellMinimalViewProps) { - const [authUrlCopyStatus, setAuthUrlCopyStatus] = useState('idle'); - const [isAuthPanelHidden, setIsAuthPanelHidden] = useState(false); - - const displayAuthUrl = useMemo( - () => resolveAuthUrlForDisplay(initialCommand, authUrl), - [authUrl, initialCommand], - ); - - // Keep auth panel UI state local to minimal mode and reset it when connection/url changes. - useEffect(() => { - setAuthUrlCopyStatus('idle'); - setIsAuthPanelHidden(false); - }, [authUrlVersion, displayAuthUrl, isConnected]); - - const hasAuthUrl = Boolean(displayAuthUrl); - const showMobileAuthPanel = hasAuthUrl && !isAuthPanelHidden; - const showMobileAuthPanelToggle = hasAuthUrl && isAuthPanelHidden; - return (
- - {showMobileAuthPanel && ( -
-
-
-

Open or copy the login URL:

- -
- - event.currentTarget.select()} - className="w-full rounded border border-gray-600 bg-gray-800 px-2 py-1 text-xs text-gray-100 focus:outline-none focus:ring-1 focus:ring-blue-500" - aria-label="Authentication URL" - /> - -
- - - -
-
-
- )} - - {showMobileAuthPanelToggle && ( -
- -
- )}
); }