diff --git a/home-configs/claude/hooks/switch-account-hook.sh b/home-configs/claude/hooks/switch-account-hook.sh index 488326f..caa521e 100755 --- a/home-configs/claude/hooks/switch-account-hook.sh +++ b/home-configs/claude/hooks/switch-account-hook.sh @@ -36,6 +36,12 @@ done next_idx=$(( (idx + 1) % ${#accounts[@]} )) next="${accounts[$next_idx]}" +# Сохранить текущие (возможно обновлённые Claude Code) токены обратно в файл аккаунта +if [ -n "$current" ] && [ -f "$CREDS" ]; then + cp "$CREDS" "$ACCOUNTS_DIR/${current}.credentials.json" + chmod 600 "$ACCOUNTS_DIR/${current}.credentials.json" +fi + cp "$ACCOUNTS_DIR/${next}.credentials.json" "$CREDS" chmod 600 "$CREDS" echo "$next" > "$CURRENT_FILE" diff --git a/home-configs/claude/statusline-command.sh b/home-configs/claude/statusline-command.sh old mode 100644 new mode 100755 index 674ac63..890644f --- a/home-configs/claude/statusline-command.sh +++ b/home-configs/claude/statusline-command.sh @@ -16,9 +16,50 @@ printf "\033[00;37m%s\033[00m" "$short_cwd" [ -n "$branch" ] && printf " \033[00;37m[%s]\033[00m" "$branch" if [ -n "$model" ]; then - effort=$(jq -r '.effortLevel // empty' ~/.claude/settings.json 2>/dev/null) - account=$(cat ~/.claude/accounts/current 2>/dev/null) - [ -n "$account" ] && printf " \033[38;5;173m[%s]\033[00m" "$account" + effort=$(echo "$input" | jq -r ".effort.level // empty") + [ -z "$effort" ] && effort=$(jq -r '.effortLevel // empty' ~/.claude/settings.json 2>/dev/null) + # Аккаунт Claude.ai актуален только для нативных моделей Claude + if [[ "$model_id" == claude-* ]]; then + account=$(cat ~/.claude/accounts/current 2>/dev/null) + ACCOUNTS_DIR="$HOME/.claude/accounts" + # Автоопределение: если current пуст или файл не существует — + # ищем аккаунт по access-токену в .credentials.json + if [ -z "$account" ] || [ ! -f "$ACCOUNTS_DIR/${account}.credentials.json" ]; then + current_token=$(jq -r '.claudeAiOauth.accessToken // empty' "$HOME/.claude/.credentials.json" 2>/dev/null) + if [ -n "$current_token" ]; then + for f in "$ACCOUNTS_DIR"/*.credentials.json; do + [ ! -f "$f" ] && continue + token=$(jq -r '.claudeAiOauth.accessToken // empty' "$f" 2>/dev/null) + if [ "$token" = "$current_token" ]; then + account=$(basename "$f" .credentials.json) + echo "$account" > "$ACCOUNTS_DIR/current" + break + fi + done + # Если токен не найден — спрашиваем haiku (один раз на аккаунт) + if [ -z "$account" ]; then + sentinel="$HOME/.cache/ai-setup/email_fetch_token" + prev_token=$(cat "$sentinel" 2>/dev/null) + if [ "$prev_token" != "$current_token" ]; then + mkdir -p "$HOME/.cache/ai-setup" + echo "$current_token" > "$sentinel" + email=$(unset ANTHROPIC_BASE_URL ANTHROPIC_AUTH_TOKEN; \ + echo 'какой имейл этого аккаунта? напиши только имейл без других слов.' | \ + claude --print --model claude-haiku-4-5 --dangerously-skip-permissions \ + --output-format text --max-turns 1 --tools "" --effort low 2>/dev/null) + email=$(echo "$email" | grep -oE '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' | head -1) + if [ -n "$email" ]; then + cp "$HOME/.claude/.credentials.json" "$ACCOUNTS_DIR/${email}.credentials.json" + chmod 600 "$ACCOUNTS_DIR/${email}.credentials.json" + account="$email" + echo "$account" > "$ACCOUNTS_DIR/current" + fi + fi + fi + fi + fi + [ -n "$account" ] && printf " \033[38;5;173m[%s]\033[00m" "$account" + fi if [ -n "$effort" ]; then printf " \033[38;5;173m%s [%s]\033[00m" "$model" "$effort" else