dsh-keepalive v0.2.10
Front-end plugin failure reporting + degraded repair + global progress banner.
The watchdog previously only repaired launch failures (web down). A plugin failing to load in the BROWSER while the web process stays up (e.g. module-top-level raf is not defined) was invisible to it. Now:
- keepalive client watches window
error/unhandledrejectionand reports plugin-shaped failures to the host's new POST /api/keepalive/report-plugin-failure (throttled, trusted-loopback only). - The watchdog detects the report in keepalive.json and runs a DEGRADED repair while the web stays up: snapshot skips live dirs (sessions/storages/resume-state/settings.yaml that the running web writes), same headless agent + gates + rollback, then relaunches web to reload plugins and clears the report. Failed repairs clear the report so the watchdog never hot-loops.
- A global repair progress banner (fixed bottom-right, any page) renders while status=repairing: phase (检测故障/快照与审计/修复代理执行中/验证修复/正在重启服务) + agent [进度] lines + failure reason. It surfaces only during an actual repair: the host returns repairProgress only when status==repairing, and the watchdog clears the sidecar file on startup (crash recovery) and when a repair ends.
- Fixes found during end-to-end testing: runPluginFailureRepair referenced the main loop's local bootWait (crash); skipLiveDirs now also excludes resume-state.json and settings.yaml which the running web rewrites; KEEPALIVE_DYNAMIC includes pluginFailure.
End-to-end verified: removed the let raf = 0 declaration in dialog-optimize/client.js -> POSTed the front-end error -> watchdog detected it, the repair agent re-added the declaration (byte-identical to backup, node --check pass) -> web relaunched, report cleared, status back to watching. Full suite green.