Merge pull request #17701 from NousResearch/bb/mouse-mode-self-heal

fix(cli): recover leaked mouse tracking terminal state
This commit is contained in:
brooklyn!
2026-04-30 10:09:39 -07:00
committed by GitHub
5 changed files with 210 additions and 10 deletions

View File

@@ -9,12 +9,17 @@ import { GatewayClient } from './gatewayClient.js'
import { setupGracefulExit } from './lib/gracefulExit.js'
import { formatBytes, type HeapDumpResult, performHeapDump } from './lib/memory.js'
import { type MemorySnapshot, startMemoryMonitor } from './lib/memoryMonitor.js'
import { resetTerminalModes } from './lib/terminalModes.js'
if (!process.stdin.isTTY) {
console.log('hermes-tui: no TTY')
process.exit(0)
}
// Start from a clean slate. If a previous TUI crashed or was kill -9'd, the
// terminal tab can still have mouse/focus/paste modes enabled.
resetTerminalModes()
const gw = new GatewayClient()
gw.start()
@@ -23,17 +28,27 @@ const dumpNotice = (snap: MemorySnapshot, dump: HeapDumpResult | null) =>
`hermes-tui: ${snap.level} memory (${formatBytes(snap.heapUsed)}) — auto heap dump → ${dump?.heapPath ?? '(failed)'}\n`
setupGracefulExit({
cleanups: [() => gw.kill()],
cleanups: [
() => {
resetTerminalModes()
return gw.kill()
}
],
onError: (scope, err) => {
const message = err instanceof Error ? `${err.name}: ${err.message}` : String(err)
process.stderr.write(`hermes-tui ${scope}: ${message.slice(0, 2000)}\n`)
},
onSignal: signal => process.stderr.write(`hermes-tui: received ${signal}\n`)
onSignal: signal => {
resetTerminalModes()
process.stderr.write(`hermes-tui: received ${signal}\n`)
}
})
const stopMemoryMonitor = startMemoryMonitor({
onCritical: (snap, dump) => {
resetTerminalModes()
process.stderr.write(dumpNotice(snap, dump))
process.stderr.write('hermes-tui: exiting to avoid OOM; restart to recover\n')
process.exit(137)