Когда у тебя одновременно работают три-четыре сессии 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