fix(tui): provide the JetBrains terminal capabilities (#5037)

This commit is contained in:
Sviatoslav Abakumov
2026-05-27 14:20:44 +04:00
committed by GitHub
parent b62776e4a2
commit 4bbe2959bd
2 changed files with 15 additions and 0 deletions

View File

@@ -41,6 +41,7 @@ export function setCellDimensions(dims: CellDimensions): void {
export function detectCapabilities(): TerminalCapabilities {
const termProgram = process.env.TERM_PROGRAM?.toLowerCase() || "";
const terminalEmulator = process.env.TERMINAL_EMULATOR?.toLowerCase() || "";
const term = process.env.TERM?.toLowerCase() || "";
const colorTerm = process.env.COLORTERM?.toLowerCase() || "";
const hasTrueColorHint = colorTerm === "truecolor" || colorTerm === "24bit";
@@ -82,6 +83,10 @@ export function detectCapabilities(): TerminalCapabilities {
return { images: null, trueColor: true, hyperlinks: true };
}
if (terminalEmulator === "jetbrains-jediterm") {
return { images: null, trueColor: true, hyperlinks: false };
}
// Unknown terminal: be conservative. OSC 8 is rendered invisibly as "just
// text" on terminals that swallow it, which means the URL disappears from
// the rendered output. Default to the legacy `text (url)` behavior unless we

View File

@@ -21,6 +21,7 @@ import {
const ENV_KEYS = [
"TERM",
"TERM_PROGRAM",
"TERMINAL_EMULATOR",
"COLORTERM",
"TMUX",
"KITTY_WINDOW_ID",
@@ -282,6 +283,15 @@ describe("detectCapabilities", () => {
});
});
it("enables truecolor without hyperlinks for JetBrains terminal", () => {
withEnv({ TERMINAL_EMULATOR: "JetBrains-JediTerm", TERM: "xterm-256color" }, () => {
const caps = detectCapabilities();
assert.strictEqual(caps.trueColor, true);
assert.strictEqual(caps.hyperlinks, false);
assert.strictEqual(caps.images, null);
});
});
it("does not inherit Windows Terminal truecolor through tmux", () => {
withEnv({ WT_SESSION: "session", TMUX: "/tmp/tmux-1000/default,1234,0", TERM: "tmux-256color" }, () => {
const caps = detectCapabilities();