From 3f61f15507b3e057c7afa5b1352e3412b3960d87 Mon Sep 17 00:00:00 2001 From: vitaly Date: Thu, 11 Jun 2026 21:20:44 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=B0=D0=B2=D1=82=D0=BE=D0=BE=D0=BF?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B0?= =?UTF-8?q?=D0=BA=D0=BA=D0=B0=D1=83=D0=BD=D1=82=D0=B0,=20=D0=B8=D0=B7?= =?UTF-8?q?=D0=BE=D0=BB=D1=8F=D1=86=D0=B8=D1=8F=20effort,=20=D1=84=D0=B8?= =?UTF-8?q?=D0=BA=D1=81=20=D1=80=D0=B0=D0=B7=D0=BB=D0=BE=D0=B3=D0=B8=D0=BD?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - switch-account-hook.sh: сохранять обновлённые OAuth-токены обратно в файл аккаунта перед переключением — предотвращает 401 после обратного свитча - statusline-command.sh: - effort.level из stdin (сессия), а не из общего settings.json — ai-claude и ai-deepseek больше не пересекаются - автоопределение аккаунта по access-токену в .credentials.json - фолбек: если аккаунт не найден — запрос к haiku напрямую через Anthropic (в обход DeepSeek) для определения email - показ аккаунта только для claude-* моделей --- .../claude/hooks/switch-account-hook.sh | 6 +++ home-configs/claude/statusline-command.sh | 47 +++++++++++++++++-- 2 files changed, 50 insertions(+), 3 deletions(-) mode change 100644 => 100755 home-configs/claude/statusline-command.sh 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