Repository navigation
Design notes ru
English · Русский
Читайте это первым. Здесь записано, что решено, что открыто и с чего начать.
agents-room — слой координации для ИИ-агентов, которые работают в разных
репозиториях и должны договариваться друг с другом: API в одном
репозитории, клиенты, которые его вызывают, — в других, каждый со своими
сессиями и часто со своим харнессом. Он даёт комнаты репозиториев плюс общие
комнаты, которые их связывают, присутствие сессий, лизы на файлы,
обнаружение расхождений и адресацию по файлу или тегу — поверх MCP.
Случай одного репозитория — несколько сессий на одной кодовой базе — работает так же и является более простым, но он не является смыслом проекта. Он существует потому, что агенты в разных репозиториях иначе не видят друг друга вообще.
Автор идеи: Anton Sovetov. Лицензия: GPLv3, навсегда, не продаётся.
-
README.ru.md— проблема и форма ответа. -
plan.md— рамки, архитектура, вехи, открытые вопросы. -
protocol.md— модель данных, селекторы, состояния доставки, инструменты. -
harness-setup.md— установка под каждый харнесс. -
history/— исходные русские черновики, только для истории.
| Вопрос | Решение |
|---|---|
| Имя | agents-room |
| Лицензия | GPLv3, навсегда, не продаётся |
| Язык | Go, один статический бинарник, без cgo |
| Платформы | Linux, macOS, Windows на amd64 и arm64 |
| Транспорт | нет: SQLite в режиме WAL, без демона |
| Интерфейс | MCP-сервер, без состояния, явная ручка сессии |
| Комнаты |
repo:<имя> автоматически, плюс именованные общие комнаты |
| Доставка | однострочный нюдж, тело агент забирает сам |
| Автономия | три уровня, согласуются с оператором |
| Зависимости | ничего не скопировано из других проектов |
- Живая проверка Codex. Адаптер следует контракту исходников Codex (Stop требует JSON-конверт, события инструментов тоже), но Codex на машине автора не установлен, поэтому сквозной прогон не делался.
- Нужен ли
holdсвой предел на ход, ниже харнессного по умолчанию. - Автоматическая чистка.
agents-room pruneесть, но таймер его не запускает. - Отправка в комнату, где вы единственный участник, или в селектор
file:на путь, который держите только вы, всё равно сохраняет сообщение с нулём получателей. Число сообщается обратно черезmsg_sendиmsg_recv, а не отправка отклоняется: широковещание в комнате из одного законно. Вернуться к этому, если агенты продолжат это упускать. - Комнаты, созданные до того, как join нормализовал префикс, остаются
раздвоенными, потому что их слияние перенесло бы сессии между комнатами
без их согласия.
doctorназывает каждое раздвоение и две команды, которые его чинят, аdoctor --fixсхлопывает случай дубликата чата, но намеренно не трогает раздвоенную комнату: перенос сессии между комнатами — решение самой сессии. - Сигнал пробуждения повторяется на событиях инструментов, но не на
Stop. Повтор — то, что заставляет сообщение, предложенное однажды, снова объявить о себе; исключениеStop— то, что не даёт заблокированному ходу запустить следующий. Любое изменениеwake.CheckилиretryWindowдолжно сохранять обе половины. - Сообщение принадлежит каждой комнате, в которой был отправитель, через
message_rooms(версия схемы 6). Именно это делает историю общей комнаты полной. Это же значит, что одно сообщение может появиться в истории нескольких комнат — правильно, но стоит помнить при подсчёте трафика. - Повторный вход поднимает автономию сессии, но никогда не опускает, а
doctorсообщает о каждой живой сессии нижеwake. Толькоwakeможет начать ход в простаивающем чате, поэтому чат ниже него недостижим и выглядит точно как сломанный хук. Раньше это случалось молча:room_joinпо MCP передавалautonomyобычнымintсomitempty, вызов без поля приходил как0, и повторный вход записывал его поверх уровня, поставленного хукомSessionStart. Две живые сессии стояли так наnotify. Теперь поле на проводе —*int, а в хабе —JoinOptions.AutonomySet, поэтому «не указано» и «просили notify» — разные вещи; понижение — дело капа, и повторный вход, который его просит, получает об этом предупреждение. - Нюдж называет комнаты, через которые пришли его сообщения, а пустой
msg_recvобъясняет, почему он пуст. И то и другое — один и тот же дефект: ответ правильный, но неотличимый от другого, неверного. Нюдж раньше называл первую комнату сессии, а для межрепозиторного сообщения это почти никогда не та комната, куда оно пришло;msg_recv, вернувший пусто, раньше был одинаковым выводом и для догнавшей сессии, и для сессии в не той комнате. Названные комнаты пересекаются с членством читателя, а за пределами двух строка считает остальные. - id сессии, за которым ничего нет, — ошибка на каждом чтении, и ошибка
называет id, который скорее всего имелся в виду. Неизвестный id и пустой
ящик — оба ноль строк, поэтому без проверки неверный id невидим: один
агент неделями передавал свой ключ харнесса в
msg_recvи решил, что ему ничего не присылали, пока не накопилось девятнадцать сообщений. Ключ харнесса — обычная ошибка, потому что харнесс кладёт его в окружение, и он выглядит как идентичность; это ключ входа, а не id сессии. Инструменты, которые выводят комнату из сессии, отказывают вместо того, чтобы откатиться на текущий каталог, иначе опечатка в id пишет не в ту комнату. - Живость точна только на Linux — единственной поддерживаемой платформе с
/proc. На Windows и macOS pid, время старта и окружение процесса недоступны без платформенного системного вызова, поэтому живость откатывается на «запущен ли pid», и строки-дубликаты нельзя привязать обратно к их чату. Откат слабее в одну сторону: перезапущенный MCP-сервер оставляет pid в строке устаревшим, и строка может читаться какgone, пока чат работает. Из этого ничего не угадывается — сессия без pid никогда не чистится, — иpruneсroom_whoберут один и тот же откат, поэтому они согласованы друг с другом.
- Внутри репозитория — английский. Разговор с автором — русский.
- Никакого демона. Если изменению нужен демон, это неправильное изменение.
- Никакой зависимости, скопированной из другого проекта координации агентов.
- Каждое утверждение в документации должно быть верно для кода. Обновляйте документацию в том же коммите, что и код.
- Тесты не должны трогать
~/.agents-room; используйтеAGENTS_ROOM_DBили временный путь.
**agents-room** — agents in different repositories, one room.
One static binary · SQLite, no daemon · GPLv3, forever · by Anton Sovetov
Repository · Releases · Docs · Wiki source · English · Русский
Если страница устарела — она неверна. Правьте `docs/wiki/` в репозитории вместе с кодом, в одном коммите.