mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-05-02 16:04:38 -07:00
feat(infra) - Add logging for when user tries to exit multiple times (#11218)
Co-authored-by: gemini-cli-robot <gemini-cli-robot@google.com>
This commit is contained in:
@@ -41,6 +41,7 @@ import {
|
||||
getAllGeminiMdFilenames,
|
||||
AuthType,
|
||||
clearCachedCredentialFile,
|
||||
recordExitFail,
|
||||
ShellExecutionService,
|
||||
debugLogger,
|
||||
} from '@google/gemini-cli-core';
|
||||
@@ -798,9 +799,9 @@ Logging in with Google... Please restart Gemini CLI to continue.
|
||||
const [showFullTodos, setShowFullTodos] = useState<boolean>(false);
|
||||
const [renderMarkdown, setRenderMarkdown] = useState<boolean>(true);
|
||||
|
||||
const [ctrlCPressedOnce, setCtrlCPressedOnce] = useState(false);
|
||||
const [ctrlCPressCount, setCtrlCPressCount] = useState(0);
|
||||
const ctrlCTimerRef = useRef<NodeJS.Timeout | null>(null);
|
||||
const [ctrlDPressedOnce, setCtrlDPressedOnce] = useState(false);
|
||||
const [ctrlDPressCount, setCtrlDPressCount] = useState(0);
|
||||
const ctrlDTimerRef = useRef<NodeJS.Timeout | null>(null);
|
||||
const [constrainHeight, setConstrainHeight] = useState<boolean>(true);
|
||||
const [ideContextState, setIdeContextState] = useState<
|
||||
@@ -878,6 +879,42 @@ Logging in with Google... Please restart Gemini CLI to continue.
|
||||
};
|
||||
}, [handleNewMessage]);
|
||||
|
||||
useEffect(() => {
|
||||
if (ctrlCTimerRef.current) {
|
||||
clearTimeout(ctrlCTimerRef.current);
|
||||
ctrlCTimerRef.current = null;
|
||||
}
|
||||
if (ctrlCPressCount > 2) {
|
||||
recordExitFail(config);
|
||||
}
|
||||
if (ctrlCPressCount > 1) {
|
||||
handleSlashCommand('/quit');
|
||||
} else {
|
||||
ctrlCTimerRef.current = setTimeout(() => {
|
||||
setCtrlCPressCount(0);
|
||||
ctrlCTimerRef.current = null;
|
||||
}, CTRL_EXIT_PROMPT_DURATION_MS);
|
||||
}
|
||||
}, [ctrlCPressCount, config, setCtrlCPressCount, handleSlashCommand]);
|
||||
|
||||
useEffect(() => {
|
||||
if (ctrlDTimerRef.current) {
|
||||
clearTimeout(ctrlDTimerRef.current);
|
||||
ctrlCTimerRef.current = null;
|
||||
}
|
||||
if (ctrlDPressCount > 2) {
|
||||
recordExitFail(config);
|
||||
}
|
||||
if (ctrlDPressCount > 1) {
|
||||
handleSlashCommand('/quit');
|
||||
} else {
|
||||
ctrlDTimerRef.current = setTimeout(() => {
|
||||
setCtrlDPressCount(0);
|
||||
ctrlDTimerRef.current = null;
|
||||
}, CTRL_EXIT_PROMPT_DURATION_MS);
|
||||
}
|
||||
}, [ctrlDPressCount, config, setCtrlDPressCount, handleSlashCommand]);
|
||||
|
||||
const handleEscapePromptChange = useCallback((showPrompt: boolean) => {
|
||||
setShowEscapePrompt(showPrompt);
|
||||
}, []);
|
||||
@@ -908,28 +945,6 @@ Logging in with Google... Please restart Gemini CLI to continue.
|
||||
settings.merged.ui?.customWittyPhrases,
|
||||
);
|
||||
|
||||
const handleExit = useCallback(
|
||||
(
|
||||
pressedOnce: boolean,
|
||||
setPressedOnce: (value: boolean) => void,
|
||||
timerRef: React.MutableRefObject<NodeJS.Timeout | null>,
|
||||
) => {
|
||||
if (pressedOnce) {
|
||||
if (timerRef.current) {
|
||||
clearTimeout(timerRef.current);
|
||||
}
|
||||
handleSlashCommand('/quit');
|
||||
} else {
|
||||
setPressedOnce(true);
|
||||
timerRef.current = setTimeout(() => {
|
||||
setPressedOnce(false);
|
||||
timerRef.current = null;
|
||||
}, CTRL_EXIT_PROMPT_DURATION_MS);
|
||||
}
|
||||
},
|
||||
[handleSlashCommand],
|
||||
);
|
||||
|
||||
const handleGlobalKeypress = useCallback(
|
||||
(key: Key) => {
|
||||
// Debug log keystrokes if enabled
|
||||
@@ -938,26 +953,17 @@ Logging in with Google... Please restart Gemini CLI to continue.
|
||||
}
|
||||
|
||||
if (keyMatchers[Command.QUIT](key)) {
|
||||
if (!ctrlCPressedOnce) {
|
||||
cancelOngoingRequest?.();
|
||||
}
|
||||
// If the user presses Ctrl+C, we want to cancel any ongoing requests.
|
||||
// This should happen regardless of the count.
|
||||
cancelOngoingRequest?.();
|
||||
|
||||
if (!ctrlCPressedOnce) {
|
||||
setCtrlCPressedOnce(true);
|
||||
ctrlCTimerRef.current = setTimeout(() => {
|
||||
setCtrlCPressedOnce(false);
|
||||
ctrlCTimerRef.current = null;
|
||||
}, CTRL_EXIT_PROMPT_DURATION_MS);
|
||||
return;
|
||||
}
|
||||
|
||||
handleExit(ctrlCPressedOnce, setCtrlCPressedOnce, ctrlCTimerRef);
|
||||
setCtrlCPressCount((prev) => prev + 1);
|
||||
return;
|
||||
} else if (keyMatchers[Command.EXIT](key)) {
|
||||
if (buffer.text.length > 0) {
|
||||
return;
|
||||
}
|
||||
handleExit(ctrlDPressedOnce, setCtrlDPressedOnce, ctrlDTimerRef);
|
||||
setCtrlDPressCount((prev) => prev + 1);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1001,14 +1007,9 @@ Logging in with Google... Please restart Gemini CLI to continue.
|
||||
setShowErrorDetails,
|
||||
config,
|
||||
ideContextState,
|
||||
handleExit,
|
||||
ctrlCPressedOnce,
|
||||
setCtrlCPressedOnce,
|
||||
ctrlCTimerRef,
|
||||
setCtrlCPressCount,
|
||||
buffer.text.length,
|
||||
ctrlDPressedOnce,
|
||||
setCtrlDPressedOnce,
|
||||
ctrlDTimerRef,
|
||||
setCtrlDPressCount,
|
||||
handleSlashCommand,
|
||||
cancelOngoingRequest,
|
||||
activePtyId,
|
||||
@@ -1143,8 +1144,8 @@ Logging in with Google... Please restart Gemini CLI to continue.
|
||||
filteredConsoleMessages,
|
||||
ideContextState,
|
||||
renderMarkdown,
|
||||
ctrlCPressedOnce,
|
||||
ctrlDPressedOnce,
|
||||
ctrlCPressedOnce: ctrlCPressCount >= 1,
|
||||
ctrlDPressedOnce: ctrlDPressCount >= 1,
|
||||
showEscapePrompt,
|
||||
isFocused,
|
||||
elapsedTime,
|
||||
@@ -1224,8 +1225,8 @@ Logging in with Google... Please restart Gemini CLI to continue.
|
||||
filteredConsoleMessages,
|
||||
ideContextState,
|
||||
renderMarkdown,
|
||||
ctrlCPressedOnce,
|
||||
ctrlDPressedOnce,
|
||||
ctrlCPressCount,
|
||||
ctrlDPressCount,
|
||||
showEscapePrompt,
|
||||
isFocused,
|
||||
elapsedTime,
|
||||
|
||||
Reference in New Issue
Block a user