claude-code

Toolog ведёт локальный журнал вызовов Claude Code

Claude News

claude-code

Toolog пишет каждый вызов инструмента Claude Code в локальную базу SQLite и разбирает его двенадцатью правилами риска. Проект опубликован автором на Github и раздаётся как подписанное приложение для macOS 11 и новее, которое не делает ни одного сетевого запроса за пределы машины.

Коротко

  • Сбор идёт двумя линиями: приёмник OTLP на 127.0.0.1:47318 и слежение за транскриптами в ~/.claude/projects через fsevents, записи соединяются по полю tool_use_id, а расхождение фиксируется как находка и не сглаживается.
  • OTEL обрезает вход инструмента на 512 знаках, поэтому полный текст команды и диффа берётся из транскриптов, а решение о доступе и время выполнения приходят только по линии OTEL.
  • Правила покрывают лишь описанные заранее случаи: у автора 77% хранилища составляли команды Bash без совпадений, и для них предусмотрена отдельная опциональная оценка локальной моделью в формате .gguf.

Журнал действий агента до сих пор существовал в виде прокрученного терминала: после закрытия сессии восстановить, какая команда выполнялась и кто её одобрил, было нечем. Toolog выглядит как попытка закрыть этот разрыв средствами, которые можно проверить: база лежит открытым файлом SQLite, а запрет на сеть подкреплён падением сборки. Для команд, которым нужен разбор инцидента, вероятно, важнее не оценки риска, а сама возможность доказать полноту записи.

Приёмник OTLP слушает только 127.0.0.1:47318, и нарушение этого правила ломает сборку

Обе линии сбора работают внутри одного процесса, который открывает окно с тремя видами: хронологией вызовов, разбором правил риска и состоянием самого захвата. Claude Code шлёт OTLP/HTTP на POST /v1/logs по адресу 127.0.0.1:47318, параллельно наблюдатель на fsevents читает транскрипты в ~/.claude/projects. Ни одна из линий не встаёт на критический путь агента: одна лишь читает файлы, другая отправляет данные без ожидания ответа.

В приложении нет аналитики, отчётов о сбоях, удалённой конфигурации, учётной записи и проверки обновлений; обновление предлагается делать командой brew upgrade --cask toolog. Тест в CI прогоняет полный импорт и все запросы окна, затем спрашивает у системы, какие сокеты держит процесс, и любой адрес вне петлевого интерфейса роняет сборку. Второй тест открывает сокет наружу и проверяет, что первая проверка действительно падает.

Локальная модель на 4,6 млрд параметров весит 3,1 ГБ при хранилище в 166 МБ

Вторая оценка остаётся совещательной: она не становится правилом, не задаёт уровень серьёзности и не попадает в сводные числа, для неё выделены отдельная колонка, отдельный раздел и отдельный блок карточки. Toolog линкует llama.cpp, но загрузчика вместе с ней не получает: файл .gguf скачивается вручную, путь задаётся командой toolog model set, а в поисковой строке оценки модели отбираются запросом @model-risk:>=4, срабатывания правил запросом @risk:high.

Модель квантованная и, по замерам автора на его же хранилище, оценивает безобидный cargo test на 2 балла, а опасность dd по сырому устройству признала только после того, как критерии прописали явно. В релизе дополнительно проверяется, что otool -L на собранном бинарнике не показывает ни libcurl, ни библиотеку TLS.

doctor --fix отказывается работать, если уже настроен эндпоинт OTEL вне петлевого адреса

Установка идёт через brew install --cask zaghaghi/tap/toolog или загрузку .dmg из релизов; сборка универсальная, подписана Developer ID и нотаризована, поэтому предупреждения Gatekeeper не будет. Один и тот же бинарник служит и приложением в строке меню, и командной строкой: toolog doctor --fix настраивает телеметрию Claude Code, toolog backfill импортирует накопленную историю.

doctor --fix пишет только в ~/.claude/settings.json, сливает значения вместо перезаписи и оставляет копию с отметкой времени. Команда toolog uninstall возвращает файл побайтово из этой копии, а если его правили после установки, удаляет только шесть собственных ключей и поясняет, почему не восстановила остальное. Записанная история сохраняется, пока не добавлен --delete-data.

База остаётся обычным файлом SQLite намеренно: в проекте объясняют это тем, что так утверждения из PRIVACY.md проверяются без доверия к самой программе. Шифрование данных на диске рассматривали и отклонили в пользу FileVault, поэтому доступ к диску означает и доступ к журналу вызовов.

Что остаётся вне записи

Решения о доступе и задержки существуют только для сессий, записанных вживую: линия OTEL не воспроизводится, сессия, прошедшая при выключенном toolog, восстанавливается через backfill без слоя одобрений, а toolog verify сообщает, каких именно сессий это касается. Стоимость запросов сохраняется, но нигде не показывается: записи api_request считаются, траты и токены не выводятся. Про Linux сказано, что перенос потребует юнита systemd, сроков нет.

Комментарии

Пока никто не написал. Будьте первым.

Присоединяйтесь к разговору

Войдите через Google, чтобы оставить комментарий. Имя и аватар подставятся из вашего профиля Google, а комментарий появится после модерации.

Из Google мы используем только имя и аватар. Почту не сохраняем.