Преглед изворни кода

fix(tui): use 16-color ANSI names for Terminal.app

Terminal.app's CoreGraphics crashes with 24-bit RGB escape sequences
(\x1b[38;2;r;g;b;m) combined with CJK text. Use basic ANSI color
names (cyan, yellow, white, etc.) which map to safe 16-color codes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
fanghanjun пре 7 месеци
родитељ
комит
f4f3d5d3fb
1 измењених фајлова са 37 додато и 2 уклоњено
  1. 37 2
      packages/cli/src/tui/theme.ts

+ 37 - 2
packages/cli/src/tui/theme.ts

@@ -80,9 +80,44 @@ const lightPalette: ThemePalette = {
   roleSystem: "#5c4a80",
   roleSystem: "#5c4a80",
 };
 };
 
 
-const palette = detectTerminalTheme() === "light" ? lightPalette : darkPalette;
+// Terminal.app: use basic 16-color ANSI names to avoid 24-bit escape sequences
+// that can trigger CoreGraphics crashes with CJK text.
+const appleTerminalDarkPalette: ThemePalette = {
+  warmAccent: "yellow",
+  warmMuted: "gray",
+  warmReply: "cyan",
+  warmBorder: "gray",
+  statusSuccess: "green",
+  statusError: "red",
+  statusActive: "yellow",
+  statusIdle: "gray",
+  roleUser: "white",
+  roleSystem: "magenta",
+};
+
+const appleTerminalLightPalette: ThemePalette = {
+  warmAccent: "yellow",
+  warmMuted: "gray",
+  warmReply: "blue",
+  warmBorder: "gray",
+  statusSuccess: "green",
+  statusError: "red",
+  statusActive: "yellow",
+  statusIdle: "gray",
+  roleUser: "black",
+  roleSystem: "magenta",
+};
+
+function resolvePalette(): ThemePalette {
+  const theme = detectTerminalTheme();
+  if (isAppleTerminal) {
+    return theme === "light" ? appleTerminalLightPalette : appleTerminalDarkPalette;
+  }
+  return theme === "light" ? lightPalette : darkPalette;
+}
+
+const palette = resolvePalette();
 
 
-// Named exports for backward compatibility
 export const WARM_ACCENT = palette.warmAccent;
 export const WARM_ACCENT = palette.warmAccent;
 export const WARM_MUTED = palette.warmMuted;
 export const WARM_MUTED = palette.warmMuted;
 export const WARM_REPLY = palette.warmReply;
 export const WARM_REPLY = palette.warmReply;