Руководство GrantTap · · 10 мин чтения

Сообщения, которые дожидаются компьютера

Запрос из очереди может ждать на зашифрованном relay, пока компьютер не подключится, даже если телефон закрыт. Что означает каждая отметка на сообщении, что видит relay и где ожидание заканчивается.

ИллюстрацияОбраз статьи создан специально для этого материала. Экраны GrantTap ниже сняты отдельно на тестовых данных.

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

Ожидание полезно, только если потом понятно, что произошло без вас. GrantTap разделяет три факта: телефон передал сообщение, компьютер подтвердил получение, агент выполнил работу. В этом руководстве разобрано, как сообщение проходит путь, когда телефон может «отпустить» его, что означает каждая отметка на сообщении, что relay видит и чего не видит и где ожидание заканчивается. Всё это уже сказано на страницах Help, Security и Privacy GrantTap; здесь эти части собраны в том порядке, в котором вы с ними встречаетесь.

У каждого сообщения один маршрут

Сообщение в GrantTap принадлежит Task, а Task закреплена за одним компьютером и одним провайдером. Перед отправкой откройте нужную Task и проверьте эту пару. Маршрут остаётся за Task. Выбор другого активного компьютера в Devices не переносит существующий чат автоматически, и ожидающий запрос не будет доставлен на другую машину только потому, что она оказалась в сети. В этом и смысл ожидания: запрос предназначен компьютеру этой Task, её checkout и её агенту — и никому больше.

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

Инфографика четырёх отметок доставки на ваших сообщениях: Queued, Sent, Delivered и Not delivered с кнопкой Retry. Delivered означает, что компьютер подтвердил получение, а не что агент закончил работу.
ИллюстрацияИнфографика четырёх отметок доставки на ваших сообщениях: Queued, Sent, Delivered и Not delivered с кнопкой Retry. Delivered означает, что компьютер подтвердил получение, а не что агент закончил работу.

Запечатано на телефоне, открыто на компьютере

Устройства GrantTap создают и хранят ключи локально, включая отдельный ключ для каждой Task, и ключ одной Task не открывает другую. Телефон шифрует сообщение, его вложения и любое решение внутри него, прежде чем что-либо покинет устройство. Relay получает аутентифицированный nonce и шифротекст. Читаемые prompts, команды, ответы, вложения и решения существуют только на конечных устройствах, которые вы авторизовали: на вашем телефоне, других привязанных контроллерах и компьютере, где выполняется Task.

Именно поэтому сообщение может разумно ждать не на ваших устройствах. Relay способен хранить запрос всё время ожидания, не имея возможности его прочитать, а в сервисе Personal у него нет ни подтверждения через браузер, ни браузерной привязки, ни хранилища, ни точки, где отображался бы открытый текст. Когда компьютер снова подключается, он расшифровывает запрос своим ключом и передаёт его провайдеру через локальный helper. Пробуждение устройства тоже ничего не раскрывает: push-уведомление несёт нейтральный сигнал без содержимого Task.

Два способа ждать

Сообщение, отправленное обычным способом, идёт в реальном времени. Если компьютер доступен, оно доставляется за мгновения. Если нет, сообщение остаётся в исходящих на телефоне с отметкой «в очереди», и телефон сам пробует снова. В этом случае работу по-прежнему держит телефон. Сообщение хранится на нём ограниченное время, в том числе после перезапуска приложения, но никуда не двигается, пока GrantTap снова не подключится и компьютер не станет доступен.

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

Момент, когда телефон может отпустить запрос

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

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

Что означают отметки на сообщении

Ваши собственные сообщения несут маленькую отметку, как в мессенджере. Часы означают Queued: сообщение ждёт отправки с телефона. Одна галочка означает Sent: сообщение покинуло телефон и идёт через relay. Закрашенная галочка означает Delivered: компьютер подтвердил получение. Красный восклицательный знак означает Not delivered, и рядом появляется кнопка Retry. Цветом выделяется только сбой, поэтому длинный разговор не кричит на каждой строке, пока всё идёт нормально.

Отметки следуют за реальными событиями, а не за таймерами. Неудачная попытка доставки возвращает сообщение в Queued, и оно автоматически повторяется ограниченное число раз; только когда попытки исчерпаны, сообщение становится Not delivered. Delivered ставится по подтверждению от компьютера, а не потому, что relay принял шифротекст. Страница аккаунта и сайт могут показать, что компьютер зарегистрирован или в сети, но такая метка подтверждает регистрацию, а не доставку конкретного сообщения в чат. За конкретное сообщение говорит только отметка на нём самом.

Что видит relay и что могут прочитать только ваши устройства — по страницам Security и Privacy GrantTap. Relay передаёт шифротекст и метаданные; содержимое сообщений остаётся на авторизованных устройствах.
ИллюстрацияЧто видит relay и что могут прочитать только ваши устройства — по страницам Security и Privacy GrantTap. Relay передаёт шифротекст и метаданные; содержимое сообщений остаётся на авторизованных устройствах.

Ответы приходят сообщениями, а не отметками

Delivered отвечает на узкий вопрос: получил ли компьютер этот запрос? Он не говорит, что агент закончил работу или хотя бы начал её. Ответ агента приходит так же, как любой ответ, — сообщениями в том же разговоре Task: ход работы, вопрос к вам, запрос approval или итоговый ответ. Они приходят в зашифрованном виде через тот же relay и встают в общий порядок рядом с вашим запросом, поэтому события можно прочитать в той последовательности, в которой они происходили.

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

Что видит relay

Relay слеп к содержимому, но не к метаданным. Ему нужна некоторая информация, чтобы маршрутизировать сообщения и удалять просроченные, и страницы Security и Privacy GrantTap её перечисляют: непрозрачные идентификаторы комнаты, Task, сообщения и доставки; роли отправителя и получателя; время и срок хранения; размер шифротекста; статус доставки и состояние повторов; IP-адреса и данные маршрутизации для push-уведомлений. Каждое подключение и регистрация push также требуют случайного credential комнаты, поэтому одного знания идентификатора недостаточно, чтобы войти в комнату.

Чего relay не видит, так это содержимого: текста запроса, вложений, ответов и вопросов агента, команд и решений внутри них, а также ключей отдельных Task, которые могли бы всё это открыть. Репозитории, рабочие каталоги и учётные данные провайдеров через relay вообще не проходят — они остаются на компьютере. Метаданные всё же описывают вашу активность, поэтому считайте время и размер сообщений видимыми тому, кто управляет используемым вами relay.

Где ожидание заканчивается

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

Ожидающим запросом управляете вы. В Queue его можно посмотреть, изменить время доставки, где это поддерживается, или отменить до доставки. Stop — отдельный элемент управления для агента, который уже работает и поддерживает прерывание; запрос, который ещё ждёт, управляется через Queue. Когда компьютер возвращается, запрос доставляется на своё место в Task, а отметки и ответы, описанные выше, показывают, что было дальше.

Повторить, отменить или подождать

Чаще всего правильное действие — подождать. Часы означают, что сообщение всё ещё на телефоне и будет отправлено, когда это станет возможно; запрос, уже переданный relay, виден в Queue, пока его не заберёт компьютер. Используйте Retry только для сообщения с отметкой Not delivered. Retry повторяет доставку и не доказывает, что агент выполнил работу. Если подтверждение под вопросом, например потому что телефон потерял связь сразу после отправки, откройте Task и прочитайте последние сообщения, прежде чем создавать ещё одну копию того же запроса.

Отменяйте через Queue, если планы изменились, и проверяйте компьютер и провайдера Task перед тем, как писать следующий запрос. Если после Delivered ответа агента нет, посмотрите, не ждёт ли в Task вопрос или approval, прежде чем считать, что что-то сломалось. Эти привычки делают ожидание дешёвым: один запрос, один маршрут, понятная отметка и ответ в том же разговоре. Телефон может уйти из сети в промежутке, а факты останутся на месте, когда вы вернётесь.

Источники

ДалееCortex Loom внутри GrantTap: откуда берётся экономия токенов →