#!/bin/bash
# ~/.panopticon/bin/session-start-hook  (PAN-800)
#
# Fires on Claude Code SessionStart. Emits agent.activity_changed(idle) so the
# runtime snapshot is current before the first tool fires, and emits
# agent.model_set when the model is inferable from the payload or env.
#
# This hook replaces the waitForReadySignal tmux fallback referenced in
# PAN-759 — the hook that was supposed to exist from the start but was never
# registered in ~/.claude/settings.json by the installer.

set +e

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
# shellcheck source=pan-hook-lib.sh
. "$SCRIPT_DIR/pan-hook-lib.sh" 2>/dev/null || exit 0

pan_resolve_agent_id || exit 0

INPUT=$(cat 2>/dev/null || echo '{}')

CLAUDE_SESSION_ID=""
MODEL=""
if command -v jq >/dev/null 2>&1; then
  CLAUDE_SESSION_ID=$(echo "$INPUT" | jq -r '.session_id // ""' 2>/dev/null)
  MODEL=$(echo "$INPUT" | jq -r '.model // .model_name // ""' 2>/dev/null)
fi
[ -z "$MODEL" ] && MODEL="${ANTHROPIC_MODEL:-}"

TS=$(date -Iseconds)

pan_emit_event "$AGENT_ID" "{\"kind\":\"activity\",\"activity\":\"idle\",\"timestamp\":\"$TS\"}"

# PAN-1594: write the ready.json readiness signal that waitForReadySignal()
# consumes. Claude-side counterpart to the Pi extension's handleSessionStart
# writer (packages/pi-extension/src/index.ts). Closes the PAN-759 gap where the
# hook emitted the idle event but never wrote the file, which forced
# waitForReadySignal onto a tmux pane-scrape fallback coupled to permission-mode
# footer text. clearReadySignal() removes this file before every (re)launch, so
# its presence means "this session reached the prompt".
READY_DIR="${PANOPTICON_HOME:-$HOME/.panopticon}/agents/$AGENT_ID"
mkdir -p "$READY_DIR" 2>/dev/null
if command -v jq >/dev/null 2>&1; then
  jq -n --arg agentId "$AGENT_ID" --arg sid "$CLAUDE_SESSION_ID" --arg ts "$TS" \
    '{ready: true, agentId: $agentId, sessionId: (if $sid == "" then null else $sid end), reason: "session-start", timestamp: $ts}' \
    > "$READY_DIR/ready.json" 2>/dev/null || true
else
  printf '{"ready":true,"agentId":"%s","sessionId":"%s","reason":"session-start","timestamp":"%s"}\n' \
    "$AGENT_ID" "$CLAUDE_SESSION_ID" "$TS" > "$READY_DIR/ready.json" 2>/dev/null || true
fi

if [ -n "$MODEL" ]; then
  if command -v jq >/dev/null 2>&1; then
    BODY=$(jq -n --arg model "$MODEL" --arg sid "$CLAUDE_SESSION_ID" --arg ts "$TS" \
      'if $sid == "" then {kind: "model_set", model: $model, timestamp: $ts}
       else {kind: "model_set", model: $model, claudeSessionId: $sid, timestamp: $ts} end')
  elif [ -n "$CLAUDE_SESSION_ID" ]; then
    BODY="{\"kind\":\"model_set\",\"model\":\"$MODEL\",\"claudeSessionId\":\"$CLAUDE_SESSION_ID\",\"timestamp\":\"$TS\"}"
  else
    BODY="{\"kind\":\"model_set\",\"model\":\"$MODEL\",\"timestamp\":\"$TS\"}"
  fi
  pan_emit_event "$AGENT_ID" "$BODY"
fi

INTERNAL_TOKEN="${PANOPTICON_INTERNAL_TOKEN:-}"
if [ -z "$INTERNAL_TOKEN" ]; then
  TOKEN_PATH="${PANOPTICON_HOME:-$HOME/.panopticon}/internal-token"
  if [ -f "$TOKEN_PATH" ]; then
    INTERNAL_TOKEN=$(cat "$TOKEN_PATH" 2>/dev/null || true)
  fi
fi

if command -v jq >/dev/null 2>&1; then
  SESSION_BODY=$(printf '%s' "$INPUT" | jq -c --arg agentId "$AGENT_ID" '. + {agentId: $agentId}' 2>/dev/null)
  if [ -n "$SESSION_BODY" ]; then
    curl -s -m 0.5 -o /dev/null -X POST -H 'Content-Type: application/json' -H "x-panopticon-internal-token: $INTERNAL_TOKEN" --data "$SESSION_BODY" "$PAN_DASHBOARD_URL/api/memory/session/start" 2>/dev/null || true
  fi
fi

exit 0
