0.90.0

Added

  • Параметр timezone в cron-tool — агент может указать IANA-таймзону (например, Europe/Moscow) для cron-выражений и одноразовых задач. Ранее — всегда UTC.
  • Параметр every (string duration) в cron-tool — вместо every_seconds: 86400 можно передать every: "24h". Старый параметр every_seconds сохранён для обратной совместимости.
  • Пресеты расписаний в WebUI — кнопки быстрого выбора для cron («Ежедневно в 09:00», «Будни в 09:00», «Каждые 15 минут» и т.д.) и для every («5 минут», «1 час», «24 часа»).
  • Human-readable описание расписания в списке задач WebUI — вместо сырого cron: 0 9 * * 1-5 показывается «Будни в 09:00».
  • datetime-local picker для одноразовых задач (тип at) — вместо текстового поля теперь нативный календарь/время.
  • Формат datetime-local (без секунд) поддерживается при парсинге выражений типа at.
  • Функции DescribeCronExpr и DescribeEveryExpr в cron-пакете — human-readable описание расписаний на русском.

Fixed

  • Race condition в executeJob — добавлен мьютекс runningMu, предотвращающий параллельное выполнение одной и той же задачи при длинных запусках (>10 сек).
  • RunHistory не заполнялся — при каждом выполнении cron-задачи теперь записывается история (время, ошибка) до 20 записей. Ранее поле всегда оставалось "[]".
  • last_error не очищался при включении задачи — Toggle с enabled=true теперь сбрасывает last_error и пересчитывает next_run_at.
  • last_error не обновлялся через UpdateCronJob — SQL-запросы в SQLite и PostgreSQL обновляют поле.