Skip to content

fix: TTY detection for hook subprocesses#19

Open
wasikarn wants to merge 1 commit intowarpdotdev:mainfrom
wasikarn:fix/tty-detection-proven
Open

fix: TTY detection for hook subprocesses#19
wasikarn wants to merge 1 commit intowarpdotdev:mainfrom
wasikarn:fix/tty-detection-proven

Conversation

@wasikarn
Copy link
Copy Markdown

@wasikarn wasikarn commented Apr 15, 2026

Problem

Hook subprocesses spawned by Claude Code lack a controlling terminal, causing OSC 777 notifications to fail silently.

Root Cause

When Claude Code spawns hook scripts (e.g., on Stop events), the subprocess does not have a controlling terminal. Writing to /dev/tty fails with "Device not configured", preventing Warp notifications from being sent.

Evidence:

# Original approach
$ printf '\033]777;notify;Test;Body\007' > /dev/tty
bash: /dev/tty: Device not configured

Impact

  • Warp notifications fail intermittently or not at all
  • Users don't receive "Task completed" notifications when Claude finishes work
  • Breaks the core value proposition of the Warp + Claude Code integration

Solution

Walk the parent process chain to find the actual TTY device that Claude Code is running on.

Changes

  1. TTY Detection: Traverse PPID chain until valid TTY is found
  2. Termination Check: Stop at PID 0/1 to prevent infinite loops
  3. Robust Trimming: Use [[:space:]] to handle spaces and tabs
  4. Safe Fallback: Skip notification if TTY not found (don't write to broken /dev/tty)

Key Implementation Details

# Read TTY and PPID in one ps call
read -r tty_val ppid_val < <(ps -o tty=,ppid= -p  2>/dev/null)

# Trim all whitespace
tty_val=

# Skip if not found
if [ -n  ] && [ -w  ]; then
    printf '...' > 
fi

Testing

Verified Working

  • Warp Version: v0.2026.04.08.08.36.stable_05
  • OS: macOS (also tested on Linux via CI)
  • All Tests Pass: 43 passed, 0 failed

Test Coverage

  • TTY detection for current shell
  • Parent chain walking (PPID → TTY)
  • Invalid PID handling
  • Platform-agnostic assertions (works with /dev/ttysXXX on macOS and /dev/pts/N on Linux)

Manual Verification

# Before fix: fails silently
# After fix: Warp notification appears in notification center

Checklist

  • Fix tested locally with Warp stable
  • All existing tests pass (43/43)
  • New tests added for TTY detection logic
  • Tests match production code exactly
  • Platform-agnostic (macOS/Linux)
  • Backward compatible (graceful degradation)
  • Code follows bash best practices
  • No breaking changes

Platform Notes

Unix-like systems (macOS, Linux): ✅ Fully supported
Windows: Not supported by this fix (requires different TTY detection logic)


cc: @harryalbert (previous contributor)

@wasikarn wasikarn force-pushed the fix/tty-detection-proven branch 4 times, most recently from bb7de02 to 2b585f2 Compare April 15, 2026 04:52
Hook subprocesses spawned by Claude Code lack a controlling terminal,
making /dev/tty unavailable. This caused OSC 777 notifications to fail
silently in some contexts.

Changes:
- Walk the parent process chain to find the actual TTY device
- Add termination check for PID 0/1 to prevent infinite loops
- Use [[:space:]] for robust whitespace trimming (spaces + tabs)
- Skip notification if TTY not found (don't fall back to broken /dev/tty)
- Add tests matching production code exactly
- Make tests platform-agnostic (works on macOS /dev/ttysXXX and Linux /dev/pts/N)

Tested: Confirmed working with Warp v0.2026.04.08.08.36.stable_05
Note: This fix targets Unix-like systems (macOS, Linux). Windows support
would require different TTY detection logic.
@wasikarn wasikarn force-pushed the fix/tty-detection-proven branch from 2b585f2 to 36e8254 Compare April 15, 2026 04:54
@wasikarn
Copy link
Copy Markdown
Author

Hi @harryalbert and team,

This PR is ready for review. It fixes the TTY detection issue where hook subprocesses fail to send OSC 777 notifications because /dev/tty is unavailable.

Key changes:

  • Walks parent process chain to find actual TTY device
  • Adds PID 0/1 termination check
  • Uses [[:space:]] for robust whitespace handling
  • Skip notification if TTY not found (no broken fallback)
  • Includes tests that match production code

All 43 tests pass. Tested on Warp v0.2026.04.08.08.36.stable_05.

Please review when you have time. Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant