Агенты и рабочие деревья
Каждая сессия агента, которая работает через 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); MCPwhoamiвозвращает его вместе со способом привязки.
Видеть агентов и говорить с ними
| Команда | Инструмент 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 list | worktree_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 и Devinpost_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.
| Host | Hooks | Agent row from | Native worktrees | Adopting a host-made worktree |
|---|---|---|---|---|
claude | yes | hooks | .claude/worktrees/<name>; WorktreeCreate/WorktreeRemove могут заменить значение по умолчанию (перенаправление rtok ожидает T159) | worktree_adopt |
cursor | yes | hooks | ~/.cursor/worktrees/, предел 25 | worktree_adopt; скрипт после создания: agents install --project |
codex | yes | hooks | $CODEX_HOME/worktrees, хранит 15 | worktree_adopt |
windsurf | no | MCP | ~/.windsurf/worktrees/<repo>, предел около 20 | worktree_adopt; скрипт после создания: agents install --project |
devin | yes | hooks | использует пул Windsurf | worktree_adopt; скрипт после создания: agents install --project |
kilo | no | MCP | .kilo/worktrees/ | worktree_adopt; скрипт после создания: agents install --project |
grok | no | MCP (GROK_SESSION_ID) | рабочие деревья субагентов --parallel, путь не проверен | worktree_adopt |
mimo | no | MCP | auto_worktree и режим оркестратора | worktree_adopt |
omp | no | MCP | изоляция по задачам | worktree_adopt |
antigravity | no | нет (ни хуков, ни записи MCP) | режим на каждый разговор, путь не проверен | CLI rtok worktree adopt |
opencode | no | MCP | встроенных нет | worktree_add |
pi | no | нет (ни хуков, ни записи MCP) | в ядре нет | только CLI |
zcode | yes | hooks | не найдено | worktree_add |
kimi | yes | hooks | не задокументировано | worktree_add |
copilot | yes | hooks | для этого интерфейса не задокументировано | worktree_add |
vscode | no | MCP | отдельная функция окна Agents, путь не проверен | worktree_adopt |
commandcode | yes | hooks | не задокументировано | worktree_add |
gemini | yes | hooks | не найдено | worktree_add |
cline | yes | hooks | нет (контрольные точки, а не рабочие деревья) | worktree_add |
roo | no | MCP | ещё не проверено | worktree_add |
junie | no | MCP | ещё не проверено | worktree_add |
droid | no | MCP | ещё не проверено | worktree_add |
kiro | no | MCP | ещё не проверено | worktree_add |
amp | no | MCP | ещё не проверено | worktree_add |
warp | no | MCP | ещё не проверено | worktree_add |
crush | no | MCP | ещё не проверено | worktree_add |
openhands | no | MCP | ещё не проверено | worktree_add |
augment | no | MCP | ещё не проверено | worktree_add |
reasonix | no | MCP | ещё не проверено | worktree_add |
qwen | yes | hooks | ещё не проверено | worktree_add |
codebuddy | yes | hooks | ещё не проверено | worktree_add |
goose | no | MCP | ещё не проверено | worktree_add |
continue | no | MCP | ещё не проверено | worktree_add |
codewhale | yes | hooks | не задокументировано | worktree_add |
aider | no | нет | нет | только CLI |
zed | no | MCP | треды могут указывать на созданное вами рабочее дерево | 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.