Комментарии 11
Минус у этой схемы тоже есть.
Да, теперь незачем вставать с дивана.
Для журнала квитанций интересен ещё один сценарий: восстановили резервную копию плагина, сделанную до отправки команды, а телефон повторил сохранённый requestId после переподключения. В восстановленной базе квитанции уже нет, хотя DSH мог выполнить задачу. Как в таком случае восстанавливается граница неопределённости? Это отдельная проверка от обычного перезапуска с сохранившейся SQLite; для неё пригодилась бы явная процедура восстановления и сверки с DSH.
Спасибо, сценарий точный, и обычный перезапуск его действительно не покрывает.
Сначала про телефон. Сохранённую команду после переподключения он сам не повторяет: запрашивает у хоста исходную квитанцию по requestId. Если хост отвечает, что квитанции нет, приложение помечает команду как uncertain и больше её не отправляет, дальше решает пользователь. В контракте приложения это записано прямо: 404 на квитанцию никогда не доказывает, что команда не выполнялась. Автоматический повтор бывает только тогда, когда транспорт доказывает, что сбой случился до заголовков ответа, и это не больше 3 попыток с тем же requestId. После статуса uncertain или pending и после восстановления процесса повтора нет.
А вот насчёт хоста вы правы. Если базу откатили на момент до приёма команды и тот же requestId всё же придёт новым POST, строки для него у хоста нет. Он сочтёт команду новой, запишет dispatching и вызовет DSH. В обычной работе приложения такой POST сам не появляется, но хост от него ничем не защищён.
Отката журнала из резервной копии хост сейчас не замечает. У журнала команд нет эпохи или идентификатора экземпляра, перед отправкой хост не сверяется с историей сессии DSH, процедуры восстановления со сверкой тоже нет. В инструкции по установке описано только, как безопасно для SQLite снять резервную копию, а восстановление из неё не описано. Epoch в плагине есть, но он относится к другому журналу, ленте уведомлений, а не к командам. Для сообщений плагин передаёт DSH идентификатор, производный от requestId, но дедуплицирует ли по нему сам DSH, не установлено, поэтому ни того, ни другого утверждать не буду.
По тестам: незавершённая отправка после перезапуска становится uncertain и не повторяется; потерянный ответ ведёт к поиску по исходному id, а не к повторной отправке, даже после пересоздания приложения; одинаковый UUID с двух устройств даёт для DSH разные id. Теста на восстановление копии, снятой до команды, нет.
Так что после такого восстановления границу неопределённости держит только телефон, а хост её теряет. Сценарий заслуживает отдельной обработки, спасибо, что его сформулировали.
Спасибо за подробный разбор и за разделение гарантий телефона и хоста. Для документированной процедуры восстановления я бы рассмотрел отдельный режим: квитанции можно читать, но новые команды в DSH не отправляются до сверки или явного решения оператора по неопределённым задачам. Эпоха команд помогла бы отклонять старые запросы, но если хранить её в той же резервной копии, она откатится вместе с журналом. Значит, при восстановлении её нужно менять отдельно и не считать смену эпохи доказательством того, что прежние задачи не выполнялись. Такой режим кажется полезным дополнением к отдельному тесту восстановления.
Решил эту же задачу личным VNP(который уже был) и поднятием TCP-pipe. Интерфейс конечно же не идеален для мобильных устройств, но есть полня синхронизация всех плагинов и скилов.
Рабочий вариант, особенно если VPN уже есть. Я от него отказался, потому что пришлось бы открывать веб-порт DSH и переносить на телефон браузерную авторизацию, куку, привязанную к адресу хоста. Ну и интерфейс, как вы и пишете, под телефон не рассчитан.
У моего варианта цена как раз в том, о чём вы говорите: плагины и скилы DSH на телефон не выведены, подтверждения действий остаются на ПК. Взамен нативный интерфейс, и с телефона доступно основное: чаты всех проектов, постановка задач, очередь и «Направить», вложения, ответы на вопросы агента, уведомления.
Объясните, в чем выгода использовать DeepSeek, если за те же 20 долларов на подписке Claude можно сделать в 4-5 раз больше задач 🤔
DeepSeek Harness — это не модель, а среда для агента на компьютере: сессии, инструменты, история, подписки и ключи провайдеров. Модель в ней выбирается отдельно, и подписку Claude тоже можно подключить — у меня часть задач идёт именно через неё. DSH Mobile к выбору модели не привязан: он только даёт доступ к этим чатам с телефона. Так что «DeepSeek или Claude» здесь решается в настройках, а не выбором приложения.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Android-клиент для DeepSeek Harness: как работать с агентом на ПК с телефона без облака и FCM