Снимок: 2026-10-11. Секция хаба Tools, тайл «Крон» / «Cron», подпись «Команды оболочки и промпты ИИ по расписанию с живым выводом». Доступен всегда.
Экраны и навигация
Screen.Scheduler→SchedulerScreen(624 строки) — список задач.Screen.SchedulerEdit(taskId?, templateId?)→SchedulerTaskScreen(639) — создание/правка задачи + превью расписания.Screen.SchedulerLogs(taskId, taskName)→SchedulerLogsScreen(506) — история прогонов с живым выводом.
Возможности (подробно)
Типы задач
| Тип | Что делает | Поле |
|---|---|---|
shell | Команда в оболочке Termux | command |
ai | Промпт ИИ (агент пишет текст/дайджест) | command = текст промпта |
Шаблон ai_digest — пример: ежедневный короткий статус-дайджест в 20:00, таймаут 600 с (app_scheduler_digest_task).
Расписание
- Cron-выражение (
cronExpr) + часовой пояс (tz). SchedulerTaskScreen.CronPreview— предпросмотр следующих запусков; бэкенд считает ихpreview(cron, tz, n=3).humanSchedule,nextInText,relativeTimeText— человекочитаемые подписи и «через сколько».- Пресеты
cronFromPreset/presetIdOf— быстрый выбор частоты.
Поля задачи
SchedulerFormat.kt (185 строк): tagsOf/textToTags/tagsToText (теги), parseEnvLines/envToLines (переменные окружения), timeoutText (таймаут), humanDuration, runStatusLabel/isFailureStatus (статус прогона), runDurationText.
Управление задачами
SchedulerViewModel (310 строк):
- CRUD:
loadTask/saveTask/deleteTask/duplicateTask. - Запуск:
runTask(запустить сейчас),killTask(прервать). - Вкл/выкл:
toggleTask(enable/disable). - Пауза всего планировщика:
pause(/api/v1/scheduler/pause). - Превью:
preview. - Фильтры:
setQuery,taskMatchesQuery.
Логи прогонов
SchedulerLogsScreen: список прогонов (LogCard), живой вывод текущего (LiveRunCard), блок вывода (OutputBlock), фильтр по статусу (setLogsFilter), режим live (setLogsLive).loadLogs/clearLogs/deleteLog— очистка истории по задаче или по логу.logsToText— выгрузка текстом.
Шаблоны (SchedulerTemplates.kt, 80 строк)
Библиотека готовых задач (TemplateSheet, templateIcon):
| id | что делает | cron |
|---|---|---|
disk_check | свободное место на телефоне | 0 9 * |
tmp_cleanup | удаление временных файлов старше 7 дней | 30 3 * |
backup_home | tar ~/y83-ws в ~/backups | 0 4 0, таймаут 1800 |
ping_check | один ICMP-проб каждые 15 минут | */15 , таймаут 30 |
termux_update | pkg update && pkg upgrade | 0 5 1, таймаут 1800 |
ai_digest | ИИ-дайджест статуса | 0 20 *, тип ai, таймаут 600 |
Статус планировщика
/api/v1/scheduler/status → включён/на паузе, состояние демона; показывается в шапке.
Где в коде
| Файл | Строк | Роль |
|---|---|---|
ui/scheduler/SchedulerScreen.kt | 624 | Список задач, карточки, строки поиска |
ui/scheduler/SchedulerTaskScreen.kt | 639 | Форма задачи + превью расписания |
ui/scheduler/SchedulerLogsScreen.kt | 506 | Логи прогонов, живой вывод |
ui/scheduler/SchedulerViewModel.kt | 310 | Состояние, CRUD, запуск, логи |
ui/scheduler/SchedulerFormat.kt | 185 | Форматирование, cron, теги, env |
ui/scheduler/SchedulerModels.kt | 114 | Модели данных |
ui/scheduler/SchedulerTemplates.kt | 80 | Библиотека шаблонов |
ui/scheduler/SchedulerSheets.kt | 75 | BottomSheet шаблонов |
Данные и API
Репозиторий: data/repo/SchedulerRepository.kt (полный CRUD + логи + превью).
| Эндпоинт | Назначение |
|---|---|
GET /api/v1/scheduler/status | Статус планировщика |
GET /api/v1/scheduler/tasks | Список задач |
POST /api/v1/scheduler/tasks | Создать |
GET /api/v1/scheduler/tasks/{id} | Одна задача |
POST /api/v1/scheduler/tasks/{id} | Обновить |
POST /api/v1/scheduler/tasks/{id}/run | Запустить сейчас |
POST /api/v1/scheduler/tasks/{id}/kill | Прервать |
POST /api/v1/scheduler/tasks/{id}/enable | Включить |
POST /api/v1/scheduler/tasks/{id}/disable | Выключить |
POST /api/v1/scheduler/tasks/{id}/logs | Логи прогона |
GET /api/v1/scheduler/tasks/{id}/logs | Логи задачи |
DELETE /api/v1/scheduler/tasks/{id} | Удалить |
POST /api/v1/scheduler/pause | Пауза/снятие паузы |
POST /api/v1/scheduler/preview | Превью расписания |
GET /api/v1/scheduler/logs | Общий журнал |
DELETE /api/v1/scheduler/logs/{id} | Удалить запись журнала |
Агент
Прямых MCP-тул нет
Планировщик не выведен в MCP-инвентарь ни в одном профиле.
Как агент работает
- REST
/api/v1/scheduler/*черезbridge_command/curl (dev) или через агента на сервере. - Задачи типа
ai— это промпты, которые выполняет агент по расписанию: планировщик сам ИИ не зовёт, он запускает задачу, а агент (Codex/opencode) подхватывает промпт.
Подводные камни
- Задачи живут в backend. Без работающего
ws-backendпланировщик молчит; приложение только UI. - Таймаут по умолчанию 300 с. Для тяжёлых задач (бэкап, обновление) шаблоны поднимают до 1800 с.
- Теги — JSON-массив в поле (
textToTags/tagsToText— конвертация). - Env задачи задаётся построчно (
parseEnvLines) — пустые строки игнорируются. - Превью считает бэкенд с учётом
tz; часовой пояс по умолчанию — системный. - Пауза — глобальная, а не на задачу.
Как обновлять
- Каталог:
data/InstrumentCatalog.kt(idscheduler). - Маршрут:
ui/navigation/Screen.kt(Screen.Scheduler,SchedulerEdit,SchedulerLogs). - Код:
ui/scheduler/*. - Репозиторий:
data/repo/SchedulerRepository.kt. - API:
data/api/BackendApiScheduler.kt, роуты —backend/internal/api/v1/routes.go. - Скилл: отдельного нет; общие правила —
docs/tech/*,AGENTS.md.