#!/bin/bash
# Claude Code / Codex CLI の hooks から呼ばれ、作業状態を端末へ知らせる（両者の hook JSON は同じ形）。
# Claude Code は ~/.claude/settings.json、Codex CLI は ~/.codex/hooks.json の各イベント（SessionStart / UserPromptSubmit /
# PreToolUse / PostToolUse / PermissionRequest / Notification / Stop / StopFailure / Interrupt / SessionEnd）にこのスクリプトを登録する。
# kTerm では端末デバイスへ kTerm 独自の OSC を書き、iTerm2 では同梱の cc-status に引き渡す。
# 他の端末では何もしない。
# hooks は制御端末を持たずに起動されるので /dev/tty は使えない。kTerm がシェルに渡す KTERM_TTY のパスへ書き、
# それも無ければ親プロセスをさかのぼって端末を探す

ITERM_CC_STATUS="/Applications/iTerm.app/Contents/Resources/utilities/cc-status"
KTERM_ACTIVITY_OSC=7777

input=$(cat)

case "$TERM_PROGRAM" in
  kTerm) ;;
  iTerm.app)
    [ -x "$ITERM_CC_STATUS" ] && printf '%s' "$input" | exec "$ITERM_CC_STATUS"
    exit 0
    ;;
  *) exit 0 ;;
esac

# JSON から必要な項目だけ取り出す（jq に依存しない）。値の中の改行は JSON ではエスケープ済みなので 1 行にして扱う
json=$(printf '%s' "$input" | tr -d '\n')
field() {
  printf '%s' "$json" | sed -n "s/.*\"$1\"[[:space:]]*:[[:space:]]*\"\([^\"]*\)\".*/\1/p"
}
event=$(field hook_event_name)
tool=$(field tool_name)
notification=$(field notification_type)

label=""
case "$event" in
  SessionStart | SessionEnd) state=off ;;
  UserPromptSubmit | PostToolUse) state=busy ;;
  PreToolUse) state=tool; label=$tool ;;
  PermissionRequest) state=attention ;;
  Notification)
    # permission_prompt は許可待ち、idle_prompt は完了後しばらく放置されている合図。どちらも利用者の番
    case "$notification" in
      permission_prompt | idle_prompt) state=attention ;;
      *) exit 0 ;;
    esac
    ;;
  Stop | Interrupt) state=done ;;
  StopFailure) state=error ;;
  *) exit 0 ;;
esac

tty_path=$KTERM_TTY
if [ -z "$tty_path" ]; then
  pid=$PPID
  while [ "$pid" -gt 1 ]; do
    name=$(ps -o tty= -p "$pid" 2>/dev/null | tr -d ' ')
    if [ -n "$name" ] && [ "$name" != "??" ]; then tty_path="/dev/$name"; break; fi
    pid=$(ps -o ppid= -p "$pid" 2>/dev/null | tr -d ' ')
    [ -z "$pid" ] && break
  done
fi
[ -w "$tty_path" ] || exit 0

# ラベルにシーケンスの区切り文字が混ざらないようにする
label=$(printf '%s' "$label" | tr -d ';\033\007')
printf '\033]%s;activity;%s;%s\033\\' "$KTERM_ACTIVITY_OSC" "$state" "$label" > "$tty_path" 2>/dev/null
exit 0
