From 89ee69e4430b21ee14565abf5c34dae43f38c1d8 Mon Sep 17 00:00:00 2001 From: Shubh Date: Sat, 5 Sep 2026 07:04:11 +0530 Subject: [PATCH] fix(server): advertise truecolor in the integrated terminal (#7680) Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com> --- apps/server/src/terminal/Manager.test.ts | 25 ++++++++++++++++++++++++ apps/server/src/terminal/Manager.ts | 4 ++++ 2 files changed, 29 insertions(+) diff --git a/apps/server/src/terminal/Manager.test.ts b/apps/server/src/terminal/Manager.test.ts index c99b5a0004387956981720091d276d2aa153cdae..deea39631788d954eaa56403f970567ca9f6f4fc 100644 --- a/apps/server/src/terminal/Manager.test.ts +++ b/apps/server/src/terminal/Manager.test.ts @@ -1687,6 +1687,31 @@ it.layer( }), ); + it.effect.each(["linux", "darwin", "win32"] as const)( + "advertises truecolor before the PTY backend on %s without replacing explicit values", + (platform) => + Effect.gen(function* () { + for (const [parentColor, runtimeColor, expected] of [ + [undefined, undefined, "truecolor"], + ["", undefined, "truecolor"], + ["24bit", undefined, "24bit"], + ["24bit", "", "truecolor"], + ["24bit", "custom", "custom"], + ] as const) { + const env = Object.freeze({ COLORTERM: parentColor }); + const { manager, ptyAdapter } = yield* createManager(5, { + shellResolver: () => "/bin/sh", + env, + }).pipe(Effect.provide(withHostPlatform(platform))); + yield* manager.open( + openInput({ env: runtimeColor === undefined ? {} : { COLORTERM: runtimeColor } }), + ); + expect(ptyAdapter.spawnInputs[0]?.env.COLORTERM).toBe(expected); + expect(env.COLORTERM).toBe(parentColor); + } + }), + ); + it.effect("filters app runtime env variables from terminal sessions", () => Effect.gen(function* () { const { manager, ptyAdapter } = yield* createManager(5, { diff --git a/apps/server/src/terminal/Manager.ts b/apps/server/src/terminal/Manager.ts index fcfdc2bb26cc1c17b37e065c77a4a72a6ccd360f..f04e3c2d897bdfe00ed4574b47293390769b86a9 100644 --- a/apps/server/src/terminal/Manager.ts +++ b/apps/server/src/terminal/Manager.ts @@ -1270,6 +1270,10 @@ function createTerminalSpawnEnv( spawnEnv[key] = value; } } + // Both PTY backends feed truecolor-capable terminal clients. + if (spawnEnv.COLORTERM === undefined || spawnEnv.COLORTERM === "") { + spawnEnv.COLORTERM = "truecolor"; + } return stripAppImageRuntimeEnv(spawnEnv); } -- 2.54.0