06/Documentation
Durable agents на телефоне
Как выглядят раздел, диалоги, вопросы и квитанции durable agent
Экспериментальная. Отображение durable agent на телефоне может измениться, либо функция может быть удалена в следующем минорном релизе. Раздел Durable agents описывает, от чего зависит её сохранение.
На этой странице показаны все места, где durable agent появляется на вашем телефоне: его строка на дашборде, список бесед, вопросы, чат, его стартеры и пуши. Раздел Durable agents описывает предварительное подключение durable agent.
Durable agent отображает элемент управления только для тех действий, которые он заявил в hello. Строка ниже, называющая элемент управления, предполагает, что durable agent его объявил.
Раздел Durable agents на дашборде
Каждый durable agent занимает одну строку в разделе Durable agents, отдельно от ваших spaces.

| часть строки | что отображается |
|---|---|
| Строка 1 | Имя durable agent из sources.json и значок Experimental |
| Строка 2 | Его среда выполнения, имя, которое durable agent сообщает в приветствии, иначе durable. Затем local или remote |
| Правый край, готов | Число открытых разговоров, а цветом needs-you — число тех, что ждут вас. Второе число скрыто, если оно равно нулю |
| Правый край, не готов | Слово Starting, Unreachable или Version mismatch, без счётчиков |
Durable agent, доступный через сокет либо по http://127.0.0.1 или http://localhost, имеет статус local. Все остальные URL — remote.
Раздел находится под вашими пространствами. Он перемещается над ними, пока у любого durable agent есть разговор, ожидающий вас, и возвращается вниз, когда получен ответ на последний из них. Если ни один durable agent не подключён, раздел не отображается вовсе.
При включённой настройке «Show only panes that need you» в разделе выводятся только те durable agent, которые ждут вас. Нажмите на строку в любом состоянии, чтобы открыть список разговоров этого durable agent.
Список разговоров
Главный экран durable agent отображает его разговоры так же, как мессенджер отображает чаты.

Сначала идут те, что ждут вас, затем остальные открытые разговоры, сначала новые. Закрытые следуют под меткой Closed. В каждой строке показаны заголовок, значок состояния, время последней активности и одна строка под ним: ожидающий вопрос, иначе подзаголовок durable agent. В строке с ожиданием также указано число открытых вопросов. Строка без названия подписана как «Untitled conversation».
Нажмите на открытую строку, чтобы открыть её в Chat. Нажмите на закрытую строку, чтобы открыть её только для чтения. У закрытого разговора есть кнопка Reopen, если durable agent умеет их открывать повторно.
Открытые строки берутся из собственных данных панели управления, поэтому отображаются сразу. Закрытые поступают от durable agent, которого Collie опрашивает один раз за посещение и повторно при открытии или закрытии разговора, но не при каждом опросе.
| внизу списка | когда |
|---|---|
| Load more | У durable agent больше 100 разговоров. Каждое нажатие подгружает следующие 100 |
| «This durable agent does not keep a list of its conversations.» | Durable agent ответил, что не ведёт список |
| «The durable agent did not answer. Try again in a moment.» | Durable agent не ответил на запрос чтения |
| «The durable agent speaks wire v2, this Collie speaks v1. Update Collie, or the agent's SDK.» | Collie отклонил durable agent из-за версии протокола wire (Квитанции) |
| «Couldn't load the conversations. Try again.» | Сбой чтения при передаче |
Durable agent без истории показывает только свои открытые диалоги, без группы «Closed» и без примечания. Уже отрисованный список остаётся на экране, если последующее чтение завершается с ошибкой.
Вопрос на телефоне
Вопрос от durable agent отображается как карточка в чате, под вызовом соответствующего инструмента.

В подписи указан durable agent: «Needs your answer · desk». Если durable agent задал срок действия, строка под заголовком ведёт обратный отсчёт: «Expires in 4 min», затем «Expires in 40 s», затем «Expired». После истечения срока кнопки остаются, а на позднее нажатие durable agent отвечает сам.
| тип | что показывает карточка | ограничения |
|---|---|---|
permission | По одной кнопке на вариант, в формулировках Collie: Allow, Always allow, Deny или Cancel. Собственная метка durable agent отображается неброской второй строкой | До 6 вариантов |
choice | По одной строке на вариант. Одно нажатие отправляет выбор. При multiple строки переключаются под заголовком «Pick any number», а кнопка Send отправляет выбранный набор | До 8 вариантов |
text | Одна строка для ввода, счётчик вида «12 of 500» и кнопка Send | 500 символов или лимит durable agent вплоть до 2000 |
form | Поля карточки друг под другом над одной кнопкой Send: текстовая строка, выбор из списка или переключатель. У обязательного поля указано Required | До 6 полей |
Для «Always allow» требуется два нажатия. Первое меняет кнопку на «Tap again to always allow» и имя инструмента. Второе отправляет ответ. Collie не предлагает этот вариант, если в вопросе не назван инструмент.
Если Collie пришлось сократить или очистить текст durable agent, на карточке выводится «Text shortened» и вариант «Always allow» не предлагается, поскольку вам был показан не весь текст.
Карточка неизвестного для этой версии Collie типа показывает свой текст и сообщение «This ask cannot be answered from the phone.». Диалог отрисовывает первые 5 вопросов как карточки, а строка «Show N more» открывает остальные.
Что происходит после нажатия
Каждое нажатие передаёт один идентификатор запроса, и только нажатие отправляет ответ.
| что произошло | что написано на карточке | что делать |
|---|---|---|
| Durable agent принял ответ | Ничего: карточка закрывается | Ничего |
| Durable agent принял решение первым | «Decided in the durable agent.» | Ничего. В чате остаётся соответствующая строка |
| Сначала истёк срок ожидания вопроса | "Время ожидания ответа истекло." | Ничего. В чате остаётся соответствующая строка |
| Другой ответ пришёл раньше | "Ответ уже получен. Эта карточка закроется при следующем обновлении." | Ничего |
| Вопрос не был открыт, и durable agent не сообщил причину | "Не принято. Вопрос может появиться снова через минуту." | Подождите. Перезапущенный durable agent задаст вопрос повторно |
| Вопрос изменился во время ответа | "Вопрос изменился. Прочитайте его ещё раз и выберите ответ." | Прочитайте изменённый вопрос и ответьте снова |
| Возможно, ответ не дошёл | "Не удалось подтвердить получение ответа. При повторной попытке он будет отправлен ещё раз." | Нажмите «Повторить попытку». При этом отправляется тот же идентификатор запроса, поэтому durable agent получит его один раз |
| При повторной попытке вопрос оказался закрыт или изменён | "Возможно, уже применено. Проверьте чат." | Проверьте чат |
| Collie отклонил ответ | Причина от Collie, иначе «Ответ был отклонён». | Прочитайте причину |
| На машине с durable agent установлена более старая версия Collie | "На этой машине работает устаревшая версия Collie, и здесь ответы не принимаются. Обновите её или ответьте в durable agent." | Обновите эту машину |
Квитанции
Collie сообщает, чем завершился вопрос, если вы на него не ответили, и почему durable agent отклонён.

| ситуация | что отображается |
|---|---|
| У вопроса есть срок действия | В карточке отображается оставшееся время под заголовком |
| Вы нажали ответ после того, как durable agent принял решение, или после истечения срока действия | Карточка блокируется и показывает: «Решено в durable agent.» или «Время ожидания ответа истекло.» |
| Время ожидания вопроса истекло, либо durable agent решил его сам, без вашего нажатия | Одна строка в чате: «Timed out before an answer:» или «Decided in the durable agent:», затем заголовок вопроса |
| Collie отклонил durable agent из-за версии сетевого протокола (wire version) | Блок предупреждения на главной durable agent и слова Version mismatch в его строке на панели управления |
Вопрос, на который вы ответили с телефона, или вопрос, завершённый из-за остановки хода, не оставляет такой строки. Ваше нажатие уже содержало карточку.

В блоке предупреждения указано, какую версию протокола использует каждая сторона, например «Program speaks wire v2, this Collie speaks v1. Update Collie, or the durable agent's SDK.». Обновите устаревшую сторону. Правило описано в Версии.
Чат
Диалог durable agent открывается во вкладке Chat — это его единственное представление.
| элемент от durable agent | что отображает Chat |
|---|---|
user | Ваша реплика |
reply | Ответ агента |
thinking | Размышления агента |
notice | Короткая заметка в треде |
markdown | Отрисованный markdown: заголовки, списки, выделение, код и ссылки. Исходный HTML отображается как текст |
code | Блок кода с указанием языка, если durable agent его задал |
link | Строка ссылки с её меткой, иначе адрес. Только ссылки https:// |
tool | Вызов инструмента: выполняется, завершён с выводом, завершился с ошибкой или отклонён |
Элемент reply, thinking, notice или markdown, который всё ещё дополняется, содержит курсор на конце и не имеет времени. Курсор исчезает по прибытии финального текста. Остановленный вами ход оставляет пометку «stopped».
Ваша реплика
Ваша реплика появляется в треде в момент нажатия Send со значком маленьких часов. Когда приходит копия от самого durable agent, она встаёт на место этой строки.
| состояние | что показывает строка |
|---|---|
| Отправляется или отправлено | Часы. В поле ввода появляется «Sent», когда durable agent принял реплику |
| Ответ так и не пришёл | «Sending, not confirmed». Повторная отправка через Send выполняет повтор с тем же request id |
| Отклонено, либо ход перешёл дальше | «Not sent», и ваш текст возвращается в поле ввода |
Durable agent, который не возвращает request id, сопоставляется по идентичному тексту в течение 30 секунд. Строка, которую durable agent так и не записал в ответ, перестаёт отображаться через 10 минут.
Пока ваша реплика остаётся последней в треде, а durable agent ещё не ответил, троеточие показывает, что идёт работа.
Заголовок
Заголовок состоит из двух строк. Первая строка содержит название диалога и значок Experimental.
| во второй строке отображается | когда |
|---|---|
| «Шаг 2 из 3: сохранение заметки» | Долгоживущий агент передаёт шаги, и один из них выполняется |
| «42%: выгрузка» | Долгоживущий агент передаёт процент выполнения с соответствующей подписью |
| Подзаголовок долгоживущего агента | Прогресса нет, или все шаги выполнены |
| Рабочая область | Долгоживущий агент не задаёт ни один из этих параметров |
Прогресс виден только тогда, когда диалог выполняется или ждёт ваших действий.
Панель действий
На панели действий находятся кнопки Steer и Stop, а затем до четырёх собственных кнопок долгоживущего агента.
Steer отправляет ваш текст в текущий шаг вместо запуска нового. Stop завершает текущий шаг. Кнопка, действие которой сейчас недоступно, становится блёклой на своём месте, поэтому интерфейс не сдвигается.
| кнопка долгоживущего агента | правило |
|---|---|
| Текст | Не более 16 символов |
| Значок | Один из 12 вариантов: play, pause, check, x, refresh, archive, flag, star, send, note, search, more. Для любого другого имени значок не отрисовывается |
| Занят | Спиннер и отсутствие реакции на нажатие |
| Отключено | Блёклая кнопка и отсутствие реакции на нажатие |
Нажатие указывает на самый свежий шаг, который отобразился на телефоне. Если диалог уже ушёл дальше, ничего не выполняется, и телефон сообщает об этом: «Диалог продвинулся дальше, поэтому действие не выполнено». Проверьте состояние, а затем нажмите кнопку снова, если действие всё ещё нужно.
Чего нет на панели долгоживущего агента
У долгоживущего агента нет экрана, поэтому на его панели нет режима Terminal, полос вкладок или панелей, а также кнопок Keys, Type или Quick. В его меню нет пунктов History, Pane settings и Pin to top row. Пункт Close в меню называется «Закрыть диалог».
Новый диалог и стартеры
Страница New долгоживущего агента называется «Новый диалог» и содержит список стартеров этого долгоживущего агента.
Стартер не принимает ни папку, ни текст: долгоживущий агент сам решает, где работать. Нажмите на стартер, и долгоживущий агент откроет новый диалог. На странице нельзя выбрать агент, шелл или команду хоста. Если у долгоживущего агента нет стартеров, выводится: «Долгоживущий агент этой машины пока не предлагает стартеров».
Push-уведомление
Вопрос может отправлять push-уведомление на ваш телефон в пределах лимитов для каждого durable agent.
| ограничение | лимит | сверх лимита |
|---|---|---|
| Одна панель | 3 push-уведомления в минуту | Вопрос отображается на телефоне без отправки push-уведомления |
| Один durable agent на одной машине | 10 push-уведомлений в минуту | То же самое |
| Один durable agent на одной машине | 30 push-уведомлений в час | Одно push-уведомление: «A durable agent on {host} is raising many asks», затем ни одного push-уведомления от этого durable agent в течение часа |
Push-уведомление содержит текст «Permission needed in» и имя панели. Durable agent может добавить собственный заголовок (не более 60 символов) и строку (не более 120 символов). Collie отправляет push-уведомление с вопросом один раз для каждой связки машины, durable agent и вызова инструмента, поэтому вопрос, заданный повторно после перезапуска, отображается на экране, но не отправляет push-уведомление. Подробности см. в Push-уведомления от durable agent.
Маскирование
При включённом маскировании секретов (COLLIE_REDACT, включено по умолчанию) Collie маскирует секреты в заголовках и подзаголовках списка диалогов durable agent.
В составе crew
Дашборд ведущего узла (lead) содержит раздел Durable agents для каждой машины в составе crew. Durable agent участника добавляет имя участника во вторую строку, например pi-durable, local, workshop, а собственные durable agent ведущего узла не содержат имени машины. Вопрос на любой машине перемещает этот раздел выше рабочих пространств. В Durable agents в crew описано, кто и за что отвечает.
Редактировать эту страницу на GitHub