Агенты и рабочие деревья

From docs/ru/agents-and-worktrees.md at cc732c3 View on GitHub

Каждая сессия агента, которая работает через rtok, получает один id агента rtok, а каждое рабочее дерево (worktree) привязано к агенту, которому оно принадлежит, одинаково на всех хостах. Агенты и пользователь могут обмениваться сообщениями по этому id. Эта страница — описание для пользователя (решение D34); таблицы установки по хостам находятся в agents.md, а ключи конфигурации — в config.md.

Id агента

  • Id — случайный UUIDv4, который rtok выдаёт сам; он показывается первыми 8 символами и принимается везде как любой уникальный префикс из 4 и более символов. Id сессий хостов не уникальны между хостами, а у нескольких хостов их нет вовсе, поэтому они никогда не используются как id.
  • Хуки регистрируют агента при первом событии сессии и обновляют его при каждом следующем (SessionStart, вызовы инструментов, SessionEnd). Хосту, чья установка несёт хуки, больше ничего не нужно.
  • MCP обслуживает хост без хуков. rtok mcp --host <host> связывает себя с агентом сессии по собственному id сессии хоста, если хост кладёт его в окружение (Grok Build: GROK_SESSION_ID), иначе по единственному живому агенту этого хоста в том же каталоге, замеченному с момента запуска процесса. Два кандидата не привязывают ничего, поэтому сообщение никогда не попадёт не тому агенту. Хост, который не может нести ни хуки, ни id сессии, получает собственную строку, которую регистрирует процесс MCP.
  • Агент всегда определяется по сессии. Ни один инструмент не принимает аргумент агента или владельца, поэтому модель не может занять рабочее дерево или отправить сообщение от имени другого агента.
  • rtok agents whoami печатает id (RTOK_AGENT_ID, который хук Claude Code кладёт в окружение сессии и приводит в строке контекста начала сессии; если его нет, как в десктопном приложении Claude, — агент сессии из CLAUDE_CODE_SESSION_ID); MCP whoami возвращает его вместе со способом привязки.

Видеть агентов и говорить с ними

КомандаИнструмент MCPЧто делает
rtok agents sessions [--all]agents_listкаждый агент с хостом, состоянием (live, idle, ended), активностью, статусом, занятыми рабочими деревьями и числом непрочитанных; --all добавляет завершённых
rtok agents show <id>agent_showодин агент: хост, модель, id, родитель и субагенты, cwd, занятые рабочие деревья, статус, непрочитанные
rtok agents status <text>agent_status_setчем занят этот агент (не более 120 символов); пустой текст очищает статус
rtok agents send <id> <text>agent_sendсообщение одному живому агенту (с ограничением размера); --all-live отправляет каждому живому агенту проекта отправителя; --task <id> (task в MCP) помечает сообщение задачей, о которой оно, например A12
rtok agents inbox [<id>]agent_inboxваши собственные сообщения, от старых к новым, с пометкой «прочитано»; с id — очередь этого агента, ничего не помечая; --task <id> (task в MCP) читает переписку по одной задаче, остальное остаётся непрочитанным

[agents] idle (по умолчанию 30 минут) решает, кто считается живым. [agents] enabled = false отключает регистрацию и доставку сообщений.

Сообщения

  • Хост с хуками получает новые сообщения вставленными в следующий промпт или результат инструмента, в рамке и в пределах [agents] push_bytes; остальное объявляется как … and N more и читается через agent_inbox. Любой другой хост забирает сообщения сам: строка начала сессии велит вызвать agent_inbox, а читают их инструмент MCP или rtok agents inbox.
  • Безопасность: тело сообщения — это текст от другого агента или человека, но никогда не инструкция. Каждое приходит в фиксированной рамке, называющей id отправителя, управляющие символы удаляются, размер ограничен, и ни один аргумент инструмента не может назвать отправителя. Воспринимайте его как информацию.

Рабочие деревья

Сырой git worktree не записывает ни владельца, ни возраст, ни размер. rtok worktree даёт каждому рабочему дереву одно место, одно имя, одного владельца и одного агента:

КомандаИнструмент MCPЧто делает
rtok worktree add <task> [<slug>]worktree_addсоздаёт <root>/<repo>-<task> на ветке <task>[-<slug>] от свежего origin/<default>, с блокировкой <owner> | <task> | <date> | agent <uuid>, и записывает заявку
rtok worktree adopt [<path>] [--task <id>]worktree_adoptпривязывает рабочее дерево, созданное хостом, к вызывающему агенту; каталог остаётся там, где его поставил хост
rtok worktree claim <path>—то же для существующего рабочего дерева, которое вы назвали; переписывает его блокировку, только когда её нет или она уже ваша
rtok worktree listworktree_listкаждое рабочее дерево репозитория с владельцем, привязанным агентом и его состоянием, origin, размером; а также сироты, которые git больше не перечисляет
rtok worktree remove <path|task>worktree_removeудаляет ваше собственное чистое рабочее дерево и его слитую ветку; отказывает для грязного, для неслитой ветки, для того, в котором вы стоите, и для чужой блокировки, если задача не завершена (слита, чиста, с собственными коммитами); никогда не форсирует
rtok worktree gc, clean—убирают завершённые рабочие деревья, удаляют простаивающие кеши сборки; пробные прогоны до --yes; рабочее дерево живого агента сохраняется, а если его задача завершена и простаивает дольше --idle, оно удаляется при любой блокировке; чужая блокировка на слитом чистом рабочем дереве, не тронутом дольше --stale-lock (7d), считается брошенной

Владелец — это <host> / <model> агента, если вызов CLI не передаёт --owner; вызов MCP никогда его не передаёт. Корень — [worktree] root, по умолчанию ~/.rtok/worktrees. При [worktree] enabled = false rtok не трогает рабочие деревья: каждая команда rtok worktree (и list тоже) сообщает, что они не включены, MCP не перечисляет ни одного инструмента worktree_*, а хуки Claude WorktreeCreate/WorktreeRemove делают то, что Claude делает без rtok.

Рабочие деревья, которые хост создаёт сам

Хост, который создаёт рабочие деревья в собственном пуле (Cursor, Codex, Windsurf и Devin, Kilo, Claude Code, Conductor), не оставляет rtok права голоса в выборе места. Выполните worktree_adopt (или rtok worktree adopt) внутри него: rtok выводит origin из пути, берёт задачу из --task, иначе из старой блокировки, иначе из ветки, и привязывает его.

  • Cursor, Codex и Windsurf/Devin сами удаляют рабочие деревья, чтобы уложиться в предел (около 25, 15 и 20). Переживает ли при этом git-блокировка, не подтверждено, поэтому усыновление там записывает заявку только в хранилище rtok и не пишет блокировку.
  • Любое другое происхождение получает ту же блокировку v2, что и worktree_add.
  • Рабочее дерево, заблокированное кем-то другим, никогда не берётся.
  • Запуск adopt из скрипта после создания у хоста (Cursor .cursor/worktrees.json, Kilo .kilo/setup-script, Windsurf и Devin post_setup_worktree) — настраивается командой rtok agents install <host> --project (хосты cursor, kilo, windsurf, devin): она добавляет одну запись в файл проекта и больше ничего не трогает; rtok agents uninstall <host> --project её убирает. Без названного агента adopt привязывает единственного живого агента хоста этого пула, чей рабочий каталог — репозиторий, а если таких нет или их несколько, откладывает claim без агента и без git-блокировки; его завершает следующий adopt или SessionStart сессии, работающей внутри рабочего дерева; worktree gc такое дерево не трогает. Через навык ниже агент может усыновить всегда.

Навык worktrees сообщает агенту всё это: использовать worktree_add для новой работы, worktree_adopt для рабочего дерева, созданного хостом, worktree_remove после слияния.

По хостам

Hooks — несёт ли обычный rtok agents install хуки (строка агента и доставка сообщений); хост без них регистрируется через MCP. Факты о встроенных рабочих деревьях и источники — в research.md §26.

HostHooksAgent row fromNative worktreesAdopting a host-made worktree
claudeyeshooks.claude/worktrees/<name>; WorktreeCreate/WorktreeRemove могут заменить значение по умолчанию (перенаправление rtok ожидает T159)worktree_adopt
cursoryeshooks~/.cursor/worktrees/, предел 25worktree_adopt; скрипт после создания: agents install --project
codexyeshooks$CODEX_HOME/worktrees, хранит 15worktree_adopt
windsurfnoMCP~/.windsurf/worktrees/<repo>, предел около 20worktree_adopt; скрипт после создания: agents install --project
devinyeshooksиспользует пул Windsurfworktree_adopt; скрипт после создания: agents install --project
kilonoMCP.kilo/worktrees/worktree_adopt; скрипт после создания: agents install --project
groknoMCP (GROK_SESSION_ID)рабочие деревья субагентов --parallel, путь не проверенworktree_adopt
mimonoMCPauto_worktree и режим оркестратораworktree_adopt
ompnoMCPизоляция по задачамworktree_adopt
antigravitynoнет (ни хуков, ни записи MCP)режим на каждый разговор, путь не проверенCLI rtok worktree adopt
opencodenoMCPвстроенных нетworktree_add
pinoнет (ни хуков, ни записи MCP)в ядре неттолько CLI
zcodeyeshooksне найденоworktree_add
kimiyeshooksне задокументированоworktree_add
copilotyeshooksдля этого интерфейса не задокументированоworktree_add
vscodenoMCPотдельная функция окна Agents, путь не проверенworktree_adopt
commandcodeyeshooksне задокументированоworktree_add
geminiyeshooksне найденоworktree_add
clineyeshooksнет (контрольные точки, а не рабочие деревья)worktree_add
roonoMCPещё не провереноworktree_add
junienoMCPещё не провереноworktree_add
droidnoMCPещё не провереноworktree_add
kironoMCPещё не провереноworktree_add
ampnoMCPещё не провереноworktree_add
warpnoMCPещё не провереноworktree_add
crushnoMCPещё не провереноworktree_add
openhandsnoMCPещё не провереноworktree_add
augmentnoMCPещё не провереноworktree_add
reasonixnoMCPещё не провереноworktree_add
qwenyeshooksещё не провереноworktree_add
codebuddyyeshooksещё не провереноworktree_add
goosenoMCPещё не провереноworktree_add
continuenoMCPещё не провереноworktree_add
codewhaleyeshooksне задокументированоworktree_add
aidernoнетнеттолько CLI
zednoMCPтреды могут указывать на созданное вами рабочее деревоworktree_adopt

Любой хост может создавать рабочие деревья через worktree_add (MCP) или rtok worktree add (CLI); хост без строки агента передаёт --owner в CLI. Рабочее дерево, чей путь не совпадает ни с одним из перечисленных выше пулов, перечисляется с происхождением other и усыновляется так же. worktree add также записывает env.CLAUDE_CODE_TASK_LIST_ID = <project>-<task> в .claude/settings.local.json нового рабочего дерева, чтобы сессии Claude Code там делили один список задач; пишется только этот ключ, остальное содержимое файла не меняется, файл, который не является корректным JSON или уже задаёт этот id, остаётся нетронутым с предупреждением, а .claude/ игнорируется git.

Десктоп-приложение Claude

Во вкладке Code десктоп-приложения MCP-инструменты rtok обслуживает один rtok mcp, который приложение запускает из claude_desktop_config.json для всех сессий сразу, а не процесс самой сессии. Этот процесс не находится ни под одной сессией и ни в одном её каталоге, поэтому MCP whoami, worktree_* и agent_* не могут понять, какой агент их вызвал, и отвечают «not linked to an agent session» с этой причиной. Там используйте rtok agents и rtok worktree из shell агента. Чтобы общая запись не скрывала собственный сервер сессии — задача T456.