Anthropic добавила в Claude Code кросс-сессионные сообщения — механизм, позволяющий одной сессии Claude Code передать сообщение другой. Когда изменение в одной сессии ломает то, что строится в другой, Claude может предупредить об этом заранее. Когда одна сессия находит ответ на вопрос, который блокирует другую, — может переслать этот ответ.

Сообщение — это фрагмент текста, который один Claude пишет другому, а не история переписки или файлы. Чтобы перенести целиком разговор или его контекст, используется возобновление сессии, а не сообщения.

Для этого используются два инструмента: ListAgents — чтобы узнать, какие агенты доступны, и SendMessage — чтобы отправить сообщение конкретному агенту по имени. Тем же SendMessage Claude может обращаться и к субагентам, и к участникам agent team внутри одной сессии или команды. Материал ниже посвящён именно обмену сообщениями между независимыми сессиями.

Когда использовать кросс-сессионные сообщения

Механизм пригодится, когда одной из сессий нужно что-то сообщить другой прямо посреди задачи. Claude может отправить сообщение сам, заметив необходимость — например, после изменения, затрагивающего работу другой сессии, — либо пользователь может попросить его об этом. Типичные сценарии:

  • Передача находки: когда одна сессия обнаруживает breaking change или принимает решение, Claude кратко излагает его для сессии, работающей над затронутой областью, — не приходится объяснять это заново.
  • Координация параллельных worktree: если сессии работают с одним репозиторием в разных worktree, Claude может сообщить остальным, что именно было влито.
  • Статус долгой задачи: миграция или тестовый прогон может отчитаться той сессии, за которой наблюдает пользователь, либо статус можно запросить самостоятельно.
  • Ответ между машинами: можно ответить на сообщение, пришедшее от одной из сессий на другой машине или из веб-версии. Между машинами Claude умеет только отвечать — начать переписку самостоятельно не может.

Обмен сообщениями предназначен для независимых сессий, которые пользователь запускает и направляет сам. Для остальных сценариев работы с несколькими сессиями в Claude Code есть отдельные функции:

  • Чтобы продолжить разговор в другом терминале или передать его контекст новой сессии — возобновление сессии
  • Для скоординированной команды сессий, которые Claude порождает и контролирует сам, — agent teams
  • Чтобы наблюдать и управлять множеством сессий из одного места — agent view
  • Чтобы управлять сессией с телефона или другого устройства самостоятельно, а не через переписку сессий между собой, — Remote Control
  • Чтобы передавать в сессию внешние события — результаты CI или сообщения из чата — channels

Отправка сообщения в другую сессию

Когда одна сессия узнаёт что-то нужное другой — находку, статус, решение, — Claude передаёт это сам, вместо того чтобы копировать текст между терминалами вручную. Цель определяется через ListAgents, отправка — через SendMessage, так что вызывать эти инструменты напрямую не требуется. Claude может отправить сообщение по собственной инициативе, а можно попросить его об этом явно.

Чтобы запросить отправку самостоятельно, достаточно сказать Claude, что должна узнать или сделать другая сессия. Ниже — пример запроса, который вводит пользователь, а не сообщение, отправляемое Claude:

Ask the session running in my other terminal whether the migration finished

Текст самого сообщения Claude формулирует самостоятельно, поэтому запрос может не диктовать формулировку. Следующий запрос просит просто передать суть, не указывая конкретных слов, — итоговый текст будет каждый раз разным:

Explain what we just did to the session working on the payments API

Как выглядит сообщение, когда оно приходит получателю, показано в разделе «Как выглядит сообщение».

Доставка сообщения

Получающий Claude читает сообщение между вызовами инструментов во время активного хода, поэтому выполняющийся инструмент никогда не прерывается. Если сессия-получатель простаивает, Claude Code начинает с этим сообщением новый ход.

Между двумя обычными интерактивными сессиями с настройками по умолчанию сообщение доставляется. Но гарантии доставки нет для любой конфигурации: каждое входящее сообщение проверяется по собственным правилам приёма сессии-получателя, и результат — один из трёх:

  • Доставлено: Claude Code передаёт сообщение принимающему Claude.
  • Отложено: Claude Code откладывает сообщение, не доставляя его. Отложенное сообщение попадёт к Claude только после одобрения пользователем либо при последующем изменении режима или настроек.
  • Отклонено: Claude Code отбрасывает сообщение без доставки.

После доставки сообщение засчитывается в расход токенов так же, как введённый вручную запрос, а принимающий Claude может ответить отправителю тем же способом — за исключением одностороннего случая между машинами.

Границы разрешений остаются привязаны к сессии. Claude инструктируют никогда не просить другую сессию выполнить действие, которое было отклонено или заблокировано в его собственной сессии либо запрещено её настройками разрешений, — вместо этого такая работа возвращается пользователю. На принимающей стороне к содержимому сообщения по-прежнему применяются собственные правила и запросы на разрешения этой сессии.

Список доступных сессий

Claude сам находит адресата сообщения, поэтому перед отправкой ничего запускать не нужно. Чтобы увидеть список доступных сессий самостоятельно, используется команда /list-agents. Она перечисляет каждую сессию с именем, на которое та откликается, — именно по этому имени Claude адресует сообщение. В список входят:

  • Субагенты: агенты, работающие внутри текущей сессии. Участники agent team в списке не показываются — Claude обращается к ним через собственный реестр команды.
  • Другие локальные сессии: сессии Claude Code, запущенные на той же машине, включая фоновые сессии. Сессия появляется в списке, только если у неё привязан сокет входящих сообщений.
  • Сессии на других машинах: отображаются, пока подключён Remote Control, и помечены как Remote Control. Это сессии на других машинах пользователя и сессии Claude Code в вебе. Начать переписку с такой сессией Claude не может — только ответить на пришедшее от неё сообщение. Подробнее — в разделе «Сообщения между машинами».

Сессия откликается на имя, заданное командой /rename или флагом --name. Если имя не задано, Claude Code присваивает его сам: интерактивная сессия получает имя, производное от папки рабочей директории, например myapp-3f.

Две сессии могут получить одинаковое имя. Вывод /list-agents показывает рабочую директорию каждой локальной сессии, что позволяет различить одноимённые сессии, запущенные в разных папках. Собственный список Claude при коллизии имён добавляет к каждой строке короткий идентификатор и использует его в адресе.

Сообщения между машинами

Где именно работает другая сессия — определяет, как передаётся сообщение и что может отправить текущий Claude:

Где работает другая сессияКак передаётся сообщениеЧто может отправить текущий Claude
На этой же машинеЧерез сокет конкретной сессии, никогда не через серверы AnthropicНовые сообщения и ответы
На другой машине пользователяЧерез серверы Anthropic, приходит через подключение Remote Control этой машиныТолько ответы
В Claude Code в вебеЧерез серверы Anthropic, напрямую в облачную сессиюТолько ответы

Доставка на той же машине работает везде, где включена сама функция. Каждая сессия регистрирует себя в файлах на диске и привязывает там свой сокет входящих сообщений. При составлении списка или отправке сообщений локальным сессиям Claude Code читает эти файлы, поэтому две сессии могут дотянуться друг до друга только если видят одни и те же файлы. У контейнера своя файловая система, поэтому сессия внутри него и сессия на хосте друг друга не видят. Две сессии внутри одного контейнера, включая self-hosted раннер, обмениваться сообщениями всё же могут.

Для ответа нужен обратный адрес, и почти каждое сообщение его содержит. Ответ сессии на другой машине, отправленный при отключённом Remote Control, всё равно уходит как прямой запрос к серверам Anthropic, но приходит без обратного адреса — ответить на него получатель не сможет. Claude предупреждают об этом в момент отправки.

Чтобы требовать подтверждения перед отправкой любого сообщения за пределы текущей машины, используется настройка isolatePeerMachines.

Как сессия обрабатывает входящее сообщение

Когда сессия A отправляет сообщение сессии B, Claude Code сообщает Claude сессии B, что сообщение пришло от другой сессии, а не от пользователя, и ограничивает его возможности:

  • Не может ничего одобрить: сообщение от другой сессии никогда не считается согласием пользователя и не может ответить на ожидающий запрос разрешения от его имени.
  • Не может менять конфигурацию: Claude Code инструктирует принимающего Claude никогда не менять настройки разрешений, CLAUDE.md или прочую конфигурацию по просьбе другой сессии.
  • Команды не выполняются: команда в тексте сообщения, например /compact, приходит как обычный текст и никогда не исполняется.
  • Запросы на разрешения по-прежнему срабатывают: если для действия по сообщению нужно разрешение, которого у принимающей сессии нет, появляется тот же запрос, что и для любой другой работы.

Как выглядит сообщение

Когда сообщение приходит, оно появляется в диалоге с указанием отправителя — в очереди, если Claude в середине хода, либо сразу запускает новый ход, если сессия простаивает. После прочтения Claude Code сворачивает его в однострочную запись Message from, которую можно развернуть сочетанием Ctrl+O.

Сообщение — это текст, который один Claude пишет другому. Оно приходит с именем отправителя и обратным адресом, кроме одностороннего ответа между машинами, у которого обратного адреса нет. Пользователь видит имя и текст, а принимающая сессия получает только этот текст — никогда историю переписки или файлы отправителя.

Пример того, как сообщение, написанное одним Claude другому, выглядит на стороне получателя:

Schema migration finished: the new column is tenant_id, and rebasing on main is safe now.

Управление входящими сообщениями

Настройка crossSessionInbound определяет, как сессия обрабатывает сообщения, приходящие от других сессий пользователя:

ЗначениеПоведение
acceptClaude Code доставляет каждое сообщение Claude
holdClaude Code показывает уведомление по каждому сообщению и не доставляет его. Если позже начинает применяться accept согласно правилам приоритета, отложенные сообщения доставляются
refuseClaude Code отбрасывает каждое сообщение без доставки

Какое значение действует в конкретном случае, определяется правилами приоритета crossSessionInbound из справочника настроек. Если ни одно значение не задано явно, Claude Code решает для каждого сообщения на основе режимов разрешений обеих сессий. Сессии, которые пропускают запросы на разрешения, объединяются в один класс, все остальные — в другой. Plan mode считается пропускающим режимом в сессиях, где доступен bypass permissions, а auto, acceptEdits и dontAsk считаются запрашивающими:

  • Принимающая сессия запрашивает разрешения: Claude Code доставляет каждое сообщение. Откладывает для одобрения только те, чей отправитель заявляет о себе как о пропускающем запросы на разрешения.
  • Принимающая сессия пропускает запросы на разрешения: Claude Code откладывает каждое сообщение для одобрения. Доставляет только те, чей отправитель также заявляет о себе как о пропускающем.

Когда сообщение откладывается по умолчанию, Claude Code открывает диалог подтверждения в принимающей сессии с именем отправителя и превью текста:

  • Approve доставляет это конкретное сообщение Claude.
  • Deny или закрытие диалога отбрасывает сообщение.
  • Если диалог остаётся без ответа дольше срока dialogExpiry (по умолчанию пять минут), он закрывается, а сообщение отбрасывается.
  • Если класс режима разрешений сессии меняется, пока сообщения отложены, Claude Code заново применяет правила приёма, доставляет то, что теперь допустимо, и показывает уведомление.
  • Если изменение приводит к тому, что начинает действовать refuse при наличии отложенных сообщений, Claude Code отбрасывает все отложенные сообщения и сообщает об отказе каждому доступному отправителю.

Если отправитель работает на той же машине, Claude Code сообщает ему о результате: уведомление появляется в момент откладывания сообщения, а последующее — когда получатель его доставляет, отклоняет или срок истекает. Сообщение, отклонённое сразу при получении, никакого уведомления на стороне отправителя не создаёт.

Claude Code хранит не более 100 отложенных сообщений (отдельно от очереди доставки), сверх этого лимита отбрасываются самые старые.

Неинтерактивные сессии

Claude Code привязывает сокет входящих сообщений для сессии claude -p так же, как для интерактивной, поэтому долго работающий -p-воркер может получать сообщения и появляется в списке. При запуске сессии в bare mode сокет не привязывается, поэтому такая сессия не может получать сообщения и не появляется в списке агентов.

Сессия -p не может показать диалог подтверждения — отложенное сообщение так и остаётся отложенным. Claude Code доставит его, только если позже режим или настройки это разрешат, по тем же правилам, что описаны выше. Чтобы позволить -p-воркеру принимать сообщения без присмотра, его нужно запустить со значением accept для crossSessionInbound в параметре --settings. Значение accept в пользовательских настройках тоже сработает, но будет применяться ко всем сессиям пользователя.

Сокет входящих сообщений сессии

Этот раздел пригодится, если ожидаемая сессия не появляется в списке агентов, нужно отправлять сообщения в сессию из скрипта или хука, либо песочница не может достучаться до сокета.

Claude Code привязывает сокет входящих сообщений для каждой сессии с включёнными кросс-сессионными сообщениями — через него другие сессии на машине доставляют сообщения. Доступ к сокету ограничен пользователем операционной системы, поэтому на общей машине сессии другого пользователя до него не дотянутся. О том, для каких типов сессий сокет привязывается, — в разделе «Неинтерактивные сессии» выше.

Путь к сокету можно найти двумя способами:

  • Команда /status показывает его в строке Peer address с префиксом uds:.
  • Claude Code передаёт его в хуки и Bash-команды через переменную окружения CLAUDE_CODE_MESSAGING_SOCKET. Экспорт происходит до запуска любого хука, включая SessionStart. Каждая сессия экспортирует собственный сокет, а не унаследованный от родительской.

Сообщения, приходящие через сокет, проходят те же правила приёма, что и любое другое сообщение от других сессий, с одним исключением и одним условием:

  • Сообщения от собственных дочерних процессов: если ни одно значение crossSessionInbound не применяется, Claude Code доставляет сообщение, если удаётся проверить, что оно пришло от дочернего процесса самой сессии — например, от хука или Bash-команды, отправляющей сообщение в собственный сокет своей сессии. На Linux, в том числе внутри WSL 2, проверка возможна даже для уже завершившегося дочернего процесса, на macOS — только пока процесс ещё работает, а в контейнерах, где Claude Code запущен с PID 1, проверка невозможна вовсе. Когда проверить не удаётся, сообщение обрабатывается как любое другое без заявленного класса разрешений, поэтому сессия, пропускающая запросы на разрешения, откладывает его для одобрения.
  • Сессии в песочнице: возможность Bash-команды достучаться до сокета изнутри песочницы регулируется настройками Unix-сокетов песочницы — sandbox.network.allowAllUnixSockets и sandbox.network.allowUnixSockets.

Ограничение кросс-сессионных сообщений

Помимо настроек по умолчанию для отдельных сообщений, обмен можно сузить двумя способами: потребовать подтверждения перед выходом сообщения за пределы машины либо полностью отключить функцию для сессии или организации.

Подтверждение для сообщений между машинами

Установка isolatePeerMachines в true требует явного подтверждения перед тем, как любой SendMessage дойдёт до сессии за пределами этой машины:

{
  "isolatePeerMachines": true
}

При этой настройке Claude Code запрашивает подтверждение перед отправкой ответа Claude сессии на другой машине, даже в режиме bypassPermissions, который обычно пропускает стандартные запросы разрешений. Значение true, заданное в любой области настроек, действует безусловно, поэтому файл проекта в системе контроля версий может включить это требование, но не отключить его. Сообщения между сессиями на одной машине запросов не вызывают.

Отключение кросс-сессионных сообщений

Приём и отправка регулируются отдельно, поэтому можно отключить любое из направлений или оба сразу. Для входящих сообщений используется crossSessionInbound, для того, что может отправлять и просматривать текущий Claude, — правила разрешений:

  • Отключить приём: установить crossSessionInbound в refuse — Claude Code будет отбрасывать входящие сообщения от других сессий без доставки. Заданное в настройках проекта или локальных настройках значение refuse имеет приоритет над всеми остальными источниками, а заданное в пользовательских настройках применяется, если managed settings или флаг --settings не задают своё значение.
  • Отключить отправку и просмотр списка: добавить правила запрета разрешений для SendMessage и ListAgents. Оба принимают просто имя инструмента без уточнений.

Администраторы могут отключить обе стороны для всей организации через managed settings, сочетая правила запрета с refuse:

{
  "permissions": {
    "deny": ["SendMessage", "ListAgents"]
  },
  "crossSessionInbound": "refuse"
}

При такой настройке Claude Code по-прежнему привязывает сокет входящих сообщений для каждой сессии, но отбрасывает всё, что через него приходит, ничего не передавая Claude. Запрет SendMessage также убирает возможность обмена сообщениями с субагентами и участниками agent team, поскольку используется один и тот же инструмент. Сессия с отключённым приёмом не показывает никаких видимых изменений — ни в собственном /status, ни в списках других сессий, поэтому настройку стоит проверять по конфигурации самой сессии.

Доступность

Кросс-сессионные сообщения требуют Claude Code версии 2.1.224 или новее. Доступность также зависит от платформы, провайдера и конфигурации:

  • Операционная система: доступно на macOS и Linux, включая Linux внутри WSL 2. На нативном Windows функция не поддерживается.
  • Провайдер: недоступна в Amazon Bedrock, Claude Platform на AWS, Agent Platform от Google Cloud и Microsoft Foundry.
  • Feature-флаги: если любая из переменных CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC, DISABLE_TELEMETRY, DO_NOT_TRACK или DISABLE_GROWTHBOOK отключает оценку feature-флагов, от которой зависит функция, кросс-сессионные сообщения остаются выключенными. У каждой переменной свои значения, вызывающие это; соответствующую нужно снять. Эти переменные могут задаваться в shell, в карте env файла настроек или в managed settings.

Проверить доступность в конкретной сессии можно командой /list-agents (доступна также как /peers). Результат позволяет отличить сессию, у которой функция вовсе отсутствует, от сессии, где сообщение заблокировало что-то более узкое — например, отсутствующий инструмент SendMessage или отклонённая отправка:

  • /list-agents не распознаётся: у сессии нет кросс-сессионных сообщений. Стоит пройтись по требованиям выше, начав с claude --version для проверки версии.
  • /list-agents работает, но сообщение не дошло: функция включена, но что-то более узкое её ограничивает. Правило запрета разрешений может убирать инструменты SendMessage и ListAgents, правила приёма получателя могут откладывать или отбрасывать отправленное, а сессия за пределами этой машины может быть только для ответов.

В сессии с включёнными сообщениями /status также показывает строку Peer address с собственным адресом входящих сообщений этой сессии.

Ограничения

Ограничения ниже — это свойства самого канала сообщений, действующие везде, где работает функция. О пробелах по платформам и провайдерам — см. раздел «Доступность».

  • Только простой текст: между сессиями передаётся только обычный текст. Структурированные протокольные сообщения agent team остаются внутри команды.
  • Циклы сообщений дросселируются: Claude Code ограничивает частоту повторяющихся сообщений от одного отправителя, отбрасывает идентичные повторы, приходящие в короткий промежуток времени, и ограничивает количество принятых, но ещё не прочитанных сообщений 50 на сессию. Благодаря этому цикл сообщений между двумя сессиями останавливается сам собой.

Связанные материалы