| import type { TerminalInfo } from "../InkPictureProvider.js"; | |
| // Heuristic for selecting the best image protocol based on terminal capabilities | |
| function getBestProtocol( | |
| caps: TerminalInfo, | |
| ): "sixel" | "kitty" | "iterm2" | "braille" | "halfBlock" | "ascii" { | |
| if (process.env.TERM_PROGRAM === "iTerm.app" && caps.supportsITerm2Graphics) { | |
| // Testing has shown that iTerm2 might be adding kitty support in stealth but it's not mature yet | |
| return "iterm2"; | |
| } else if ( | |
| process.env.TERM_PROGRAM === "WarpTerminal" && | |
| caps.supportsITerm2Graphics | |
| ) { | |
| // Warp terminal only supports a incomplete subset of kitty graphics so we are not using it for now | |
| return "iterm2"; | |
| } else if ( | |
| process.env.TERM_PROGRAM === "WezTerm" && | |
| caps.supportsITerm2Graphics | |
| ) { | |
| // WezTerm doesn't support placing image above text so it may introduce race conditions during rerenders like sixel and iterm2 | |
| // See https://github.com/wezterm/wezterm/issues/7222 | |
| // a workaround is implemented for sixel and iterm2 to mitigate race conditions but I don't think it's a good idea to do the same for kitty specifically for wezterm | |
| return "iterm2"; | |
| } else if (process.env.KONSOLE_VERSION && caps.supportsKittyGraphics) { | |
| // Kitty is the only properly working protocol out of the three on Konsole | |
| // because it has non-standard implementation for overwriting cells containing graphics with text which makes sixel and iterm2 leave artifacts | |
| return "kitty"; | |
| } else if (caps.supportsKittyGraphics) { | |
| return "kitty"; | |
| } else if (caps.supportsITerm2Graphics) { | |
| return "iterm2"; | |
| } else if (caps.supportsSixelGraphics) { | |
| return "sixel"; | |
| } else if (caps.supportsUnicode && caps.supportsColor) { | |
| return "halfBlock"; | |
| } else if (caps.supportsUnicode) { | |
| return "braille"; | |
| } else { | |
| return "ascii"; | |
| } | |
| } | |
| export { getBestProtocol }; | |