Files
mistral-vibe/vibe/cli/terminal_detect.py
Clément Sirieix 04305bd77c v2.8.0 (#616)
Co-authored-by: Kim-Adeline Miguel <51720070+kimadeline@users.noreply.github.com>
Co-authored-by: Mathias Gesbert <mathias.gesbert@mistral.ai>
Co-authored-by: Michel Thomazo <51709227+michelTho@users.noreply.github.com>
Co-authored-by: Pierre Rossinès <pierre.rossines@mistral.ai>
Co-authored-by: Mistral Vibe <vibe@mistral.ai>
2026-04-21 15:19:59 +02:00

84 lines
2.2 KiB
Python

from __future__ import annotations
from enum import Enum
import os
from typing import Literal
class Terminal(Enum):
VSCODE = "vscode"
VSCODE_INSIDERS = "vscode_insiders"
CURSOR = "cursor"
JETBRAINS = "jetbrains"
ITERM2 = "iterm2"
WEZTERM = "wezterm"
GHOSTTY = "ghostty"
ALACRITTY = "alacritty"
KITTY = "kitty"
HYPER = "hyper"
WINDOWS_TERMINAL = "windows_terminal"
UNKNOWN = "unknown"
def _is_cursor() -> bool:
path_indicators = [
"VSCODE_GIT_ASKPASS_NODE",
"VSCODE_GIT_ASKPASS_MAIN",
"VSCODE_IPC_HOOK_CLI",
"VSCODE_NLS_CONFIG",
]
for var in path_indicators:
val = os.environ.get(var, "").lower()
if "cursor" in val:
return True
return False
def _detect_vscode_terminal() -> Literal[Terminal.VSCODE, Terminal.VSCODE_INSIDERS]:
term_version = os.environ.get("TERM_PROGRAM_VERSION", "").lower()
if term_version.endswith("-insider"):
return Terminal.VSCODE_INSIDERS
return Terminal.VSCODE
def _detect_terminal_from_env() -> Terminal | None:
env_markers: dict[str, Terminal] = {
"WEZTERM_PANE": Terminal.WEZTERM,
"GHOSTTY_RESOURCES_DIR": Terminal.GHOSTTY,
"KITTY_WINDOW_ID": Terminal.KITTY,
"ALACRITTY_SOCKET": Terminal.ALACRITTY,
"ALACRITTY_LOG": Terminal.ALACRITTY,
"WT_SESSION": Terminal.WINDOWS_TERMINAL,
}
for var, terminal in env_markers.items():
if os.environ.get(var):
return terminal
if "jetbrains" in os.environ.get("TERMINAL_EMULATOR", "").lower():
return Terminal.JETBRAINS
return None
def detect_terminal() -> Terminal:
term_program = os.environ.get("TERM_PROGRAM", "").lower()
if term_program == "vscode":
if _is_cursor():
return Terminal.CURSOR
return _detect_vscode_terminal()
term_map: dict[str, Terminal] = {
"iterm.app": Terminal.ITERM2,
"wezterm": Terminal.WEZTERM,
"ghostty": Terminal.GHOSTTY,
"alacritty": Terminal.ALACRITTY,
"kitty": Terminal.KITTY,
"hyper": Terminal.HYPER,
}
if term_program in term_map:
return term_map[term_program]
return _detect_terminal_from_env() or Terminal.UNKNOWN