Files
hermes-agent/ui-tui/src/lib/terminalParity.ts
Brooklyn Nicholson fc6a27098e fix(tui): raise picker selection contrast with inverse + bold
Selected rows in the model/session/skills pickers and approval/clarify
prompts only changed from dim gray to cornsilk, which reads as low
contrast on lighter themes and LCDs (reported during TUI v2 blitz).

Switch the selected row to `inverse bold` with the brand accent color
across modelPicker, sessionPicker, skillsHub, and prompts so the
highlight is terminal-portable and unambiguous. Unselected rows stay
dim. Also extends the sessionPicker middle meta column (which was
always dim) to inherit the row's selection state.
2026-04-21 14:31:21 -05:00

79 lines
2.1 KiB
TypeScript

import {
detectVSCodeLikeTerminal,
type FileOps,
isRemoteShellSession,
shouldPromptForTerminalSetup
} from './terminalSetup.js'
export type MacTerminalHint = {
key: string
message: string
tone: 'info' | 'warn'
}
export type MacTerminalContext = {
isAppleTerminal: boolean
isRemote: boolean
isTmux: boolean
vscodeLike: null | 'cursor' | 'vscode' | 'windsurf'
}
export function detectMacTerminalContext(env: NodeJS.ProcessEnv = process.env): MacTerminalContext {
const termProgram = env['TERM_PROGRAM'] ?? ''
return {
isAppleTerminal: termProgram === 'Apple_Terminal' || !!env['TERM_SESSION_ID'],
isRemote: isRemoteShellSession(env),
isTmux: !!env['TMUX'],
vscodeLike: detectVSCodeLikeTerminal(env)
}
}
export async function terminalParityHints(
env: NodeJS.ProcessEnv = process.env,
options?: { fileOps?: Partial<FileOps>; homeDir?: string }
): Promise<MacTerminalHint[]> {
const ctx = detectMacTerminalContext(env)
const hints: MacTerminalHint[] = []
if (
ctx.vscodeLike &&
(await shouldPromptForTerminalSetup({ env, fileOps: options?.fileOps, homeDir: options?.homeDir }))
) {
hints.push({
key: 'ide-setup',
tone: 'info',
message: `Detected ${ctx.vscodeLike} terminal · run /terminal-setup for best Cmd+Enter / undo parity`
})
}
if (ctx.isAppleTerminal) {
hints.push({
key: 'apple-terminal',
tone: 'warn',
message:
'Apple Terminal detected · use /paste for image-only clipboard fallback, and try Ctrl+A / Ctrl+E / Ctrl+U if Cmd+←/→/⌫ gets rewritten'
})
}
if (ctx.isTmux) {
hints.push({
key: 'tmux',
tone: 'warn',
message:
'tmux detected · clipboard copy/paste uses passthrough when available; allow-passthrough improves OSC52 reliability'
})
}
if (ctx.isRemote) {
hints.push({
key: 'remote',
tone: 'warn',
message:
'SSH session detected · text clipboard can bridge via OSC52, but image clipboard and local screenshot paths still depend on the machine running Hermes'
})
}
return hints
}