Timelix Pulse
Отдельный scheduler/queue сервис для отложенных и периодических запусков инструментов
Timelix Pulse — это отдельно деплоимый сервис расписаний и очередей. Он отвечает за отложенные и периодические запуски инструментов, а приложение Timelix работает с ним через клиент lib/pulse.ts и прокси-роуты /api/pulse/*.
Зачем он вынесен отдельно
- расписание живёт вне lifecycle Next.js процесса
- одна очередь может обслуживать несколько окружений и frontend-инстансов
- callback всегда можно направить в production через
CALLBACK_URLна стороне Pulse - Timelix получает единый слой для
schedule,cancel,rescheduleи мониторинга job-ов
Основные части
lib/pulse.ts
Клиентский слой приложения. Здесь находятся:
scheduleJob()cancelJob()cancelJobsForTool()cancelJobsForAssignment()getJobs()checkPulseHealth()
По умолчанию клиент использует PULSE_URL и PULSE_SECRET.
Прокси-роуты Timelix
Timelix не заставляет UI ходить в Pulse напрямую. Вместо этого приложение проксирует основные операции:
GET /api/pulse/statusGET /api/pulse/jobsDELETE /api/pulse/jobs/[id]POST /api/pulse/jobs/[id]/reschedulePOST /api/pulse/callback
Таким образом UI и внутренние модули работают через привычные роуты Timelix, а секрет к Pulse остаётся на сервере.
Интеграция со Store и scheduled tools
Расписания для инструментов синхронизируются из features/Store/api/storeActions.ts.
Именно там формируется payload для очереди и вызывается синхронизация:
- при включении расписания tool assignment
- при изменении времени/интервала
- при удалении или отключении связи
Поток выполнения
Callback и следующий запуск
POST /api/pulse/callback — точка, которую вызывает Pulse после наступления времени job-а.
Этот callback:
- принимает
PulseJobPayload - вызывает нужный инструмент или agent flow
- при необходимости планирует следующий запуск
Сама ссылка callback-а задаётся на стороне Pulse через CALLBACK_URL, а не передаётся с каждого клиента отдельно. Это гарантирует, что даже job, созданный из dev/preview, выполнится в правильном production-контуре.
Fallback: app/api/cron
В Timelix есть запасной путь GET /api/cron?run=true.
Он нужен для:
- ручного запуска scheduled tools
- fallback-сценариев на serverless или во время отладки
Но канонический scheduler — именно Timelix Pulse. Если Pulse доступен, именно он считается главным источником расписаний.
GET /api/cron без run=true возвращает только статус и прямо сообщает, что основной scheduler — Timelix Pulse.
Мониторинг
Для мониторинга используются:
GET /api/pulse/status— быстрая диагностика конфигурации, health и количества jobsGET /api/pulse/jobs— список задач, отфильтрованный по текущему пользователю и компании- UI-компонент
features/PulseDashboard/ui/PulseDashboard.tsx— визуальная панель job-ов там, где она встроена в продукт
Конфигурация
В приложении Timelix
PULSE_URL— адрес внешнего Pulse сервисаPULSE_SECRET— bearer token для запросов в PulseCRON_SECRET— защита fallback endpoint-аapp/api/cron
На стороне Pulse
CALLBACK_URL— куда Pulse должен слать callback после наступления job
Типичные проблемы
Pulse not configured
Обычно это означает, что в Timelix не заданы PULSE_URL или PULSE_SECRET.
Job создаётся, но ничего не выполняется
Проверьте:
- жив ли сам Pulse (
/api/pulse/status) - корректен ли
CALLBACK_URLна стороне Pulse - не падает ли
POST /api/pulse/callback
UI не видит задачи
Сначала смотрите GET /api/pulse/jobs, затем фильтрацию по userId и companyId в proxy-роуте Timelix.
Связанные разделы
- Timelix Tools — какие инструменты запускаются по расписанию
- Timelix Chat — как proactive и scheduled сценарии сходятся с агентским backend-ом