Как только вы ответили, карточка остаётся в истории треда и показывает, что именно было выбрано.
Какие бывают карточки
- Вопрос агента. Агент спрашивает, как делать дальше, и предлагает варианты ответа. Вопросов в одном запросе может быть несколько, и ответить нужно на каждый.
- Одобрение команды. Агент собирается выполнить команду в терминале и ждёт разрешения.
- Одобрение правки файлов. Агент собирается применить изменения в файлах и ждёт разрешения.
- Запрос дополнительных прав. Агент просит расширенный доступ к инструментам или к сети.
- Вызов инструмента через MCP. Агент собирается вызвать инструмент у стороннего сервера и ждёт разрешения.
- Форма от MCP-сервера. Сервер просит заполнить небольшую форму: текст, число, переключатель или выбор из списка.
Вопрос агента
- Вопрос показывается карточкой с заголовком и текстом. Заголовок вопроса рисуется бирюзовым цветом, а под ним сам текст вопроса.
- Варианты ответа выбираются радиокнопками. У каждого варианта есть подпись, а под ней может быть пояснение, чем этот вариант отличается.
- Под вариантами всегда есть поле для своего ответа. Оно подписано как Your answer и вмещает не больше трёх строк текста.
- Кнопка Send доступна, только когда отвечены все вопросы. Пока хоть один вопрос без ответа, кнопка серая и не нажимается, потому что отправлять нечего.
- Кнопка Dismiss закрывает вопрос без ответа. Агент при этом не прерывается и продолжает работу дальше, а в чате появляется подтверждение, что вопрос закрыт.
- Вопросы с пометкой о секрете не показывают ваш ответ. Вместо него в истории будет написано, что ответ сохранён, но текст не выводится.
- Обычный текст, отправленный в поле ввода, тоже считается ответом на вопрос. Если открыт вопрос, приложение берёт текст из поля ввода как ответ на него и не отправляет его отдельным сообщением.
- Если открыто одобрение, отправка текста сначала закрывает его. Карточка одобрения сворачивается в историю как отклонённая, а написанный текст уходит в тред обычным сообщением.
- Если в вопросе есть отдельный пункт для своего ответа, текст из поля ввода уходит именно в него. Это нужно, чтобы ответ на свободный вопрос не попал в тот пункт, где были готовые варианты.
- Ответ на вопрос уходит на сервер только пока запрос ещё живой. Если запрос уже закрыт на стороне сервера, ответ отправляется обычным сообщением в тред, чтобы он не потерялся.
- Повторные нажатия Send не плодят дубли. Пока ответ уже уходит, новые нажатия игнорируются, а если он уходит сообщением, одинаковый текст отсекается в течение пяти секунд.
Одобрения действий
- Карточка одобрения состоит из трёх частей. В шапке написано, что именно собирается сделать агент: Run command, Apply changes или Permissions request.
- Под шапкой показывается, что именно будет сделано. Для команды выводится сама команда, для правки файлов — причина, для запроса прав — то, зачем нужен доступ.
- Подробности запроса выводятся мелким приглушённым текстом. В закрытой карточке тот же текст показывается шрифтом кода, чтобы команда и пути читались без переносов.
- В карточке три кнопки: Allow, Always allow и Reject. Allow разрешает действие один раз, Always allow запоминает разрешение, Reject отказывает.
- У формы от MCP-сервера кнопки Always allow нет. Форма только заполняется и отправляется, никакое разрешение ей не нужно.
- Каждое нажатие открывает подтверждение. В окне Allow показывается текст действия, обрезанный до двухсот символов, а в окне Always allow — то, что именно будет запомнено.
- Окно Always allow показывает, что именно разрешается навсегда. Это может быть шаблон команды, список шаблонов, адрес хоста или общие расширенные права.
- Окно Reject предупреждает, что агент продолжит ход без этого действия. То есть отказ не останавливает всю работу, агент просто попробует сделать задачу иначе.
- Отказ уходит на сервер как ошибка с кодом минус 32000. Вместо ответа приложение сообщает серверу, что действие запрещено пользователем.
- После ответа карточка остаётся в истории с итогом. Возможные подписи: Approved, Always allowed и Rejected, у каждой свой значок и свой цвет.
Вызов инструмента через MCP
- Карточка вызова инструмента узнаётся по значку вилки. В шапке написано MCP tool call, а рядом имя сервера, у которого агент хочет вызвать инструмент.
- Под именем сервера показывается сообщение и описание инструмента. Сообщение рисуется обычным текстом, описание — приглушённым мелким шрифтом.
- Внизу карточки есть пояснение, откуда взялся запрос. Там прямо написано, что агент хочет вызвать инструмент MCP и что его можно разрешить один раз, всегда или отклонить.
- Набор кнопок такой же, как у обычного одобрения. Allow, Always allow и Reject, и каждое нажатие тоже открывает подтверждение.
- После ответа остаётся карточка с итогом. Она показывает, что запрос был разрешён, разрешён навсегда, отклонён или просто отвечен, и перечисляет ваши ответы.
Форма от MCP-сервера
- Сервер может попросить заполнить форму вместо простого одобрения. Форма собирается прямо из того, что сервер описал, поэтому набор полей у каждого сервера свой.
- Поля формы бывают пяти видов. Это строка текста, число с цифровой клавиатурой, переключатель да или нет, выбор одного варианта и выбор нескольких вариантов галочками.
- У каждого поля есть подпись, а под ней может быть пояснение. Подпись выводится бирюзовым, пояснение приглушённым мелким шрифтом.
- Если сервер не описал схему, показывается одно большое поле. В него можно написать любой текст, и он уйдёт серверу как поле answer.
- Кнопка Send активна, только когда все обязательные поля заполнены. У переключателя значение считается заполненным всегда, поэтому его заполнять не нужно.
- Кнопка Decline отказывает без отправки данных. Сервер получает решение declined, и форма закрывается.
- Подпись внизу объясняет, что разрешение не сохраняется. Протокол не хранит права на такие ответы, поэтому при следующем запросе форму придётся заполнить заново.
Сколько живёт вопрос без ответа
- Обычный вопрос ждёт вас минуту скрыто и ещё минуту с отсчётом. Скрытая минута нужна, чтобы вы успели заметить карточку и спокойно её прочитать.
- За последнюю минуту в карточке появляется строка отсчёта. Она выглядит как auto-resolves in и таймер вида 1m 05s, который тикает раз в секунду.
- Любое ваше действие в карточке откладывает автозакрытие. Выбор варианта и печать в поле перезапускают таймер заново, поэтому отвечать можно не торопясь.
- Когда время вышло, вопрос закрывается сам. На сервер уходит пустой ответ, а над чатом появляется предупреждение, что вопрос закрыт автоматически и агент продолжил без ответа.
- Блокирующий вопрос ждёт ответа сколько угодно. Так ведут себя вопросы в режиме плана, где отвечать нужно осознанно, и никакого отсчёта у них нет.
- Одобрения не закрываются по таймеру. Если вы не нажали ни одну кнопку, запрос так и остаётся на экране.
Когда вопрос становится неактуальным
- Если запрос закрыли на стороне сервера, карточка становится просроченной. Это бывает, когда вы ответили в другом клиенте, сменился ход или тред выгрузили с сервера.
- Просроченный вопрос показывается приглушённой карточкой без кнопок. В шапке написано, что модель больше не ждёт, а ниже видны сам вопрос и варианты ответа.
- Под просроченным вопросом есть подсказка, что делать. Она предлагает написать ответ в поле ввода, чтобы он ушёл обычным сообщением.
- После перезахода в тред приложение ждёт три секунды и сверяет вопросы с сервером. Те, которых сервер не подтвердил, помечаются просроченными, чтобы в ленте не висели мёртвые кнопки.
- Ответ, который не успел уйти, всё равно не теряется. Если запрос уже закрыт, тот же текст отправляется в тред как обычное сообщение пользователя.
Как вопросы и одобрения живут в ленте
- Все открытые карточки собираются в один блок внизу ленты. Они показываются над полем ввода и идут в порядке появления, одна под другой.
- Порядок внутри блока не меняется от того, какая карточка открыта. Между карточками есть небольшой отступ, чтобы их было видно по отдельности.
- Закрытые карточки остаются в ленте на своих местах. Они больше не требуют действия и просто показывают, что было решено.
- Дубли одного вопроса схлопываются в одну карточку. Один и тот же вопрос может прийти и запросом с сервера, и уведомлением, но в ленте он показывается один раз.
- Если номер запроса совпал у разных вопросов, карточки остаются разными. Признаком одного вопроса считается не только номер запроса, но и номер хода, поэтому ничего лишнего не пропадёт.
Технические данные
| Параметр | Значение |
|---|---|
| Типы запросов | вопрос, одобрение команды, одобрение правки, запрос прав, вызов инструмента MCP, форма MCP |
| Что отвечают в карточке | Send, Dismiss, Allow, Always allow, Reject, Decline |
| Подтверждения поверх карточки | Allow, Always allow, Reject |
| Обрезка текста в окне Allow | 200 символов |
| Обрезка команды в окне Always allow | 120 символов |
| Высота поля ответа | не больше трёх строк |
| Скрытое ожидание неблокирующего вопроса | 60 секунд |
| Видимый отсчёт неблокирующего вопроса | 60 секунд |
| Формат отсчёта | auto-resolves in 1m 05s |
| Блокирующий вопрос в режиме плана | без таймера |
| Сверка вопросов с сервером после входа в тред | 3 секунды |
| Защита от повторной отправки ответа | 5 секунд |
| Код отказа при Reject и Decline | ошибка с кодом -32000 |
| Ответ при автозакрытии вопроса | пустой объект ответов без единого варианта |
| Радиус карточки вопроса | 12dp |
| Радиус карточки вызова MCP | 16dp |
| Внутренние отступы карточки | 12dp, у карточки MCP 16dp |
| Признак одного и того же вопроса | совпадение номера запроса и номера хода |
| Подписи итога в истории | Question answered, Approved, Always allowed, Rejected, MCP request declined, Expired |