Skip to content

Commit 95f2500

Browse files
committed
[codecane] Disable OSC 10/11 terminal color detection
1 parent ad2b663 commit 95f2500

File tree

2 files changed

+139
-133
lines changed

2 files changed

+139
-133
lines changed

cli/src/utils/terminal-color-detection.ts

Lines changed: 125 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -78,99 +78,101 @@ function buildOscQuery(oscCode: number): string {
7878
export async function queryTerminalOSC(
7979
oscCode: number,
8080
): Promise<string | null> {
81-
return new Promise((resolve) => {
82-
const ttyPath = process.platform === 'win32' ? 'CON' : '/dev/tty'
83-
84-
let ttyReadFd: number | null = null
85-
let ttyWriteFd: number | null = null
86-
let timeout: NodeJS.Timeout | null = null
87-
let readStream: Readable | null = null
88-
89-
const cleanup = () => {
90-
if (timeout) {
91-
clearTimeout(timeout)
92-
timeout = null
93-
}
94-
if (readStream) {
95-
readStream.removeAllListeners()
96-
readStream.destroy()
97-
readStream = null
98-
}
99-
if (ttyWriteFd !== null) {
100-
try {
101-
closeSync(ttyWriteFd)
102-
} catch {
103-
// Ignore close errors
104-
}
105-
ttyWriteFd = null
106-
}
107-
// ttyReadFd is managed by the stream, so we don't close it separately
108-
}
109-
110-
try {
111-
// Open TTY for reading and writing
112-
try {
113-
ttyReadFd = openSync(ttyPath, 'r')
114-
ttyWriteFd = openSync(ttyPath, 'w')
115-
} catch {
116-
// Not in a TTY environment
117-
resolve(null)
118-
return
119-
}
120-
121-
// Set timeout for terminal response
122-
timeout = setTimeout(() => {
123-
cleanup()
124-
resolve(null)
125-
}, 1000) // 1 second timeout
126-
127-
// Create read stream to capture response
128-
readStream = createReadStream(ttyPath, {
129-
fd: ttyReadFd,
130-
encoding: 'utf8',
131-
autoClose: true,
132-
})
133-
134-
let response = ''
135-
136-
readStream.on('data', (chunk: Buffer | string) => {
137-
response += chunk.toString()
138-
139-
// Check for complete response
140-
const hasBEL = response.includes('\x07')
141-
const hasST = response.includes('\x1b\\')
142-
const hasRGB =
143-
/rgb:[0-9a-fA-F]{2,4}\/[0-9a-fA-F]{2,4}\/[0-9a-fA-F]{2,4}/.test(
144-
response,
145-
)
146-
147-
if (hasBEL || hasST || hasRGB) {
148-
cleanup()
149-
resolve(response)
150-
}
151-
})
152-
153-
readStream.on('error', () => {
154-
cleanup()
155-
resolve(null)
156-
})
157-
158-
readStream.on('close', () => {
159-
// If stream closes before we get a complete response
160-
if (timeout) {
161-
cleanup()
162-
resolve(null)
163-
}
164-
})
165-
166-
// Send OSC query
167-
const query = buildOscQuery(oscCode)
168-
writeSync(ttyWriteFd, query)
169-
} catch {
170-
cleanup()
171-
resolve(null)
172-
}
173-
})
81+
// OSC 10/11 logic commented out
82+
return null
83+
// return new Promise((resolve) => {
84+
// const ttyPath = process.platform === 'win32' ? 'CON' : '/dev/tty'
85+
86+
// let ttyReadFd: number | null = null
87+
// let ttyWriteFd: number | null = null
88+
// let timeout: NodeJS.Timeout | null = null
89+
// let readStream: Readable | null = null
90+
91+
// const cleanup = () => {
92+
// if (timeout) {
93+
// clearTimeout(timeout)
94+
// timeout = null
95+
// }
96+
// if (readStream) {
97+
// readStream.removeAllListeners()
98+
// readStream.destroy()
99+
// readStream = null
100+
// }
101+
// if (ttyWriteFd !== null) {
102+
// try {
103+
// closeSync(ttyWriteFd)
104+
// } catch {
105+
// // Ignore close errors
106+
// }
107+
// ttyWriteFd = null
108+
// }
109+
// // ttyReadFd is managed by the stream, so we don't close it separately
110+
// }
111+
112+
// try {
113+
// // Open TTY for reading and writing
114+
// try {
115+
// ttyReadFd = openSync(ttyPath, 'r')
116+
// ttyWriteFd = openSync(ttyPath, 'w')
117+
// } catch {
118+
// // Not in a TTY environment
119+
// resolve(null)
120+
// return
121+
// }
122+
123+
// // Set timeout for terminal response
124+
// timeout = setTimeout(() => {
125+
// cleanup()
126+
// resolve(null)
127+
// }, 1000) // 1 second timeout
128+
129+
// // Create read stream to capture response
130+
// readStream = createReadStream(ttyPath, {
131+
// fd: ttyReadFd,
132+
// encoding: 'utf8',
133+
// autoClose: true,
134+
// })
135+
136+
// let response = ''
137+
138+
// readStream.on('data', (chunk: Buffer | string) => {
139+
// response += chunk.toString()
140+
141+
// // Check for complete response
142+
// const hasBEL = response.includes('\x07')
143+
// const hasST = response.includes('\x1b\\')
144+
// const hasRGB =
145+
// /rgb:[0-9a-fA-F]{2,4}\/[0-9a-fA-F]{2,4}\/[0-9a-fA-F]{2,4}/.test(
146+
// response,
147+
// )
148+
149+
// if (hasBEL || hasST || hasRGB) {
150+
// cleanup()
151+
// resolve(response)
152+
// }
153+
// })
154+
155+
// readStream.on('error', () => {
156+
// cleanup()
157+
// resolve(null)
158+
// })
159+
160+
// readStream.on('close', () => {
161+
// // If stream closes before we get a complete response
162+
// if (timeout) {
163+
// cleanup()
164+
// resolve(null)
165+
// }
166+
// })
167+
168+
// // Send OSC query
169+
// const query = buildOscQuery(oscCode)
170+
// writeSync(ttyWriteFd, query)
171+
// } catch {
172+
// cleanup()
173+
// resolve(null)
174+
// }
175+
// })
174176
}
175177

176178
/**
@@ -252,33 +254,35 @@ export function themeFromFgColor(rgb: [number, number, number]): 'dark' | 'light
252254
* @returns 'dark', 'light', or null if detection failed
253255
*/
254256
export async function detectTerminalTheme(): Promise<'dark' | 'light' | null> {
255-
// Check if terminal supports OSC
256-
if (!terminalSupportsOSC()) {
257-
return null
258-
}
259-
260-
try {
261-
// Try background color first (OSC 11) - more reliable
262-
const bgResponse = await queryTerminalOSC(11)
263-
if (bgResponse) {
264-
const bgRgb = parseOSCResponse(bgResponse)
265-
if (bgRgb) {
266-
return themeFromBgColor(bgRgb)
267-
}
268-
}
269-
270-
// Fallback to foreground color (OSC 10)
271-
const fgResponse = await queryTerminalOSC(10)
272-
if (fgResponse) {
273-
const fgRgb = parseOSCResponse(fgResponse)
274-
if (fgRgb) {
275-
return themeFromFgColor(fgRgb)
276-
}
277-
}
278-
279-
return null // Detection failed
280-
} catch {
281-
return null
282-
}
257+
// OSC 10/11 logic commented out
258+
return null
259+
// // Check if terminal supports OSC
260+
// if (!terminalSupportsOSC()) {
261+
// return null
262+
// }
263+
264+
// try {
265+
// // Try background color first (OSC 11) - more reliable
266+
// const bgResponse = await queryTerminalOSC(11)
267+
// if (bgResponse) {
268+
// const bgRgb = parseOSCResponse(bgResponse)
269+
// if (bgRgb) {
270+
// return themeFromBgColor(bgRgb)
271+
// }
272+
// }
273+
274+
// // Fallback to foreground color (OSC 10)
275+
// const fgResponse = await queryTerminalOSC(10)
276+
// if (fgResponse) {
277+
// const fgRgb = parseOSCResponse(fgResponse)
278+
// if (fgRgb) {
279+
// return themeFromFgColor(fgRgb)
280+
// }
281+
// }
282+
283+
// return null // Detection failed
284+
// } catch {
285+
// return null
286+
// }
283287
}
284288

cli/src/utils/theme-system.ts

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -737,9 +737,10 @@ export const detectSystemTheme = (): ThemeName => {
737737
return ideTheme
738738
}
739739

740-
if (oscDetectedTheme) {
741-
return oscDetectedTheme
742-
}
740+
// OSC 10/11 logic commented out
741+
// if (oscDetectedTheme) {
742+
// return oscDetectedTheme
743+
// }
743744

744745
return detectPlatformTheme()
745746
}
@@ -1105,13 +1106,14 @@ process.on('SIGUSR2', () => {
11051106
* Initialize OSC theme detection with a one-time check
11061107
*/
11071108
export async function initializeOSCDetection(): Promise<void> {
1108-
try {
1109-
// Run one-time detection
1110-
const theme = await detectTerminalTheme()
1111-
if (theme) {
1112-
oscDetectedTheme = theme
1113-
}
1114-
} catch {
1115-
// Silently ignore OSC detection errors
1116-
}
1109+
// OSC 10/11 logic commented out
1110+
// try {
1111+
// // Run one-time detection
1112+
// const theme = await detectTerminalTheme()
1113+
// if (theme) {
1114+
// oscDetectedTheme = theme
1115+
// }
1116+
// } catch {
1117+
// // Silently ignore OSC detection errors
1118+
// }
11171119
}

0 commit comments

Comments
 (0)