# @goodandready/dsh-smart-restart

<div align="center">
<h3>Перезапуск, который проверяется, а не просто объявляется.</h3>
<p align="center"><a href="https://www.npmjs.com/package/@goodandready/dsh-smart-restart">npm package</a> · <a href="LICENSE">MIT</a> · <a href="https://github.com/topics/dsh-plugin">DSH plugin</a></p>
<p align="center"><a href="https://goodandready.app/">DSH Hub — goodandready.app</a></p>
<p align="center"><a href="README.md">English</a> • <a href="README.zh.md">中文</a> • <a href="README.ru.md"><b>Русский</b></a></p>
<table align="center"><tr><td align="center">
⭐ <strong>Если вам нравится этот плагин, поставьте ему Star на GitHub</strong> — это показывает, что он полезен, и поддерживает дальнейшую разработку.
<br><br>
🐛 <strong>Если вы нашли ошибку или хотите предложить функцию</strong>, создайте Issue на GitHub на любом языке.
</td></tr></table>
</div>

## Обзор

Перезапуск завершает процесс, который его выполняет. Обычное уведомление говорит только «служба перезапустилась», но не отвечает, здоров ли Harness и какую задачу продолжить. Прямой вызов systemctl restart также может требовать root или разрешение polkit.

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

## Архитектура

~~~mermaid
graph LR
  A[DSH web profile] --> B[Host plugin]
  B --> C[Restart intent and guard]
  C --> D[Service manager restarts DSH]
  D --> E[Next-process health checks]
  E --> F[Report to requesting session]
  A --> G[Client module loader]
  G --> H[Settings card]
  H --> B
~~~

Браузерная часть регистрирует карточку настроек через ленивый CommonJS-загрузчик DSH; фабрика возвращает apply и inject. Серверная часть отвечает за инструменты перезапуска, проверки здоровья и отчёт.

## Возможности

- **Перезапуск без дополнительных прав.** По умолчанию завершается процесс Harness, а systemd запускает его снова при Restart=always. Альтернативный режим systemctl подходит для окружений с выданным разрешением.
- **Проверка после запуска.** Проверяются службы DSH, зарегистрированные инструменты, состояние systemd и число перезапусков, владелец порта в cgroup службы, а также версии плагина и ядра. Итог: ok или degraded с перечнем проблем.
- **Отчёт в исходную сессию.** Перед перезапуском сохраняются сессия, причина и план продолжения. После старта новый процесс возвращает эти данные и результат проверок в ту же сессию, при необходимости ограниченно ожидая её появления.
- **Защита от циклов.** При достижении лимита в 3 перезапуска за 10 минут новый запрос отклоняется.
- **Карточка настроек.** Английский и китайский языки встроены; русский интерфейс даёт отдельный плагин dsh-russian-lang.

## Модули

- lib/index.js — вход Cordis-хоста: настройки, инструменты restart/status, проверки запуска и отправка отчёта.
- lib/boot.js — чистые функции определения перезапуска, loop guard, проверок cgroup/портов, вердикта и формата отчёта.
- lib/client.js — браузерная карточка настроек; фабрика загрузчика DSH должна возвращать объект CommonJS-экспортов.
- cordis.patch.yml — добавляет пакет в выбранный web-профиль.

## Установка

~~~bash
dsh plugin --profile web add @goodandready/dsh-smart-restart
~~~

Режим по умолчанию требует, чтобы Harness управлялся systemd с параметром Restart=always. Служба определяется по cgroup процесса или задаётся явно.

## Настройки

Настройки меняются в карточке плагина DSH. Секреты не требуются.

| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
| enabled | boolean | true | Регистрировать ли инструменты и проверять каждый запуск. |
| restartMode | string | kill | kill завершает процесс, затем его запускает systemd; systemctl вызывает systemctl restart <unit>. |
| unit | string | автоопределение | Служба systemd; пустое значение определяется по /proc/self/cgroup. |
| delayMs | number | 3000 | Пауза до завершения процесса, чтобы квитанция инструмента вернулась вызывающему. |
| target | string | requester | Цель отчёта: исходная сессия, primary или ID сессии. |
| stateDir | string | .restart-guard | Каталог в $DSH_HOME для маркера запуска, намерения, последнего отчёта и истории. |
| maxRestarts | number | 3 | Отклонять перезапуск, если число уже достигнуто в пределах окна. |
| windowMs | number | 600000 | Окно защиты от циклов, миллисекунды. |
| timeoutMs | number | 5000 | Тайм-аут каждой проверки здоровья. |
| expectTools | string[] | [] | Обязательные инструменты после старта; отсутствующие ухудшают результат. |
| toolEnabled | boolean | true | Регистрировать ли dsh_restart и dsh_restart_status. |

## Инструменты

- dsh_restart: параметры reason, resume, confirm и delayMs. Сохраняет намерение, проверяет защиту от цикла, планирует перезапуск и возвращает квитанцию; итог после старта получает вызвавшая сессия.
- dsh_restart_status: только чтение — последний запуск и простой, отчёт проверки, ожидающее намерение и число перезапусков за окно.

## Отчёт

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

## Ограничения и диагностика

- Режим по умолчанию зависит от systemd с Restart=always. Отдельно запущенный вручную процесс не сможет восстановиться; плагин сообщит об этом.
- Режим kill намеренно завершает текущий ход; файл намерения даёт следующему ходу контекст.
- Проверки порта и cgroup рассчитаны на Linux; на других системах они пропускаются.
- Ошибка клиента module is not defined означает, что фабрика клиентского модуля несовместима с DSH. Установите версию, которая объявляет и возвращает CommonJS-экспорты, затем перезагрузите web-профиль.
- Серверные инструменты могут загрузиться, даже если браузерная карточка настроек не работает; ошибки клиентского старта проверяются отдельно.
- Плагин управляется через DSH CLI/pnpm; автономный маршрут /api/dsh/update намеренно не предоставляется, обновление верифицируется встроенным health-check после рестарта.
- Для user-юнитов systemd флаг --user проставляется автоматически как при проверке статуса, так и при вызове systemctl restart.

## Разработка и лицензия

Для запуска тестов выполните npm test.

MIT © GooDAnDReaDY
