# Shutdown Guard · Выключение после завершения задач [中文](README.md) · [English](README.en.md) · **Русский**

|
|
|
| Крупный статус + бегущая красно-жёлтая штриховка внизу | Концентрические круги + сканирующий луч, сессии и фоновые задачи показаны точками | Сводка в стиле командной строки + шесть индикаторов условий |
Точки на радаре только добавляются и удаляются, но не переставляются: при изменении количества те точки, на которые вы смотрите, не прыгают на другие места.

|
|
|
| Обратный отсчёт | Команда отправлена | Блокировка |
|:----------------------------------------------------:|:-----------------------------------------------------------------------:|:------------------------------------------------------------------------:|
|
|
|
|
`Выключено` → `Ожидание` → `Ожидание фоновых задач` → `Обратный отсчёт` → `Команда отправлена`; на любом этапе блокирующая ошибка переводит карточку в `Блокировка`. Во время обратного отсчёта можно отменить в любой момент; **после отмены охрана остаётся включённой** — следующая партия задач всё равно приведёт к выключению.
Хотите пересмотреть все шесть состояний? В демонстрации, в разделе 04 страницы «Понять», в правом верхнем углу есть три «капсулы» `A` `B` `C` — они переключают оформление предпросмотра.
## Заблокированные состояния
| halted · нужно вмешательство человека | waiting · автоматические повторы |
|:--------------------------------------------------------------:|:---------------------------------------------------------------------------------:|
|
|
|
При ошибках, которые нельзя обработать как обычный сбой, плагин **не снимает охрану**, меняет цвет карточки и пишет причину:
- **`halted`** (серо-синий) — нехватка квоты, недействительные учётные данные, превышение контекста, неподдерживаемая возможность, переполнен диск. Справиться может только человек: нажмите «Снять и повторить».
- **`waiting`** (серо-зелёный, точка «дышит») — ограничение частоты, 5xx, обрыв сети, пустой ответ, тайм-аут, выгрузка изображений. Повторяется автоматически по политике; в нужный момент внедряется инструкция «продолжить по исходному плану».

|
|
Сейчас карточка закреплена именно в этом месте боковой панели. В дальнейшем планируется сделать её самостоятельной формой (с переключателем в настройках); тогда здесь появится пояснение.
## Прочее
- **Вертикальное сворачивание**: в свёрнутом виде остаются только заголовок и статус; нажмите на заголовок, чтобы развернуть.
- **Адаптация к теме**: у карточки собственная палитра `--dsp-*`, светлые и тёмные цвета выбираются автоматически по яркости поверхности хоста; можно также принудительно задать тёмную / светлую / Claude Style.
- **Журнал событий**: на странице настроек видны последние события и «почему в прошлый раз не выключилось»; полный поток — в `data/events.log`.
|
|
Три группы: Оформление / Когда выключать / Состояние. Все переключатели действуют сразу.
- **Профиль по умолчанию** зафиксирован на 60 секундах и не меняется; есть ещё 8 пользовательских профилей, которые можно свободно настраивать.
- «Все сессии остановились» — базовое условие, включено всегда и не отключается.
- «Фоновые задачи завершены» блокирует фоновые задачи, «пропустить этот раунд при ошибке в сессии» блокирует партии с ошибками.
- «Автоответ в AFK» управляет тем, отвечает ли плагин на вопросы за вас, пока включена охрана; в описании сказано: «ответы не выбирают за вас ни один вариант; после отключения вопросы снова приходят вам».
## Светлая тема и сторонние темы
| Светлая карточка | Claude Style |
|:-----------------------------------------------------:|:------------------------------------------------------:|
|
|
|
Карточка не наследует палитру хоста, у неё своя; страница настроек следует теме хоста. У сторонней темы Claude Style тоже есть соответствующая палитра.
## Установка
Опубликовано в npm, рекомендуется:
```bash
dsh plugin --profile web add dsh-shutdown-guard
```
Или установить напрямую с GitHub:
```bash
dsh plugin --profile web add github:ltayshark0637/dsh-Shutdown-Guard
```
После установки **перезапустите DSH**.
> ⚠️ **Клиентский бандл попадает в граф модулей только при запуске DSH**: после изменения `lib/client.js` обязателен перезапуск, обновление страницы не поможет. С серверной частью то же самое.
**При ограниченной сети**: команда с GitHub по сути представляет собой `pnpm add github:...` и требует клонирования. Если клонировать не получается, используйте в первую очередь команду из npm (она идёт через registry); если не работает и она, установите по локальному пути — DSH Настройки → Плагины → Добавить, укажите **абсолютный путь** к этому каталогу → Установить → перезапустить.
**Ручной резервный вариант**: создайте в `profiles\web` символическую ссылку `node_modules\dsh-shutdown-guard` на этот каталог, затем:
- в `profiles\web\package.json` добавьте `link:<абсолютный путь к этому каталогу>` в `dependencies` и `pnpm.overrides`
- в `dsh.profile.bundles` добавьте `dsh-shutdown-guard`
## Права и влияние
После установки плагин делает следующее:
| Область | Конкретное поведение |
| --- | --- |
| **Выполнение команд** | Через `subprocess` вызывает Windows `shutdown.exe`: `/s /t <секунды>` планирует выключение, `/a` отменяет. **Вызывается только при включённой охране и выполнении всех пяти условий** |
| **Файлы** | Только `data/` в каталоге плагина: `config.json` (настройки) и `events.log` (журнал событий) |
| **События** | `agent/status`, `agent/error`, `session/event`, `user-questions/request` |
| **HTTP-маршруты** | В локальном веб-сервере DSH: `/api/dsh-shutdown-guard/` — `GET /state`, `GET /events`, `POST /arm`, `POST /disarm`, `POST /cancel`, `POST /config`; для POST проверяется, что Origin равен `127.0.0.1` или `localhost` |
| **Сеть** | **Никаких внешних запросов**, данные не собираются |
| **Платформа** | **Только Windows**. На платформах, отличных от `win32`, плагин молча не загружается |
Когда автопилот AFK включён, плагин во время охраны отвечает на вопросы агента и внедряет инструкции восстановления в сессии с ошибками; этот переключатель можно в любой момент отключить в настройках.
## Настройка
Записывается в `cordis.patch.yml` (патч внутри пакета плагина) или меняется во время работы через `POST /config`.
| Ключ | Диапазон | По умолчанию | Описание |
| --------------- | ------ | ------ | ----------------------------------------- |
| `countdownSec` | 10–600 | 60 | Секунды обратного отсчёта перед выключением (в профиле по умолчанию фиксировано 60, не меняется) |
| `marginSec` | 0–60 | 5 | Дополнительный запас, передаваемый в `shutdown /t` |
| `onlyOnSuccess` | bool | `true` | Пропускать выключение при ошибке в любой сессии этой партии |
| `blockOnJobs` | bool | `true` | Пропускать выключение, пока выполняются фоновые задачи |
| `afkAutoAnswer` | bool | `true` | Отвечать на вопросы за пользователя и выполнять восстановление после ошибок во время охраны |
| `language` | список | `auto` | Язык интерфейса; `auto` следует языку системы, можно закрепить `zh` / `en` / `ru` |
### Политики повторов
Каждому коду ошибки назначается имя политики; сами политики настраиваются:
| Политика | Ритм по умолчанию | Назначена |
| ------------ | -------------------------------------- | ---------------------------------- |
| `rate-limit` | backoff 30 → 60 → 120 → 240 → 300, с потолком | `RATE_LIMIT` |
| `transient` | фиксировано 20 секунд | `SERVER` / `TRANSPORT` / `TIMEOUT` |
| `empty` | фиксировано 30 секунд | `EMPTY_RESPONSE` |
| `offload` | фиксировано 5 секунд | `IMAGE_OFFLOAD_REQUIRED` |
Для ограничения частоты используется backoff, а не фиксированный интервал: частые повторы к сервису, ограничивающему частоту, **продлевают** период ограничения, а не просто тратят запросы. Сбои 5xx и сетевые ошибки восстанавливаются за предсказуемое время, поэтому фиксированный интервал оказывается быстрее. Выгрузка изображений — локальная операция с диском, повтор возможен почти сразу, отсюда 5 секунд.
Переопределение отдельного кода ошибки:
```yaml
retryAssign:
RATE_LIMIT: slow-limit
retryPolicies:
slow-limit: { mode: backoff, base: 60, max: 900 }
```
Неизвестный `code` откатывается к `transient`; политики с неверной структурой отбрасываются, а значения по умолчанию сохраняются. Действующие назначения можно прочитать из `retryAssign` и `retryPolicies` в `/state`.
Настройки интерфейса хранятся в браузерном `localStorage`: `dsh-shutdown-guard.variant` / `.theme` / `.folded`.
## HTTP-интерфейс
Префикс `/api/dsh-shutdown-guard`, используется для опроса самой карточкой с того же источника:
| Метод | Путь | Описание |
| ---- | -------------------------- | -------------------------------------------------------------------------------- |
| GET | `/state?since=