feat: прямая перерисовка статусной строки через TTY escape-коды

SIGWINCH и TIOCSWINSZ не заставляют Claude Code обновить статусную строку.
Запускаем statusline-command.sh с кешем и пишем результат напрямую
в TTY claude через \0337 (save cursor) / \033[999B / \033[2K / \0338.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-09 21:22:36 +03:00
parent 986abf5101
commit 08f23e857e

View File

@@ -40,21 +40,22 @@ echo "$next" > "$CURRENT_FILE"
echo "Аккаунт: ${current:-?} -> ${next} (всего: ${#accounts[@]})" >&2
# Тригерим resize через TIOCSWINSZ на TTY claude (надёжнее чем kill -WINCH)
# Обновляем статусную строку: перерисовываем последнюю строку напрямую в TTY
sh_pid=$PPID
claude_pid=$(awk '/PPid/{print $2}' /proc/$sh_pid/status 2>/dev/null)
if [ -n "$claude_pid" ]; then
tty_dev=$(ps -o tty= -p "$claude_pid" 2>/dev/null | tr -d ' ')
if [ -n "$tty_dev" ] && [ "$tty_dev" != "?" ]; then
( sleep 0.3 && python3 -c "
import fcntl, termios, struct, sys
try:
fd = open('/dev/$tty_dev', 'rb+', buffering=0)
ws = fcntl.ioctl(fd, termios.TIOCGWINSZ, bytes(8))
fcntl.ioctl(fd, termios.TIOCSWINSZ, ws)
fd.close()
except: pass
" ) &
# Запускаем statusline-command.sh с кешированными данными и перерисовываем последнюю строку
cache_file=$(ls "$HOME/.cache/ai-setup/rate_limits_"*.cache 2>/dev/null | head -1)
model_id=$(basename "${cache_file}" .cache | sed 's/rate_limits_//')
( sleep 0.2
# Собираем данные из кеша для statusline
mock_json="{\"cwd\":\"$(echo "$input" | jq -r '.cwd // empty')\",\"model\":{\"display_name\":\"\",\"id\":\"$model_id\"},\"rate_limits\":{},\"context_window\":{}}"
new_line=$(echo "$mock_json" | bash "$HOME/.claude/statusline-command.sh" 2>/dev/null)
# Перерисовываем последнюю строку через escape-коды
printf '\0337\033[999B\033[2K%s\0338' "$new_line" > "/dev/$tty_dev"
) &
fi
fi