ИИ-агент в чёлке MacBook: как енот из Swift и three.js превращает болтовню в задачи для Claude Code

Habr AI · оригинал

Материал подготовлен автоматизированной редакционной системой. Факты можно сверить по указанному первоисточнику.

Разработчик представил открытое приложение, которое размещает ИИ-агента в вырезе экрана MacBook. Агент слушает речь локально, извлекает задачи из разговора и отправляет их в сессии Claude Code после подтверждения пользователя.

Проект демонстрирует новый уровень интеграции ИИ-ассистентов в повседневный рабочий процесс macOS, предлагая решение для автоматизации рутины через голосовые команды и локальную обработку данных. Это пример того, как открытые инструменты могут мостить разрыв между устным планированием и исполнением кода.

Разработчик представил «Андреича» — ИИ-агента, который обитает в вырезе экрана MacBook (так называемой чёлке) и превращается в пушистого 3D-енота. Приложение написано на Swift без использования Xcode и three.js, объём кода составляет около 4900 строк. Весь проект был создан за сутки в диалоге с Claude Code, при этом автор не вносил ручных правок в код. Агент слушает речь пользователя, ведёт протокол дня и извлекает из него конкретные задачи, которые затем отправляет в соответствующие сессии Claude Code.

Ключевой особенностью решения является приватность: распознавание речи происходит локально на устройстве через системный SFSpeechRecognizer с флагом requiresOnDeviceRecognition. Звук сохраняется в файл m4a параллельно с расшифровкой, а в сеть уходит только текст протокола для генерации карточек задач. Автор подчёркивает, что это единственное место, где данные покидают устройство, и даже здесь используется подписка Claude Code, а не сторонние API.

В процессе разработки возникла серьёзная проблема: распознавание речи могло молча отваливаться, при этом индикатор микрофона продолжал гореть. Это приводило к потере данных, если звук не сохранялся на диск. Разработчик решил проблему, внедрив механизм перезапуска задач распознавания и добавив запись звука в файл как резервный слой. Теперь, даже если распознавание сбоит, аудиозапись остаётся для последующей расшифровки.

Ещё одна техническая сложность касалась перетаскивания файлов в чёлку. Поскольку окно агента находится выше строки меню, система не считала его целью для drag-and-drop. Решение нашлось в создании невидимого «окна-ловушки», которое появляется на долю секунды при начале перетаскивания и принимает файл. Этот трюк позволил реализовать полку для файлов, несмотря на ограничения macOS.

Визуальная часть агента реализована с помощью three.js без готовых 3D-моделей. Мех енота создан процедурно с использованием InstancedMesh и шейдеров, а анимации построены на физике тканей (verlet) и пружинных цепочках. В покое приложение потребляет 2–3% одного ядра CPU и около 90 МБ памяти. Когда сессии Claude Code неактивны более 18 секунд, енот «гуляет» вдоль дока, что служит индикатором завершения работы.

Логика извлечения задач работает через модель Haiku, которая анализирует свежие строки протокола и предлагает карточки в формате JSON. Эти карточки могут быть напоминаниями, идеями или готовыми промптами для сессий. Отправка в работу происходит только после подтверждения пользователя в Telegram, что предотвращает случайное изменение кода из-за ошибок распознавания или модели.

Приложение также отслеживает лимиты подписки Claude Code, рассчитывая дневную норму использования с учётом запаса на конец недели. Эта информация отображается в чёлке, панели и статусе Claude Code. Проект распространяется под лицензией MIT, а для сборки требуются macOS 14+, Swift из Command Line Tools и Node.js для 3D-части.