The Jerusalem PostIsraeli extremist settlers use sheep farms, intimidation to expand West Bank control, CBS reportsESPNBills, Josh Allen outlast Rams in overtime on MNFESPN DeportesAllen, el héroe en un espectacular juego en Sofi StadiumBollywood HungamaSidharth Malhotra suffers leg injury, shares photo with a witty note!Daily MaverickSECOND CHANCE: Former Springbok coach Jake White will lead ‘best-prepared’ Fiji to RWC 2027RTP Desporto12h30 Ambiente difícil em Lens, Porto complicado diz PellegriniRTL BoulevardMan (27) stichtte bewust brand tijdens Pride en verheerlijkte ISAntara NewsIndonesia seeks land certainty to accelerate 3 million homes programVariety‘Death in Paradise’ Gets Its First International Adaptation in Croatia, Promises ‘Murder Mystery, Humor, Warmth and a Strong Sense of Place’ (EXCLUSIVE)ZDF heuteEntdecken Sie das ZDF-Nachrichtenstudio
The Daily Newsstand · Free, Always
Tuesday, October 13, 2026

Как я поселил ИИ-агентов в чёлке MacBook и построил им пиксельный офис

Translate

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

Буду рад вопросам в комментариях — особенно о том, чего вам не хватает при работе с несколькими агентами.

View the original on Хабр →

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.