Дайджесты новостей
Архитектура детерминированного парсера cronsense: трансляция естественной разговорной речи в форматы cron, RRULE и systemd.timer.

cronsense: трансляция живой речи в выражения cron, RRULE и systemd

Синтаксис расписаний cron с его пятью загадочными звездочками (*/15 2 * * 1-5) остается непреодолимым барьером для неподготовленных пользователей. Когда в интерфейсе корпоративной CRM, чат-бота или системы автоматизации требуется настроить регулярное действие, разработчики часто пытаются решить задачу «в лоб» — отправляют пользовательскую фразу в OpenAI или Claude.

Однако использование нейросетей для парсинга расписаний несет три существенных минуса: высокую задержку (сотни миллисекунд), финансовые затраты на API и неизбежные галлюцинации, когда модель внезапно перепутает первый понедельник месяца со вторым. Открытая библиотека cronsense от разработчика MrProLopstar предлагает детерминированную альтернативу: сверхбыстрый перевод человеческой речи на русском и английском языках в конфигурации планировщиков без единого сетевого запроса.

Детерминированный парсинг против нейросетевых галлюцинаций

Библиотека cronsense построена на базе классического конечного автомата (FSM), лексера и контекстно-свободной грамматики. Это обеспечивает 100% предсказуемость результата и микросекундное время отклика:

  • Обработка входящей фразы выполняется локально в процессе Node.js, Deno, Bun или прямо в браузере.
  • Пакет не содержит внешних зависимостей и весит считаные килобайты.
  • Если фраза сформулирована некорректно, парсер возвращает строгую ошибку валидации вместо попытки угадать намерение пользователя.

Хабратест на прочность: числительные и разговорная речь

После публикации первой версии статьи на Хабре сообщество устроило библиотеке масштабное стресс-тестирование («хабратест»). Инженеры завалили парсер каверзными пограничными сценариями, на которых спотыкались зарубежные аналоги. За несколько дней автор выпустил 7 оперативных релизов и расширил базу до 1584 тестов.

Среди поддержанных конструкций:

  • Разговорные числительные: «полвторого» (13:30), «без четверти пять» (16:45), «в половине первого ночи» (00:30).
  • Сложные циклические интервалы: «каждые 45 минут по вторникам с 9 до 18», «через каждые два дня в полдень».
  • Обратный отсчет и относительные смещения: корректная обработка временных сдвигов относительно текущего момента.

Универсальный триумвират: cron, RRULE и systemd.timer

Главная архитектурная ценность cronsense — мультиформатный вывод. Из одной естественной фразы инструмент генерирует сразу три индустриальных стандарта:

  1. Классический cron: пятипозиционный синтаксис Unix-планировщиков.
  2. iCalendar RRULE (RFC 5545): международный стандарт повторяющихся событий для интеграции с Google Calendar, Microsoft Outlook и Apple Calendar.
  3. systemd.timer (OnCalendar): нативные директивы системных служб современных дистрибутивов Linux.
import { parseSchedule } from "cronsense";

// Трансляция разговорной фразы на русском языке
const schedule = parseSchedule("в полвторого по будням");

// 1. Формат Unix cron: минута, час, день, месяц, день недели
console.log(schedule.cron);
// Вывод: "30 13 * * 1-5"

// 2. Стандарт iCalendar RRULE
console.log(schedule.rrule);
// Вывод: "FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR;BYHOUR=13;BYMINUTE=30"

// 3. Директива OnCalendar для системного таймера Linux
console.log(schedule.systemd);
// Вывод: "Mon..Fri *-*-* 13:30:00"

Производственный календарь и практическая интеграция

Классический синтаксис cron принципиально не способен выразить правила вроде «выполнить в последний рабочий день месяца перед праздниками». В связке с модулем prodcalendar библиотека умеет учитывать официальные праздничные дни и переносы выходных в РФ:

import { parseBusinessSchedule } from "cronsense/business";

// Расписание с учетом праздничных нерабочих дней
const reportSchedule = parseBusinessSchedule(
  "каждый последний рабочий день месяца в 18:00",
  { country: "RU", respectHolidays: true }
);

// Расчет трех ближайших точек фактического запуска
const upcomingDates = reportSchedule.getNextOccurrences(3);
upcomingDates.forEach((date) => {
  console.log("Дата формирования отчета:", date.toISOString());
});

Библиотека cronsense устраняет разрыв между живым человеческим языком и строгими конфигурациями операционных систем. Разработчики получают возможность внедрять дружелюбные поля ввода расписаний в веб-приложения и боты, не жертвуя стабильностью и производительностью серверов.