Запросы разрешений
Как purplemux перехватывает диалоги Claude Code «можно это запустить?» и позволяет одобрять их с панели, с клавиатуры или с телефона.
Claude Code по умолчанию блокируется на диалогах разрешений — для вызовов инструментов, записи файлов и тому подобного. purplemux ловит эти диалоги в момент появления и направляет их на устройство, которое сейчас под рукой.
Что перехватывается
Хук Notification Claude Code срабатывает по нескольким причинам. purplemux считает запросами разрешений только два типа уведомлений:
permission_prompt— стандартный диалог «Разрешить запуск этого инструмента?»worker_permission_prompt— то же самое от sub-agent
Всё остальное (idle-напоминания и т. п.) игнорируется на стороне статуса и не переключит вкладку в needs-input и не отправит push.
Что происходит, когда срабатывает
- Claude Code эмитит хук
Notification. Shell-скрипт в~/.purplemux/status-hook.shPOST'ит событие и тип уведомления на локальный сервер. - Сервер переводит состояние вкладки в needs-input (янтарный пульс) и транслирует изменение по статусному WebSocket.
- Панель рендерит запрос inline в таймлайне — с теми же опциями, что предложил Claude. Никакого модального окна, никакого переключения контекста.
- Если разрешение на уведомления выдано, срабатывают Web Push и/или десктопное уведомление для
needs-input.
Сам Claude CLI всё ещё ждёт stdin. purplemux читает опции запроса из tmux и передаёт ваш выбор обратно, когда вы его делаете.
Как ответить
Три равноценных способа:
- Кликнуть опцию в таймлайне.
- Нажать цифру — 1, 2, 3 — соответствующую индексу опции.
- Тапнуть push на телефоне — он откроет вкладку прямо на этом запросе; выбирайте оттуда.
После выбора purplemux отправляет ввод в tmux, вкладка возвращается в busy, и Claude продолжает с того же места. Подтверждать ничего больше не нужно — клик и есть подтверждение.
Мобильный поток
С установленной PWA и выданными разрешениями на уведомления Web Push срабатывает независимо от того, открыта вкладка браузера, в фоне или закрыта:
- Уведомление гласит «Input Required» и идентифицирует сессию.
- Тап открывает purplemux с фокусом на этой вкладке.
- Inline-запрос уже отрендерен; выбираете опцию одним нажатием.
Это и есть основная причина настроить Tailscale + PWA — одобрения следуют за вами вне рабочего стола.
Когда опции не удалось распарсить
В редких случаях (запрос ушёл из scrollback tmux раньше, чем purplemux успел его прочитать) список опций возвращается пустым. Таймлайн показывает карточку «не удалось прочитать запрос» и до четырёх раз пытается заново с экспоненциальной задержкой. Если всё равно не вышло — переключитесь в режим Terminal для этой вкладки и ответьте в сыром CLI: процесс Claude всё равно ждёт.
А что насчёт idle-напоминаний?
Прочие типы уведомлений Claude — например, idle-напоминания — всё равно приходят на эндпоинт хука. Сервер их логирует, но не меняет состояние вкладки, не отправляет push и не показывает UI-запрос. Это сделано специально: вашего внимания требуют только события, которые блокируют Claude.
Что дальше
- Статус сессии — что значит состояние needs-input и как оно определяется.
- Живой вид сессии — где рендерится inline-запрос.
- Поддержка браузеров — требования Web Push (особенно iOS Safari 16.4+).