> [Česky](README.cs.md) · [English](README.md)

# dsh-watchdog

Plugin pro DeepSeek Harness: hlídací pes proti zamrznutí + samoobnova —
"pojistka" pro případ, že harness zamrzne a nechce se vrátit.

## Co dělá

- **Tep (heartbeat)**: každých pár sekund zapisuje `~/.dsh/watchdog/heartbeat.json`
  s aktuálním pid, časem startu a počtem relací.
- **Obnova při startu**: když se spustí nová relace, přečte předchozí tep.
  Pokud předchozí instance stále běží, ale její tep je starý (tedy zamrzla),
  watchdog ji zabije, uklidí osiřelé worker procesy (`image_worker.py`,
  `voice_worker.py`, `agent_voice_worker.py`) a zapíše report obnovy do
  `~/.dsh/watchdog/recoveries/`.
- **Čistý konec**: při normálním ukončení se tep označí `clean: true`,
  takže příští start ví, že nešlo o zamrznutí.
- **Nástroj `dsh_watchdog`**: `status` (tep, uptime, relace, poslední obnova),
  `recover` (spustit obnovu hned), `history` (seznam reportů obnovy).
- **Záložka 🛡 Watchdog**: živý stav, poslední obnova a tlačítko „obnovit teď"
  v hlavním rozhraní.

## Proč

Když harness zamrzne (např. plugin spadne při aplikaci, nebo zasekne worker),
nová relace dřív mohla selhat nebo za sebou nechala zamrzlé procesy. S tímto
pluginem nová relace automaticky detekuje zamrzlou instanci, uklidí ji a může
pokračovat — agent je instruován, aby po zamrznutí zkontroloval
`dsh_watchdog status` a navázal na přerušenou práci.

## Instalace

```sh
dsh plugin --profile web add dsh-watchdog
```

Restartujte web profil. Záložka se objeví v kroužku zobrazení konverzace a
nástroj `dsh_watchdog` je dostupný agentovi.

## Nastavení

| Pole | Výchozí | Význam |
|---|---|---|
| `enabled` | `true` | Zapisovat tep vůbec. |
| `heartbeatSeconds` | `5` | Interval tepu. |
| `staleAfterSeconds` | `30` | Tep starší než toto (s živým pid) = „zamrzlo". |
| `killStaleWorkers` | `true` | Zabít osiřelé image/voice/agent-voice workery při obnově. |

## Architektura

```
~/.dsh/watchdog/
  heartbeat.json        # živost aktuální instance
  recoveries/recovery-<ts>.json   # jeden report na detekované zamrznutí/pád
```

- Host: `lib/index.js` (tep + obnova + nástroj).
- Client: `lib/client.js` (záložka stavu).

## Vývoj

```sh
npm install   # nic není potřeba (peery dodává harness)
npm publish   # publikovat novou verzi
```

## Licence

MIT
