7ace8f735a
useStdin().setRawMode(false) on a non-TTY stdin silently no-opped while setRawMode(true) threw — an asymmetry. Ink's handleSetRawMode throws before the enable/disable split (App.tsx:315), so both directions throw on an unsupported stdin, and its test asserts both mount-enable and unmount-disable throw without ever calling stdin.setRawMode. Move the isRawModeSupported guard into the public setRawMode wrapper (via a shared throwRawModeUnsupported helper reusing the existing messages) so both true/false throw. Internal acquireRawMode/releaseRawMode are unchanged — composables (useInput/useFocus/usePaste) call those directly, so teardown release stays a no-op and an unsupported-stdin app still unmounts cleanly. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>