From 61a4421ed23ed45297cb35ed5a98b93fee60c25c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D1=82=D0=B0=D0=BB=D0=B8=D0=B9=20=D0=9D=D0=B8?= =?UTF-8?q?=D0=BA=D0=B8=D1=82=D0=B5=D0=BD=D0=BA=D0=BE?= Date: Mon, 15 Jun 2026 06:41:33 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20=D1=81=D1=82=D0=B0=D1=82=D1=83=D1=81?= =?UTF-8?q?=D0=B1=D0=B0=D1=80=20=D0=BF=D0=BE=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2?= =?UTF-8?q?=D0=B0=D0=B5=D1=82=20=D1=80=D0=B5=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20email=20=D0=B0=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20Claude-=D0=B0=D0=BA=D0=BA=D0=B0=D1=83=D0=BD?= =?UTF-8?q?=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Статусбар слепо доверял accounts/current и показывал legacy-имя даже когда активна сессия другого аккаунта. Теперь сверяем accessToken из .credentials.json с активным ~/.claude/.credentials.json и при расхождении резолвим аккаунт по токену: локальный матч плюс account-email.sh вместо haiku-велосипеда. Kimi-блок показывает alias (account1/account2). Co-Authored-By: Claude Opus 4.8 --- home-configs/claude/statusline-command.sh | 66 +++++++++++------------ 1 file changed, 32 insertions(+), 34 deletions(-) diff --git a/home-configs/claude/statusline-command.sh b/home-configs/claude/statusline-command.sh index 2670e28..bdb40ec 100755 --- a/home-configs/claude/statusline-command.sh +++ b/home-configs/claude/statusline-command.sh @@ -44,13 +44,19 @@ if [ -n "$model" ]; then effort=$(echo "$input" | jq -r ".effort.level // empty") # Аккаунт 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) + account=$(cat "$ACCOUNTS_DIR/current" 2>/dev/null) + current_token=$(jq -r '.claudeAiOauth.accessToken // empty' "$HOME/.claude/.credentials.json" 2>/dev/null) + # current надёжен, только если его файл существует И токен совпадает с активной сессией. + account_token="" + if [ -n "$account" ] && [ -f "$ACCOUNTS_DIR/${account}.credentials.json" ]; then + account_token=$(jq -r '.claudeAiOauth.accessToken // empty' "$ACCOUNTS_DIR/${account}.credentials.json" 2>/dev/null) + fi + # Рассинхрон (пусто или чужой токен) — определяем аккаунт по активному токену. + if [ -z "$account" ] || [ "$account_token" != "$current_token" ]; then + account="" if [ -n "$current_token" ]; then + # 1) Локальный матч по токену среди сохранённых аккаунтов (мгновенно) for f in "$ACCOUNTS_DIR"/*.credentials.json; do [ ! -f "$f" ] && continue token=$(jq -r '.claudeAiOauth.accessToken // empty' "$f" 2>/dev/null) @@ -60,38 +66,30 @@ if [ -n "$model" ]; then 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 " %s[%s]\033[00m" "$brand_color" "$account" - fi + # 2) Не нашли локально — резолвим email через account-email.sh (один раз на токен) + if [ -z "$account" ]; then + sentinel="$HOME/.cache/ai-setup/email_fetch_token" + if [ "$(cat "$sentinel" 2>/dev/null)" != "$current_token" ]; then + mkdir -p "$HOME/.cache/ai-setup" + echo "$current_token" > "$sentinel" + email=$(bash "$HOME/.claude/hooks/account-email.sh" "$HOME/.claude/.credentials.json" 2>/dev/null) + 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 " %s[%s]\033[00m" "$brand_color" "$account" + fi - # Аккаунт/ключ Kimi — показываем email/имя из .meta, если оно есть, иначе alias. + # Аккаунт/ключ Kimi — показываем alias (account1/account2/...). if [ "${AI_LAUNCHER:-}" = "kimi" ]; then kimi_account=$(cat "$HOME/.config/ai-setup/kimi_keys/current" 2>/dev/null) - if [ -n "$kimi_account" ]; then - kimi_display=$(cat "$HOME/.config/ai-setup/kimi_keys/${kimi_account}.meta" 2>/dev/null || echo "$kimi_account") - printf " %s[%s]\033[00m" "$brand_color" "$kimi_display" - fi + [ -n "$kimi_account" ] && printf " %s[%s]\033[00m" "$brand_color" "$kimi_account" fi if [ -n "$effort" ]; then printf " %s%s " "$brand_color" "$model"