File size: 1,891 Bytes
7e3630c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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 };