Когда у тебя одновременно работают три-четыре сессии Claude Code и Codex, половина времени уходит на переключение окон: кто закончил, кто ждёт ответа, кто завис. Я сделал маленькое приложение для macOS, которое показывает всех агентов прямо в чёлке MacBook, светится, когда кто-то ждёт, и превращает каждую сессию в человечка в пиксельном офисе. Рассказываю, как оно устроено: хуки Claude Code, чтение журналов Codex без API, офис на SpriteKit, свечение на Core Animation за 0,5% процессора и честная статистика без единого счётчика в приложении.
Зачем
Я работаю с ИИ-агентами почти весь день: в одном окне Claude Code правит сайт, в другом Codex разбирается с базой, в третьем ещё одна сессия пишет тесты. Агенты работают минутами, и всё это время ты либо ждёшь, либо отвлекаешься — а потом обнаруживаешь, что одна из сессий уже десять минут ждёт твоего «да».
Хотелось простого: краем глаза видеть, кто чем занят, и чтобы Mac сам сказал, когда нужен я. Чёлка MacBook для этого идеальна — она всегда на виду и всё равно ничем не занята.
Так появился Lumio. Дальше — о том, как он устроен внутри.

Откуда брать состояние агентов
Claude Code: хуки
У Claude Code есть хуки — команды, которые он вызывает на события: начало и конец хода, вызов инструмента, запрос разрешения, уведомление. Lumio по кнопке «Подключить» добавляет в ~/.claude/settings.json один свой хук рядом с вашими, предварительно сохранив копию файла. Отключение возвращает файл байт в байт.
Сам хук — короткий Perl-скрипт: он получает JSON события, выбрасывает всё тяжёлое (содержимое файлов, ответы инструментов) и дописывает строку в локальный журнал. Важно, что он асинхронный и ничего не печатает: агент не ждёт Lumio ни миллисекунды.
Приложение следит за журналом через DispatchSource и собирает из событий состояние каждой сессии: работает, ждёт разрешения, ждёт ответа, закончил, ошибка. Bash-команды переводятся в человеческие фразы: из цепочки «npm run build && git add . && git commit» показывается главное — «собирает проект».
Отдельная задача — сессии, которые открыты, но молчат. Их хуки не видно, зато у Claude Code есть собственный реестр ~/.claude/sessions/<pid>.json. Lumio читает его, проверяет, что процесс жив, и показывает такую сессию как «ждёт задачу».
Codex: журналы без API
У Codex хуков нет (единственный слот уведомлений у меня занят другим инструментом), поэтому Lumio читает его собственные журналы сессий ~/.codex/sessions/…/rollout-*.jsonl — только читает, ничего не меняя. Новые чаты находятся через локальную базу Codex, хвост файла дочитывается раз в полторы секунды на фоновой очереди.
Дальше события Codex переводятся в тот же формат, что у Claude: вызов exec_command становится Bash, apply_patch — Edit, update_plan — план задач. Благодаря этому весь остальной Lumio вообще не знает, какой агент перед ним, — кроме цвета и значка.
Шкала памяти
Самая полезная мелочь оказалась неожиданной. У каждой сессии в чёлке есть тонкая полоска: насколько заполнено контекстное окно. Когда она краснеет, пора начинать сессию заново — иначе агент начинает «забывать» начало разговора и путаться. Данные берутся из того же журнала: последние счётчики токенов против размера окна модели.
Пиксельный офис
Список сессий удобен, но скучен. Поэтому по двойному нажатию правого ⌘ из чёлки вырастает окно-офис: каждая сессия — человечек за своим iMac.

Всё нарисовано кодом, пиксель за пикселем, без единой готовой картинки: люди 16×32, мебель, iMac со строчками кода на экране, которые «печатаются», пока хозяин работает. Внешность человечка вычисляется хешем имени проекта — один проект всегда выглядит одинаково.
Офис живёт по простым правилам, иначе получается муравейник:
работает — сидит за столом и печатает урывками, как живой человек;
ждёт вас — встаёт у стола, над головой табличка «ждёт вас · 3 мин»;
закончил — уходит на диван или к кофемашине;
давно молчит — дремлет.
Помощники (субагенты) стоят рядом со своим «начальником» с ноутбуками в руках. Отдыхающие иногда болтают — и реплики берутся из настоящих итогов их сессий.
Технически это SpriteKit: глубина по координате ног, A* по сетке 4 пикселя для ходьбы, свет — карта умножения и аддитивное свечение, которые перерисовываются раз в минуту, а не каждый кадр. День и ночь — по настоящему солнцу: восход и закат считаются по формулам NOAA для фиксированной точки, без запроса геолокации.
Офис рисуется только пока окно видно, при закрытии полностью выгружается: 6–7% процессора с открытым окном и семью агентами, 0,3% — с закрытым.
Свечение, которое не ест батарею
Когда агент ждёт вас, чёлка мягко светится его цветом. Первая версия на SwiftUI с repeatForever съедала около 10% процессора на одно мигание — непозволительно для вещи, которая висит всегда.
Что помогло:
все постоянные анимации — только Core Animation (CABasicAnimation на слое), никакого SwiftUI;
15 кадров в секунду для фоновых эффектов — глаз не отличает;
никаких масок на анимируемых слоях: затухание «запечено» прямо в картинку свечения;
окно в свёрнутом состоянии — ровно размером с чёлку плюс свечение.
Итог — около 0,5% процессора в простое. Отдельно пришлось следить за WindowServer: каждый кадр анимации в окне поверх всего стоит ему заметных ресурсов, и это не видно в Activity Monitor у самого приложения.
Ответ агенту прямо из чёлки

С Codex всё просто — ответ уходит в его чат. С Claude Code в VS Code сложнее: расширение не даёт другим программам писать в уже открытый чат. Поэтому есть два режима: по умолчанию кнопка просто открывает нужный чат, а если вы сами включили «Отправлять ответы», Lumio с разрешения «Универсальный доступ» открывает чат, вставляет текст и нажимает Enter — ровно то, что сделали бы вы. Перед вставкой он проверяет, что курсор стоит именно в поле чата, иначе ничего не нажимает.
Итоги дня
Раз в день Lumio может попросить ваш же Claude Code или Codex коротко пересказать, что сделано по каждому проекту, — и записать это в Obsidian, Apple Заметки или папку. Функция выключена по умолчанию и работает через вашу же подписку: агент вызывается без истории и без инструментов, в отдельной папке — чтобы Lumio не принимал собственные вызовы за новые сессии. Перед записью текст проходит фильтр, который вычищает всё похожее на ключи и пароли.
Приватность и честная статистика
Всё работает на Mac. Сам Lumio выходит в сеть только раз в день, чтобы проверить обновления, — это можно выключить. Никакой аналитики внутри нет.
Что дальше
Lumio бесплатный, работает на macOS 14+ (Apple silicon и Intel). Обновления выходят каждую неделю: следующими будут разрешения прямо из чёлки и поддержка Gemini CLI и Cursor.
Буду рад вопросам в комментариях — особенно о том, чего вам не хватает при работе с несколькими агентами.
Сайт: https://lumiomac.com


