mirror of
https://github.com/jarrodwatts/claude-hud.git
synced 2026-05-18 13:52:42 +00:00
78 lines
2.2 KiB
Bash
Executable File
78 lines
2.2 KiB
Bash
Executable File
#!/bin/bash
|
|
set -uo pipefail
|
|
|
|
command -v jq &>/dev/null || exit 0
|
|
|
|
INPUT=$(cat)
|
|
|
|
if ! echo "$INPUT" | jq empty 2>/dev/null; then
|
|
exit 0
|
|
fi
|
|
|
|
SESSION_ID=$(echo "$INPUT" | jq -r '.session_id // empty')
|
|
if [[ -z "$SESSION_ID" || ! "$SESSION_ID" =~ ^[a-zA-Z0-9_-]+$ ]]; then
|
|
exit 0
|
|
fi
|
|
|
|
HUD_DIR="$HOME/.claude/hud"
|
|
EVENT_FIFO="$HUD_DIR/events/$SESSION_ID.fifo"
|
|
REFRESH_FILE="$HUD_DIR/refresh.json"
|
|
|
|
mkdir -p "$HUD_DIR/events"
|
|
|
|
if [ ! -p "$EVENT_FIFO" ]; then
|
|
rm -f "$EVENT_FIFO"
|
|
mkfifo "$EVENT_FIFO" 2>/dev/null || true
|
|
fi
|
|
|
|
# Ensure refresh.json points at this session in case SessionStart didn't fire.
|
|
CURRENT_SESSION=$(jq -r '.sessionId // empty' "$REFRESH_FILE" 2>/dev/null)
|
|
TRANSCRIPT_PATH=$(echo "$INPUT" | jq -r '.transcript_path // empty')
|
|
if [ -z "$CURRENT_SESSION" ] || [ "$CURRENT_SESSION" != "$SESSION_ID" ]; then
|
|
if [ -n "$TRANSCRIPT_PATH" ]; then
|
|
cat > "$REFRESH_FILE" << EOF
|
|
{"sessionId":"$SESSION_ID","fifoPath":"$EVENT_FIFO","transcriptPath":"$TRANSCRIPT_PATH"}
|
|
EOF
|
|
else
|
|
cat > "$REFRESH_FILE" << EOF
|
|
{"sessionId":"$SESSION_ID","fifoPath":"$EVENT_FIFO"}
|
|
EOF
|
|
fi
|
|
CURRENT_SESSION="$SESSION_ID"
|
|
fi
|
|
|
|
# Update refresh.json with transcriptPath when available (for session resume)
|
|
if [ -n "$TRANSCRIPT_PATH" ] && [ -f "$REFRESH_FILE" ]; then
|
|
# Only update if this session matches the current refresh.json session
|
|
if [ "$CURRENT_SESSION" = "$SESSION_ID" ]; then
|
|
jq --arg tp "$TRANSCRIPT_PATH" '.transcriptPath = $tp' "$REFRESH_FILE" > "$REFRESH_FILE.tmp" && mv "$REFRESH_FILE.tmp" "$REFRESH_FILE"
|
|
fi
|
|
fi
|
|
|
|
if [ -p "$EVENT_FIFO" ]; then
|
|
EVENT_JSON=$(echo "$INPUT" | jq -c '{
|
|
schemaVersion: 1,
|
|
event: .hook_event_name,
|
|
tool: .tool_name,
|
|
toolUseId: .tool_use_id,
|
|
input: .tool_input,
|
|
response: .tool_response,
|
|
session: .session_id,
|
|
permissionMode: .permission_mode,
|
|
transcriptPath: .transcript_path,
|
|
cwd: .cwd,
|
|
prompt: .prompt,
|
|
ts: (now | floor)
|
|
}' 2>/dev/null) || true
|
|
|
|
if [ -n "$EVENT_JSON" ]; then
|
|
# Non-blocking write using read-write mode (prevents blocking on unread FIFOs)
|
|
exec 3<>"$EVENT_FIFO" 2>/dev/null && {
|
|
echo "$EVENT_JSON" >&3 2>/dev/null || true
|
|
exec 3>&-
|
|
} || true
|
|
fi
|
|
fi
|
|
|
|
exit 0
|