fix(hooks): add stdin timeout guard to prevent hook errors
The context monitor and statusline hooks wait for stdin 'end' event before processing. On some platforms (Windows/Git Bash), the stdin pipe may not close cleanly, causing the script to hang until Claude Code's hook timeout kills it — surfacing as "PostToolUse:Read hook error" after every tool call. Add a 3-second timeout that exits silently if stdin doesn't complete, preventing the noisy error messages. Closes #775 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
committed by
Lex Christopherson
parent
dacd0beed3
commit
7554503b42
@@ -27,9 +27,14 @@ const STALE_SECONDS = 60; // ignore metrics older than 60s
|
||||
const DEBOUNCE_CALLS = 5; // min tool uses between warnings
|
||||
|
||||
let input = '';
|
||||
// Timeout guard: if stdin doesn't close within 3s (e.g. pipe issues on
|
||||
// Windows/Git Bash), exit silently instead of hanging until Claude Code
|
||||
// kills the process and reports "hook error". See #775.
|
||||
const stdinTimeout = setTimeout(() => process.exit(0), 3000);
|
||||
process.stdin.setEncoding('utf8');
|
||||
process.stdin.on('data', chunk => input += chunk);
|
||||
process.stdin.on('end', () => {
|
||||
clearTimeout(stdinTimeout);
|
||||
try {
|
||||
const data = JSON.parse(input);
|
||||
const sessionId = data.session_id;
|
||||
|
||||
@@ -8,9 +8,13 @@ const os = require('os');
|
||||
|
||||
// Read JSON from stdin
|
||||
let input = '';
|
||||
// Timeout guard: if stdin doesn't close within 3s (e.g. pipe issues on
|
||||
// Windows/Git Bash), exit silently instead of hanging. See #775.
|
||||
const stdinTimeout = setTimeout(() => process.exit(0), 3000);
|
||||
process.stdin.setEncoding('utf8');
|
||||
process.stdin.on('data', chunk => input += chunk);
|
||||
process.stdin.on('end', () => {
|
||||
clearTimeout(stdinTimeout);
|
||||
try {
|
||||
const data = JSON.parse(input);
|
||||
const model = data.model?.display_name || 'Claude';
|
||||
|
||||
Reference in New Issue
Block a user