
Когда я разрабатывал конвейер для перевода книг целиком, для его тестирования мне понадобилось использовать консольных агентов разных производителей: Claude Code, Codex и Antigravity CLI (agy). Поскольку ведущие нейросети у каждого поставщика сейчас обладают примерно одинаковым уровнем интеллекта, возникла мысль задействовать их все и для самой разработки. Но так как все мои тарифы дешёвые, по 20 долларов, пятичасовые квоты на них быстро кончаются — обычно в самый разгар отладки. Вместе с этой тройкой всё чаще используются открытые консольные агенты Pi и Hermes — через них разработчики подключают модели DeepSeek, GLM, Grok и локальные нейросети, когда заканчиваются лимиты основных подписок. Поэтому потребовалось организовать качественную передачу сессий между агентами без размытия смысла.
При наличии второго оплаченного аккаунта Claude Code можно перелогиниться и продолжить диалог штатным ключом --resume. Сессия подхватится с диска, хотя серверный кеш промптов при смене учётной записи сбросится и повторная прокачка длинной истории сразу откусит заметный кусок новой квоты. Но когда лимиты выгорели на всех аккаунтах Claude и нужно пересесть в Codex, AGY, Pi или Hermes, штатного моста нет.
Обычный совет для такой ситуации — попросить агента перед уходом записать текущее состояние задачи, сделанные шаги и план в файл HANDOFF.md. На практике этот способ неоптимален по трём причинам:
Внезапная остановка. Когда пятичасовой лимит исчерпан, агент перестаёт отвечать на запросы. Попросить его подвести итоги и записать файл уже нельзя.
Искажения при пересказе. Даже если уловить момент за пару шагов до блокировки, мы заставляем нейросеть по памяти пересказать собственную историю. Входное контекстное окно современных моделей вмещает от двухсот тысяч до миллиона токенов, тогда как максимальная длина одного ответа жёстко ограничена несколькими десятками тысяч токенов. Из-за этого потолка неизбежно происходит агрессивный компактизирующий пересказ: пропадают точные аргументы команд запуска, номера строк, отвергнутые гипотезы и мелкие правки, а качество работы в следующем агенте заметно падает.
Высокая стоимость генерации. Выходные токены у провайдеров обычно в пять раз дороже входных и впятеро быстрее сжигают остаток пятичасовой квоты. Заставлять модель генерировать длинную сводку на излёте лимитов накладно по деньгам и по квоте.
Вторая задача возникает, когда лимиты ещё есть, но нужно встать из-за домашнего компьютера с Calculate Linux, взять ноутбук и продолжить работу с того же места в дороге. Заливать ради этого в основную ветку репозитория сырой некомпилирующийся код неудобно, а во многих рабочих папках со скриптами или конфигами системы контроля версий нет вовсе — либо используется SVN или Fossil.
Чтобы забирать контекст напрямую из локальных файлов одного агента и без потерь передавать его другому на одной машине или через сеть на другой компьютер, я написал на Go открытую консольную утилиту и навык baton. Инструмент работает на Linux, macOS и Windows и поддерживает пять консольных агентов: claude, codex, agy, pi и hermes.
Как агенты хранят историю на диске
Каждый консольный агент ведёт на диске подробный журнал сессии в своём формате. При выполнении команды /compact старые реплики из файла не удаляются: журналы работают на дозапись, а в момент сжатия контекста в поток добавляется запись со сводкой предыдущего разговора.
Агент |
Где лежат сессии (Linux, macOS, Windows) |
Формат хранения |
Как отмечено сжатие контекста |
|---|---|---|---|
Claude Code ( |
|
Строки JSON с блоками |
Запись |
Codex CLI ( |
|
Строки JSON с событиями диалога и вызовами оболочки |
Событие |
Antigravity CLI ( |
|
Журнал шагов в JSONL и бинарный слепок Protobuf |
Узел |
Pi ( |
|
Древовидный журнал JSONL v3 с полями |
Запись |
Hermes ( |
|
База SQLite (таблицы |
Цепочка |
Попытка прочитать такой журнал целиком и вывалить его содержимое в окно чата новому агенту приведёт к сбою. За полчаса активной отладки лог разрастается до десятков мегабайт за счёт распечаток прочитанных файлов и выводов компилятора. Такой объём сразу забьёт контекстное окно новой модели.
Поэтому baton разделяет оперативную сводку и полное файловое хранилище сессии:
Точка отсчёта от последнего сжатия. Парсер проходит журнал с первой записи (в Pi — по активной ветке дерева
parentId, а в Hermes — по цепочкеparent_session_id), собирая список всех изменённых файлов и выполненных команд за всё время работы. При встрече маркера/compactбуфер старых реплик сбрасывается — в оперативную сводку попадает текст последнего сжатия и все последующие сообщения без сокращений.Распаковка в системный временный каталог. Полная история диалога, все шаги до сжатия и длинные выводы команд сохраняются во временную директорию операционной системы:
/tmp/baton-handoff/<id-сессии>/на Linux и macOS или%TEMP%\baton-handoff\<id-сессии>\на Windows (папки старше суток удаляются автоматически). Размещение дампов во временном каталоге решает две задачи: рабочее дерево проекта остаётся чистым дляgit status, а домашний раздел пользователя не забивается старыми логами. В чат агенту выводится компактная сводка: метаданные, состояние репозитория, список затронутых файлов, последние выполненные команды, текст последнего сжатия, свежие реплики диалога и пути к файлам вbaton-handoff.Чтение деталей по требованию. Получив сводку, новый агент сразу видит, на какой строчке оборвалась работа. Если ему понадобится полный вывод старой ошибки сборки или реплика из начала сессии, он открывает файл
full_dialogue.mdво временной папке или запрашивает конкретный шаг командойbaton turn <session_id> <turn_id>.
Почему навык и одноразовая утилита лучше постоянного MCP-сервера
Изначально напрашивалась идея оформить инструмент в виде MCP-сервера, однако у серверной схемы обнаружились два недостатка. Во-первых, любой подключённый MCP-сервер запускается агентом при старте каждого сеанса и висит в оперативной памяти всё время работы терминала. Во-вторых, при старте каждого чата описания всех MCP-функций добавляются в системный промпт, отъедая входные токены даже тогда, когда вы неделями не переносите сессии.
Связка одноразовой консольной утилиты baton и файла навыка SKILL.md лишена этих недостатков. Все пять поддерживаемых агентов умеют подгружать навыки по мере необходимости: пока вы работаете над обычной задачей, в памяти модели хранится лишь одна строчка описания навыка. Когда вы просите перехватить сессию, агент активирует SKILL.md, вызывает baton как обычную команду, за миллисекунды получает готовую сводку, после чего процесс baton сразу завершается.
Инструмент написан на Go с использованием только стандартной библиотеки, никаких внешних зависимостей. В разделе релизов на GitHub лежат готовые сборки, однако безопаснее скомпилировать этот открытый код локально.
Чтобы автоматически прописать навык во все установленные агенты, в корне репозитория https://github.com/sukamenev/baton лежит инструкция INSTALL.md, рассчитанная на выполнение самой моделью. Запустите любой из установленных агентов (claude, codex, agy, pi или hermes) и отправьте ему запрос:
Прочитай инструкцию https://raw.githubusercontent.com/sukamenev/baton/main/INSTALL.md, клонируй репозиторий https://github.com/sukamenev/baton и установи инструмент baton из исходного кода для всех найденных у меня консольных агентов (claude, codex, agy, pi, hermes). Проверь наличие компилятора Go, собери бинарник в ~/.local/bin/baton, выполни baton install для установки навыка SKILL.md и слэш-команды /baton, а затем проверь работоспособность вызовом baton status.
Вариант запроса на английском языке:
Read https://raw.githubusercontent.com/sukamenev/baton/main/INSTALL.md, clone the repository https://github.com/sukamenev/baton, and install baton from source for all CLI agents installed on my system (claude, codex, agy, pi, hermes). Verify that the Go compiler is available, build the binary into ~/.local/bin/baton, run baton install to install the SKILL.md skill and the /baton slash command, and then verify the installation by running baton status.
Для ручной установки понадобится компилятор Go. В моей рабочей системе Calculate Linux (и в Gentoo) это пакет dev-lang/go. В других дистрибутивах пакет называется go (Arch Linux и openSUSE), golang-go (Debian и Ubuntu) или golang (Fedora). Сборка и регистрация укладываются в три команды:
git clone https://github.com/sukamenev/baton.git /tmp/baton cd /tmp/baton && go build -ldflags="-s -w" -o ~/.local/bin/baton . ~/.local/bin/baton install
Команда baton install не трогает основные конфигурационные файлы агентов. Она копирует SKILL.md в каталоги навыков всех пяти клиентов (~/.claude/skills/baton/, ~/.codex/skills/baton/, ~/.gemini/config/skills/baton/, ~/.pi/agent/skills/baton/ и ~/.hermes/skills/baton/) и добавляет шаблон быстрой слэш-команды /baton.
Пара команд save и load: именованные сессии и список кандидатов
Рекомендуемый способ работы строится вокруг привычной пары команд save (сохранить) и load (загрузить). Дать текущей сессии понятное имя можно штатной командой самого агента (тогда имя запишется в поле customTitle у Claude, session_index.jsonl у Codex, session_info у Pi или колонку title таблицы sessions у Hermes) либо через baton save:
Сохрани текущую сессию под именем auth-refactor
В ответ утилита фиксирует имя сессии и сразу печатает готовый промпт для копирования в следующего агента — причём с подсказкой репозитория на случай, если в целевом окружении baton ещё не установлен:
Saved session name: auth-refactor ([claude] a81f9c20.jsonl) To continue in another agent, paste this prompt: Load session auth-refactor using baton (if baton is not installed, install it from https://github.com/sukamenev/baton following INSTALL.md) or run: /baton load auth-refactor
Когда пятичасовой лимит в Claude исчерпан, откройте в том же каталоге codex, agy, pi или hermes и вставьте эту строку (или просто напишите обычными словами, если baton уже установлен):
Продолжи сессию auth-refactor
Или ещё короче, если нужно просто подхватить самую свежую прерванную сессию в текущей папке проекта:
Подхвати последнюю сессию
В файле навыка SKILL.md зашита таблица перевода таких фраз на естественном языке в команды утилиты, поэтому агент любого семейства без угадывания параметров сам выполнит baton load auth-refactor или baton load. При желании то же самое вызывается слэш-командой /baton load auth-refactor.
Как быть, если лимит оборвал работу внезапно, а дать сессии имя вы забыли? Достаточно спросить агента «Какие есть свежие сессии?» (или вызвать baton list), и утилита выведет пронумерованный список сессий-кандидатов с указанием рабочей папки, времени изменения и текста первого запроса:
# Session Candidates (showing top 3) #1 [claude] (unnamed) — `a81f9c20.jsonl` (2026-10-30 12:14:09) Workdir: `/home/user/proj` Preview: {"type":"user","message":{"content":"Почини гонку в пуле воркеров..."}} #2 [claude] billing-fix — `7b02e114.jsonl` (2026-10-30 10:02:41) Workdir: `/home/user/billing` Preview: {"type":"user","message":{"content":"Проверь округление НДС..."}}
После этого напишите агенту «Загрузи первую сессию» (или /baton load 1). Агент подтянет выбранную сессию в /tmp/baton-handoff/, сверит файлы на диске и продолжит задачу со следующей строчки.
Перенос сессии и несохранённых файлов на другой ноутбук
Второй сценарий: нужно уйти из-за домашнего компьютера и продолжить работу на ноутбуке, когда в рабочей папке лежат недописанные файлы, а коммитить сырой код в общую ветку нельзя (или проект вообще ведётся без Git).
Помимо исходного кода, на основной машине часто хранятся локальные файлы инструкций для агентов: проектные CLAUDE.md, AGENTS.md, GEMINI.md, .cursorrules (многие добавляют их в .gitignore), а также глобальные правила из ~/.claude/CLAUDE.md и ~/.gemini/GEMINI.md. Без них агент на ноутбуке потеряет ваши требования к стилю кода.
При сборке сетевого слепка baton упаковывает в архив четыре компонента:
полную историю сессии с точкой последнего сжатия;
изменённые и новые неотслеживаемые файлы рабочего каталога (определяются по истории вызовов записи агента и через статус Git, Fossil или SVN);
локальные проектные файлы правил (
CLAUDE.md,AGENTS.md,GEMINI.md,.cursorrules,.agents/rules/);копию глобальных пользовательских инструкций с исходной машины.
Все четыре компонента собираются в оперативной памяти в единый поток tar.gz средствами стандартных пакетов Go archive/tar и compress/gzip, после чего шифруются на клиенте алгоритмом AES-256-GCM со случайным 256-битным ключом. Упаковщик вкомпилирован прямо в бинарник baton и работает на Linux, macOS и Windows без внешних архиваторов. Потоковый tar.gz даёт здесь ощутимый выигрыш у формата zip: архив zip сжимает каждый файл изолированно, тогда как gzip поверх единого потока tar использует общий словарь скользящего окна сразу для истории диалога и десятков мелких текстовых файлов.
Отправка через каскад обменников
Зашифрованный блок отправляется в бесплатные текстовые обменники без регистрации по цепочке резервирования:
Первым пробуется
paste.rs(принимает до 10 МиБ чистым POST-запросом).При ошибке или блокировке программа переключается на
dpaste.org.Третий резервный рубеж — отправка через TCP-сокет
termbin.com:9999.
Дополнительно поддерживается сохранение слепка в локальную папку облачной синхронизации (Dropbox, Google Drive, Nextcloud, Syncthing) при указании параметра storage="local_dir".
Для отправки сессии напишите текущему агенту «Отправь сессию на другой компьютер» или выполните:
/baton push
Инструмент вернёт токен переноса и готовый самодостаточный промпт:
Encrypted session token: baton:pasters:x9K2m#8f4a2c91e7b03d... To continue in another agent or on a machine where baton is not installed yet, paste this prompt: Load session baton:pasters:x9K2m#8f4a2c91e7b03d... using baton (if baton is not installed, install it from https://github.com/sukamenev/baton following INSTALL.md) or if baton is already installed, run: /baton load baton:pasters:x9K2m#8f4a2c91e7b03d...
Даже если на втором ноутбуке или свежем сервере baton ещё ни разу не ставили, достаточно вставить этот промпт в чат любого агента: он сам прочитает INSTALL.md из репозитория, соберёт утилиту и тут же развернёт вашу сессию. Часть токена до символа # указывает провайдера и идентификатор пакета на сервере, а хвост после # — ключ расшифровки AES-256-GCM. На сервер обменника ключ не передаётся: без него скачанный пакет представляет собой случайный шум.
Развёртывание на второй машине
На ноутбуке откройте каталог проекта в любом из пяти агентов и выполните:
/baton load baton:pasters:x9K2m#8f4a2c91e7b03d...
Программа скачает и расшифрует пакет в памяти, после чего разложит изменённые файлы по рабочему каталогу. Если какой-то локальный файл на ноутбуке отличается от перезаписываемого, перед заменой рядом автоматически создаётся локальный бакап с расширением .baton.bak.
Проектные файлы правил сохраняются в корень проекта, а глобальные пользовательские инструкции с первой машины распаковываются в /tmp/baton-handoff/<id-сессии>/global_rules/ и подключаются в стартовую сводку, оставляя системные конфиги второй машины нетронутыми.
Автообновление
baton поддерживает уведомления о новых версиях. Никаких планировщиков вроде cron или системных служб настраивать не нужно: проверка запускается в тот момент, когда вы или агент обращаетесь к baton по прямому назначению (например, вызываете baton load или baton save). Чтобы сетевой запрос к GitHub не задерживал выдачу контекста ни на миллисекунду, основной процесс baton сразу отдаёт сводку сессии и параллельно порождает независимый дочерний процесс baton update --check-quiet (но не чаще одного раза в сутки по отметке времени в кеше). Если сети нет или версия актуальна, он молча завершается без ошибок; если опубликован новый релиз, при следующем вызове baton выведет короткое уведомление с предложением выполнить baton update.
Сама команда baton update работает в два шага с учётом текущей операционной системы:
При наличии компилятора Go утилита пересобирается из исходного кода вызовом
go install, который сверяет контрольную сумму пакета с глобальным криптографическим журналом прозрачностиsum.golang.org.Если компилятор Go не установлен (частый случай на Windows и macOS), программа определяет текущие
runtime.GOOSиruntime.GOARCH, скачивает из GitHub Releases соответствующий бинарник и файлchecksums.txt, проверяет хешSHA-256, атомарно заменяет исполняемый файл и синхронно обновляетSKILL.mdво всех установленных агентах.
Итоги
Инструмент baton связывает пять популярных консольных агентов — Claude Code, Codex, Antigravity CLI, Pi и Hermes — в общую рабочую среду. При исчерпании пятичасовой квоты соседний агент за долю секунды подхватывает именованную сессию или выбранного из списка кандидата вместе со сводкой /compact, историей команд и списком изменённых файлов. А зашифрованная переброска позволяет закрыть домашний ПК и продолжить ту же сессию на другом ПК без промежуточных коммитов.
Конечно, в наш век консольных агентов любой разработчик может собрать для себя похожий инструмент, потратив на это день и некоторое количество токенов. Если вы решите не пользоваться готовым baton, пусть идея и разобранные здесь форматы хранения сессий и схема бесшовной передачи сессии послужат отправной точкой для вашей собственной утилиты.
Исходный код проекта, инструкция для автоматической установки и файл навыка открыты под лицензией MIT в репозитории github.com/sukamenev/baton.
© 2026 ООО «МТ ФИНАНС»
Qspeve
Есть ли данные по взаимной совместимости этих моделей - понятно что "как-то" они в любом случае подхватят старые сессии, но хорошо ли поймут что в них было?
inetstar Автор
Между большой тройкой (claude, codex, agy) совместимость есть. Во всяком случае в claude из agy загружал. И наоборот. И в codex из agy.