Files
QwenClaw-with-Auth/skills/claude-codex-settings/plugins/statusline-tools/scripts/statusline.sh

73 lines
2.9 KiB
Bash

#!/bin/bash
# Cross-platform statusline (no jq)
RST='\033[0m' WHITE='\033[97m' DIM='\033[2m'
GREEN='\033[32m' YELLOW='\033[33m' RED='\033[31m'
json_num() { echo "$2" | sed -n 's/.*"'"$1"'"[[:space:]]*:[[:space:]]*\([0-9.]*\).*/\1/p' | head -1; }
color_pct() { [ "$1" -lt 50 ] && echo "$GREEN" || { [ "$1" -lt 70 ] && echo "$YELLOW" || echo "$RED"; }; }
color_time() { [ "$1" -lt 3600 ] && echo "$GREEN" || { [ "$1" -lt 12600 ] && echo "$YELLOW" || echo "$RED"; }; }
# Session stats from stdin
input=$(cat)
CTX_SIZE=$(json_num context_window_size "$input")
CTX_SIZE=${CTX_SIZE:-200000}
COST=$(json_num total_cost_usd "$input")
COST=${COST:-0}
INPUT_T=$(json_num input_tokens "$input")
INPUT_T=${INPUT_T:-0}
CACHE_C=$(json_num cache_creation_input_tokens "$input")
CACHE_C=${CACHE_C:-0}
CACHE_R=$(json_num cache_read_input_tokens "$input")
CACHE_R=${CACHE_R:-0}
CURRENT=$((INPUT_T + CACHE_C + CACHE_R))
CTX_PCT=$((CTX_SIZE > 0 ? CURRENT * 100 / CTX_SIZE : 0))
COST_INT=$(LC_NUMERIC=C printf "%.0f" "${COST:-0}" 2> /dev/null || echo 0)
# Account usage from API (cached 30s)
CACHE_FILE="/tmp/claude-usage-cache.json"
if [[ "$OSTYPE" == darwin* ]]; then
AGE=$(($(date +%s) - $(stat -f %m "$CACHE_FILE" 2> /dev/null || echo 0)))
else
AGE=$(($(date +%s) - $(stat -c %Y "$CACHE_FILE" 2> /dev/null || echo 0)))
fi
API=""
[ -f "$CACHE_FILE" ] && [ "$AGE" -lt 30 ] && API=$(cat "$CACHE_FILE")
if [ -z "$API" ]; then
if [[ "$OSTYPE" == darwin* ]]; then
CREDS=$(security find-generic-password -s "Claude Code-credentials" -w 2> /dev/null)
elif [ -f "$HOME/.claude/.credentials.json" ]; then
CREDS=$(cat "$HOME/.claude/.credentials.json")
fi
TOKEN=$(echo "$CREDS" | sed -n 's/.*"claudeAiOauth"[^}]*"accessToken"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -1)
if [ -n "$TOKEN" ]; then
API=$(curl -s "https://api.anthropic.com/api/oauth/usage" \
-H "Authorization: Bearer $TOKEN" \
-H "anthropic-beta: oauth-2025-04-20" \
-H "User-Agent: claude-code/2.0.76")
echo "$API" > "$CACHE_FILE" 2> /dev/null
fi
fi
ACCT_PCT=$(echo "$API" | sed -n 's/.*"five_hour"[^}]*"utilization"[[:space:]]*:[[:space:]]*\([0-9.]*\).*/\1/p' | head -1)
ACCT_PCT=${ACCT_PCT%.*}
ACCT_PCT=${ACCT_PCT:-0}
RESET_AT=$(echo "$API" | sed -n 's/.*"five_hour"[^}]*"resets_at"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -1)
TIME_STR="?" SECS=0
if [ -n "$RESET_AT" ]; then
if [[ "$OSTYPE" == darwin* ]]; then
RESET_EPOCH=$(TZ=UTC date -j -f "%Y-%m-%dT%H:%M:%S" "${RESET_AT:0:19}" +%s 2> /dev/null || echo 0)
else
RESET_EPOCH=$(date -u -d "${RESET_AT:0:19}" +%s 2> /dev/null || echo 0)
fi
SECS=$((RESET_EPOCH - $(date +%s)))
[ "$SECS" -lt 0 ] && SECS=0
TIME_STR="$((SECS / 3600))h$(((SECS % 3600) / 60))m"
fi
printf "${DIM}[Session]${RST} $(color_pct $CTX_PCT)%d%%${RST} ${WHITE}\$%d${RST} ${DIM}|${RST} ${DIM}[5H]${RST} $(color_pct $ACCT_PCT)%d%%${RST} $(color_time $SECS)%s${RST}" "$CTX_PCT" "$COST_INT" "$ACCT_PCT" "$TIME_STR"