# cc-agents-iterm-plugin ## Что это Панель «Claude» — страница на `http://127.0.0.1:8766/`. Сверху — дерево активных сессий Claude Code и их субагентов (название, модель, размер контекста, worktree, статус), снизу — лимиты подписки (5 ч, неделя, разбивка по продуктам) и баланс extra usage. Её показывает iTerm2 Toolbelt и браузер — в том числе Safari на iPad через SSH-туннель Termius. Для одного пользователя на его Mac: видеть, что делают все запущенные `claude` (в tmux), сколько осталось лимитов, и в один клик переходить в нужную панель tmux. ## Стек и ограничения - Python 3.8+, только стандартная библиотека; модуль `iterm2` нужен только регистратору Toolbelt (его даёт iTerm2). Без зависимостей из pip — пользователь ставит панель `./install.sh`. - Хук — POSIX `sh` + `jq`. Хук никогда не мешает Claude Code: ничего не выводит, всегда `exit 0`. - macOS, launchd. Токен OAuth берётся из Keychain (`Claude Code-credentials`) или `~/.claude/.credentials.json`, поэтому служба работает в GUI-сессии пользователя. - Сервер слушает только `127.0.0.1` — в панели видны тексты сообщений сессий. - Установщик не трогает чужие хуки и настройки: правит `~/.claude/settings.json` только через `settings_hooks.py` (маркер `agents_panel_hook`), перед заменой кладёт копии в `~/.claude-panel-backup/<дата>/`. Повторный запуск `install.sh` идемпотентен. Запуск по SSH `install.sh`/`uninstall.sh` отклоняют. ## Архитектура - `files/agents_panel_hook.sh` — хук Claude Code на SessionStart/End, UserPromptSubmit, Stop, Notification, SubagentStart/Stop, PostModelSwitch, PreToolUse(Agent|Task). Дописывает событие в `~/.cache/claude-agents/.jsonl` вместе с PID процесса `claude`, `ITERM_SESSION_ID` или сокетом/панелью tmux. - `files/claude_agents.py` — один файл, два режима (`run`): - `--headless` (`serve`) — служба launchd `com.andrey.claude-agents`, единственный владелец порта: - `refresher` раз в `poll_sec` перечитывает jsonl (`load_sessions` → `replay`), сверяет с процессами (`ps`) и панелями tmux, дочитывает из транскриптов модель и токены, из git — worktree; собирает `state["tree"]` (`build_tree`, без данных iTerm2). - `usage_poller` / `balance_poller` ходят в `api.anthropic.com/api/oauth/usage` и `.../prepaid/credits` (запасной путь — claude.ai с `sessionKey` из Keychain). - HTTP-сервер (`handle`): `/`, `/fragment` (дерево), `/limits`, `/message` (последние сообщения), `/activate` и `/open-wt` (через tmux), `/raw` (отладка). - без флага (`register_toolbelt`) — скрипт AutoLaunch iTerm2: регистрирует web view «Claude» на адрес службы; если порт молчит — `launchctl kickstart`. Свой сервер не поднимает. - `files/launchagent.py` — пишет plist службы (`write