feat: брендовые цвета имён моделей, персистентность model между сессиями

- _brand_color: цвет имени модели по AI_LAUNCHER
  deepseek=синий(69), claude=оранжевый(173), kimi=голубой(81),
  openrouter=фиолетовый(135), остальные=кремовый(223)
- _restore_model / _restore_model_str: сохранение и восстановление
  model_id в кэше лаунчера (~/.cache/ai-setup/model_<launcher>)
- effort-save-hook также сохраняет model_id при завершении сессии
- ai-claude/ai-openrouter используют восстановленную модель при старте

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-06-11 22:45:49 +03:00
parent 54742d6a36
commit 222bb129eb
3 changed files with 84 additions and 28 deletions

View File

@@ -10,28 +10,40 @@ week_reset=$(echo "$input" | jq -r '.rate_limits.seven_day.resets_at // empty')
ctx_pct=$(echo "$input" | jq -r '.context_window.used_percentage // empty')
# Цвет effort: мягкая гармоничная палитра
# Цвет effort: насыщенные, глубже чем пастельные (jewel tones)
_effort_color() {
case "$1" in
low) printf '\033[38;5;220m[low]\033[00m' ;; # золотой
medium) printf '\033[38;5;43m[medium]\033[00m' ;; # бирюзовый
high) printf '\033[38;5;39m[high]\033[00m' ;; # небесно-голубой
xhigh) printf '\033[38;5;171m[xhigh]\033[00m' ;; # лавандовый
max) printf '\033[38;5;210m[\033[38;5;220mm\033[38;5;114ma\033[38;5;43mx\033[38;5;171m]\033[00m' ;; # радуга
*) printf '\033[38;5;250m[%s]\033[00m' "$1" ;;
medium) printf '\033[38;5;50m[medium]\033[00m' ;; # насыщенный teal
high) printf '\033[38;5;38m[high]\033[00m' ;; # глубокий голубой
xhigh) printf '\033[38;5;206m[xhigh]\033[00m' ;; # насыщенный фиолетовый
max) printf '\033[38;5;210m[\033[38;5;220mm\033[38;5;114ma\033[38;5;50mx\033[38;5;206m]\033[00m' ;; # радуга
*) printf '\033[38;5;252m[%s]\033[00m' "$1" ;;
esac
}
# Брендовый цвет имени модели по лаунчеру
_brand_color() {
case "${1:-}" in
deepseek) printf '\033[38;5;69m' ;; # DeepSeek фирменный синий
claude) printf '\033[38;5;173m' ;; # Anthropic оранжевый
kimi) printf '\033[38;5;81m' ;; # Kimi голубой
openrouter) printf '\033[38;5;135m' ;; # OpenRouter фиолетовый
*) printf '\033[38;5;223m' ;; # кремовый (fallback)
esac
}
branch=$(git -C "$cwd" --no-optional-locks symbolic-ref --short HEAD 2>/dev/null)
short_cwd="${cwd/#$HOME/\~}"
printf "\033[38;5;250m%s\033[00m" "$short_cwd"
printf "\033[38;5;252m%s\033[00m" "$short_cwd"
[ -n "$branch" ] && printf " \033[38;5;250m[%s]\033[00m" "$branch"
[ -n "$branch" ] && printf " \033[38;5;252m[%s]\033[00m" "$branch"
if [ -n "$model" ]; then
brand_color=$(_brand_color "${AI_LAUNCHER:-}")
effort=$(echo "$input" | jq -r ".effort.level // empty")
# Сохраняем effort для persistence между сессиями одного лаунчера
if [ -n "$effort" ] && [ -n "${AI_LAUNCHER:-}" ]; then
if [ -n "${AI_LAUNCHER:-}" ] && [ -n "$effort" ]; then
effort_file="$HOME/.cache/ai-setup/effort_${AI_LAUNCHER}"
prev_effort=$(cat "$effort_file" 2>/dev/null)
if [ "$effort" != "$prev_effort" ]; then
@@ -79,13 +91,13 @@ if [ -n "$model" ]; then
fi
fi
fi
[ -n "$account" ] && printf " \033[38;5;223m[%s]\033[00m" "$account"
[ -n "$account" ] && printf " %s[%s]\033[00m" "$brand_color" "$account"
fi
if [ -n "$effort" ]; then
printf " \033[38;5;223m%s " "$model"
printf " %s%s " "$brand_color" "$model"
_effort_color "$effort"
else
printf " \033[38;5;223m%s\033[00m" "$model"
printf " %s%s\033[00m" "$brand_color" "$model"
fi
fi
@@ -114,7 +126,7 @@ pct_color() {
if [ "$pct" -lt 40 ]; then
printf '\033[38;5;114m' # мягкий зелёный
elif [ "$pct" -lt 60 ]; then
printf '\033[38;5;221m' # золотистый
printf '\033[38;5;220m' # золотой (как effort low)
else
printf '\033[38;5;210m' # мягкий красный
fi
@@ -127,7 +139,7 @@ if [[ "$model_id" == *deepseek* ]]; then
cache_file="$HOME/.cache/ai-setup/deepseek_balance"
if [ -f "$cache_file" ]; then
balance=$(head -1 "$cache_file")
[ -n "$balance" ] && printf " \033[38;5;147m%s\033[00m" "$balance"
[ -n "$balance" ] && printf " \033[38;5;183m%s\033[00m" "$balance"
fi
# Фоновое обновление баланса (не чаще раза в 30 секунд)