0.39.0

Added

  • Supervisor/Worker watchdog (internal/supervisor/): кросс-платформенная двухпроцессная схема запуска (macOS/Linux/Windows). Supervisor реагирует на exit code worker’а:
  • 0 — graceful (полная остановка, supervisor тоже выходит)
  • 10 — restart (перезапуск worker’а)
  • 11 — update-restart (рестарт после обновления бинарника, готово к фиче автообновления)
  • любой другой — краш, рестарт с экспоненциальным backoff (1s → 60s)
  • Флаг --no-supervisor для запуска в single-process режиме (нужен для systemd/launchd/dev)
  • Раздел Settings → Система в WebUI (видим только глобальному админу): аптайм с live-обновлением, версия, PID worker/supervisor, режим работы (Supervisor/Без supervisor/Системный сервис)
  • Кнопки «Перезапустить» и «Потушить полностью» в разделе «Система» — с confirm-диалогами и предупреждениями для приложений под управлением systemd/launchd
  • API: GET /api/v1/system/info (любой авторизованный), POST /api/v1/system/restart и POST /api/v1/system/shutdown (RequireGlobalAdmin)
  • Эвристика managed_externally (детект systemd/launchd через env INVOCATION_ID/JOURNAL_STREAM/XPC_SERVICE_NAME и системные пути установки)
  • Аудит-лог для административных действий (user_id, username, action, reason, IP)
  • Заглушка «Приложение остановлено» с инструкцией по запуску под текущую платформу (macOS/Linux/Windows)
  • ADR 2026-05-10-механизм-рестарта-приложения.md, ADR 2026-05-10-автообновление-приложения.md, спецификация auto-update-spec.md

Changed

  • Makefile: make dev теперь стартует с --no-supervisor (supervisor не нужен в go run-режиме)
  • deploy.sh: launchd-plist использует KeepAlive=true и --no-supervisor (поднятием процесса управляет launchd, не наш supervisor); systemd-юнит — Restart=always и --no-supervisor для аналогичного поведения
  • cmd/taigaclaw/main.go: при обычном запуске (без env TAIGACLAW_WORKER=1 и без --no-supervisor) main делегирует управление supervisor.Run(), который форкает worker’а с тем же бинарником