diff --git a/packages/tui/src/terminal-image.ts b/packages/tui/src/terminal-image.ts index 64703bf48..c1f682dff 100644 --- a/packages/tui/src/terminal-image.ts +++ b/packages/tui/src/terminal-image.ts @@ -128,7 +128,10 @@ function detectCapabilitiesFromEnvironment(tmuxForwardsHyperlink: () => boolean) return { images: null, trueColor: true, hyperlinks: true }; } - if (termProgram === "alacritty" || termProgram === "vscode" || termProgram === "zed") { + // Alacritty does not set TERM_PROGRAM. It sets TERM=alacritty when its terminfo entry is + // installed (otherwise xterm-256color) and ALACRITTY_WINDOW_ID on Unix and macOS. + const isAlacritty = termProgram === "alacritty" || term.startsWith("alacritty") || process.env.ALACRITTY_WINDOW_ID; + if (isAlacritty || termProgram === "vscode" || termProgram === "zed") { return { images: null, trueColor: true, hyperlinks: true }; } diff --git a/packages/tui/test/terminal-image.test.ts b/packages/tui/test/terminal-image.test.ts index 0ae5bd8b4..2a96f78d2 100644 --- a/packages/tui/test/terminal-image.test.ts +++ b/packages/tui/test/terminal-image.test.ts @@ -43,6 +43,7 @@ const ENV_KEYS = [ "WEZTERM_PANE", "ITERM_SESSION_ID", "WT_SESSION", + "ALACRITTY_WINDOW_ID", "CMUX_WORKSPACE_ID", "WARP_SESSION_ID", "WARP_TERMINAL_SESSION_UUID", @@ -445,6 +446,15 @@ describe("detectCapabilities", () => { }); }); + it("enables hyperlinks for Alacritty without TERM_PROGRAM", () => { + withEnv({ TERM: "alacritty", COLORTERM: "truecolor" }, () => { + assert.deepStrictEqual(detectCapabilities(), { images: null, trueColor: true, hyperlinks: true }); + }); + withEnv({ TERM: "xterm-256color", COLORTERM: "truecolor", ALACRITTY_WINDOW_ID: "1" }, () => { + assert.deepStrictEqual(detectCapabilities(), { images: null, trueColor: true, hyperlinks: true }); + }); + }); + it("enables Alacritty capabilities for Zed", () => { withEnv({ TERM_PROGRAM: "zed" }, () => { assert.deepStrictEqual(detectCapabilities(), { images: null, trueColor: true, hyperlinks: true });