fix: автоопределение аккаунта, изоляция effort, фикс разлогина
- 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-* моделей
This commit is contained in:
47
home-configs/claude/statusline-command.sh
Normal file → Executable file
47
home-configs/claude/statusline-command.sh
Normal file → Executable file
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user