From d47f919ef10a25e65ee35cd791d80f5852cef9bb Mon Sep 17 00:00:00 2001 From: kyssta-exe Date: Sat, 6 Jun 2026 15:20:06 +0000 Subject: [PATCH] fix(cli): skip lazy-dep prompt when prompt_toolkit owns terminal (#40490) --- tools/lazy_deps.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/tools/lazy_deps.py b/tools/lazy_deps.py index 5b5878eb451..02e3038d4d3 100644 --- a/tools/lazy_deps.py +++ b/tools/lazy_deps.py @@ -456,7 +456,23 @@ def ensure(feature: str, *, prompt: bool = True) -> None: "lazy installs disabled (security.allow_lazy_installs=false)" ) - if prompt and sys.stdin.isatty() and sys.stdout.isatty(): + # Only show the interactive confirmation when we own a TTY and + # prompt_toolkit isn't running. A bare input() deadlocks when a + # prompt_toolkit app owns the terminal because keystrokes route to + # its event loop rather than stdin, so the prompt blocks forever. + # Under the TUI we skip the prompt and proceed — lazy installs are + # gated by security.allow_lazy_installs, so reaching here is + # already user opt-in. + _pt_active = False + if "prompt_toolkit.application.current" in sys.modules: + try: + from prompt_toolkit.application.current import get_app_or_none + _app = get_app_or_none() + _pt_active = _app is not None and getattr(_app, "is_running", False) + except Exception: + _pt_active = False + + if prompt and not _pt_active and sys.stdin.isatty() and sys.stdout.isatty(): spec_list = ", ".join(missing) try: answer = input(