@goodandready/dsh-cron 0.1.23 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +117 -82
- package/docs/README.ru.md +133 -85
- package/docs/README.zh.md +140 -82
- package/docs/design/DESIGN.md +44 -35
- package/lib/chat-start.js +2 -2
- package/lib/client.js +668 -412
- package/lib/http-utils.js +81 -0
- package/lib/index.js +342 -384
- package/lib/integrations.js +0 -1
- package/lib/prompt.js +42 -40
- package/lib/runner.js +70 -39
- package/lib/scheduler.js +47 -31
- package/lib/store.js +5 -2
- package/lib/telegram.js +27 -13
- package/package.json +1 -1
package/docs/README.ru.md
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
<div align="center">
|
|
4
4
|
|
|
5
|
-
<h3>Планировщик
|
|
5
|
+
<h3>Планировщик cron-задач, фоновая автоматизация и выполнение сценариев агентом для DeepSeek Harness</h3>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
8
|
<a href="https://www.npmjs.com/package/@goodandready/dsh-cron"><img src="https://img.shields.io/npm/v/@goodandready/dsh-cron.svg?style=for-the-badge&color=6366f1&labelColor=1e1b4b" alt="npm version"></a>
|
|
9
|
-
<a href="LICENSE"><img src="https://img.shields.io/github/license/GooDAnDReaDY/dsh-cron.svg?style=for-the-badge&color=10b981&labelColor=064e3b" alt="license"></a>
|
|
9
|
+
<a href="../LICENSE"><img src="https://img.shields.io/github/license/GooDAnDReaDY/dsh-cron.svg?style=for-the-badge&color=10b981&labelColor=064e3b" alt="license"></a>
|
|
10
10
|
<a href="https://github.com/topics/dsh-plugin"><img src="https://img.shields.io/badge/DSH-Plugin-8b5cf6.svg?style=for-the-badge&labelColor=2e1065" alt="DSH Plugin"></a>
|
|
11
11
|
<a href="https://nodejs.org"><img src="https://img.shields.io/badge/Node-20%2B-f59e0b.svg?style=for-the-badge&labelColor=451a03" alt="Node version"></a>
|
|
12
12
|
</p>
|
|
@@ -25,158 +25,206 @@
|
|
|
25
25
|
|
|
26
26
|
---
|
|
27
27
|
|
|
28
|
-
## ⚡
|
|
28
|
+
## ⚡ Обзор и проблема
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
Автономным AI-агентам регулярно нужны повторяющиеся действия: утренние сводки, разбор трекеров задач, проверка доступности API, синхронизация баз данных, периодическая гигиена Git. Без штатного планировщика внутри харнесса приходится использовать внешние обёртки над crontab, сложные webhook-схемы или ручной запуск.
|
|
31
31
|
|
|
32
|
-
**`@goodandready/dsh-cron`** —
|
|
32
|
+
**`@goodandready/dsh-cron`** — нативный полноформатный плагин планирования и фоновой автоматизации для DeepSeek Harness. Он связывает стандартные cron-выражения и естественные интервалы с автономным исполнением агентами:
|
|
33
33
|
|
|
34
|
-
1.
|
|
35
|
-
2. **Интерактивный
|
|
36
|
-
3.
|
|
37
|
-
4.
|
|
38
|
-
5. **Надёжный движок и атомарное хранение**: построен на библиотеке `croner`, поддерживает таймзоны, интервалы (`every 15m`, `daily`, `weekdays`), атомарную запись JSON-хранилища и историю выполнения.
|
|
34
|
+
1. **Развитый визуальный менеджер задач** — кнопка в сайдбаре и полноценная панель: просмотр, фильтры, пауза, немедленный запуск, создание задач.
|
|
35
|
+
2. **Интерактивный сценарий «Создать с DSH»** — опишите задачу словами, агент уточнит детали и оформит расписание.
|
|
36
|
+
3. **Автономный tool calling** — нативные инструменты `cron_*` позволяют агентам планировать собственные последующие действия прямо в диалоге.
|
|
37
|
+
4. **Надёжный планировщик и атомарное хранилище** — на базе `croner`: интервалы, разовые задачи с задержкой, атомарная запись, история запусков, учёт стоимости.
|
|
39
38
|
|
|
40
39
|
---
|
|
41
40
|
|
|
42
|
-
## 🏗️ Архитектура
|
|
41
|
+
## 🏗️ Архитектура
|
|
43
42
|
|
|
44
43
|
```mermaid
|
|
45
44
|
graph TD
|
|
46
|
-
subgraph Client ["Клиентская
|
|
47
|
-
SidebarBtn["
|
|
48
|
-
Overlay["
|
|
49
|
-
CreateWithDSH["
|
|
50
|
-
ManualForm["
|
|
51
|
-
|
|
45
|
+
subgraph Client ["Клиентская поверхность (DSH UI)"]
|
|
46
|
+
SidebarBtn["Кнопка-часы в сайдбаре<br/>(слот DSH Client UI)"]
|
|
47
|
+
Overlay["Панель управления задачами<br/>(табы: Все, Активные, На паузе, Завершённые)"]
|
|
48
|
+
CreateWithDSH["Диалог «Создать с DSH»<br/>(задача на естественном языке)"]
|
|
49
|
+
ManualForm["Ручная форма задачи<br/>(cron, таймаут, overlap, модель)"]
|
|
50
|
+
SettingsCard["Карточка настроек<br/>(интеграции Telegram / Kanban)"]
|
|
52
51
|
end
|
|
53
52
|
|
|
54
|
-
subgraph Server ["Серверная часть (Cordis и
|
|
55
|
-
HttpRoutes["HTTP REST API
|
|
56
|
-
AgentTools["Шлюз
|
|
57
|
-
Scheduler["Движок TaskScheduler<br/>(
|
|
58
|
-
Store["Атомарный TaskStore<br/>(tasks.json
|
|
59
|
-
AgentRunner["Диспетчер
|
|
53
|
+
subgraph Server ["Серверная часть (Cordis и сервисы DSH)"]
|
|
54
|
+
HttpRoutes["HTTP REST API<br/>(/dsh-cron/*)"]
|
|
55
|
+
AgentTools["Шлюз tool calling<br/>(cron_create_task, cron_list_tasks, ...)"]
|
|
56
|
+
Scheduler["Движок TaskScheduler<br/>(экземпляры Croner + таймеры one-shot)"]
|
|
57
|
+
Store["Атомарный TaskStore<br/>(tasks.json, атомарная запись)"]
|
|
58
|
+
AgentRunner["Диспетчер агентских сессий<br/>(запуск промпта выбранной моделью)"]
|
|
59
|
+
Notify["Доставка<br/>(Telegram Bot API, карточки dsh-kanban)"]
|
|
60
60
|
end
|
|
61
61
|
|
|
62
62
|
SidebarBtn --> Overlay
|
|
63
63
|
Overlay --> CreateWithDSH
|
|
64
64
|
Overlay --> ManualForm
|
|
65
|
-
|
|
65
|
+
SettingsCard --> HttpRoutes
|
|
66
|
+
CreateWithDSH -->|POST /chat/start| HttpRoutes
|
|
66
67
|
ManualForm -->|POST /tasks| HttpRoutes
|
|
67
|
-
SlashCmd -->|Диспетчеризация команд| HttpRoutes
|
|
68
68
|
HttpRoutes --> Scheduler
|
|
69
69
|
AgentTools --> Scheduler
|
|
70
70
|
Scheduler --> Store
|
|
71
|
-
Scheduler -->|Запуск по
|
|
71
|
+
Scheduler -->|Запуск по интервалу/one-shot| AgentRunner
|
|
72
|
+
Scheduler --> Notify
|
|
72
73
|
```
|
|
73
74
|
|
|
74
75
|
---
|
|
75
76
|
|
|
76
|
-
## ✨
|
|
77
|
+
## ✨ Возможности
|
|
77
78
|
|
|
78
|
-
### 1.
|
|
79
|
-
|
|
80
|
-
* **Табы
|
|
81
|
-
*
|
|
82
|
-
* **Готовые шаблоны в
|
|
83
|
-
*
|
|
79
|
+
### 1. Визуальный менеджер задач
|
|
80
|
+
Нажмите на иконку-часы в сайдбаре DSH (рядом с кнопкой новой сессии), чтобы открыть панель:
|
|
81
|
+
* **Табы фильтрации**: **Все**, **Активные**, **На паузе**, **Завершённые**.
|
|
82
|
+
* **Мгновенные действия**: немедленный запуск (**Запустить**), пауза/возобновление расписания, удаление с подтверждением.
|
|
83
|
+
* **Готовые шаблоны в один клик**: *Ежедневная сводка*, *Еженедельный обзор*, *Мониторинг дальнейших действий*.
|
|
84
|
+
* **История запусков**: в карточке задачи — время, длительность и статусы предыдущих запусков (успех / сбой / таймаут / пропуск / пропущен по простою), вывод и ошибки.
|
|
85
|
+
* **Сводная статистика**: активные задачи, всего запусков, израсходованные токены и оценочная стоимость в долларах.
|
|
84
86
|
|
|
85
|
-
### 2.
|
|
86
|
-
|
|
87
|
+
### 2. Диалог «Создать с DSH»
|
|
88
|
+
Превратите естественный язык в задачу без подбора cron-синтаксиса:
|
|
87
89
|
1. Нажмите **Создать ⌄** ➔ **Создать с DSH**.
|
|
88
|
-
2.
|
|
89
|
-
3.
|
|
90
|
-
4. Плагин автоматически создаст отдельную диалоговую сессию с агентом, передаст системные инструкции планировщика и зарегистрирует задачу в `TaskStore`.
|
|
90
|
+
2. Опишите, что нужно автоматизировать (например: *«Проверяй открытые PR по будням в 9:00 и готовь черновики комментариев»*).
|
|
91
|
+
3. Плагин создаст отдельную агентскую сессию с системными инструкциями планировщика. Агент уточнит детали — LLM или NO-LLM shell-задача, точное cron-выражение, экономичная модель из доступных в вашей установке DSH, нужно ли «правило тишины» (алерт только при новых событиях или сбоях) — и создаст задачу через инструмент `cron_create_task` только после вашего подтверждения.
|
|
91
92
|
|
|
92
|
-
### 3.
|
|
93
|
-
Для тех, кто предпочитает работу с клавиатуры:
|
|
93
|
+
### 3. Инструменты агентов (tool calling)
|
|
94
94
|
|
|
95
|
-
|
|
|
96
|
-
|
|
97
|
-
|
|
|
98
|
-
|
|
|
99
|
-
|
|
|
100
|
-
|
|
|
101
|
-
|
|
|
102
|
-
|
|
|
95
|
+
| Инструмент | Описание |
|
|
96
|
+
|:---|:---|
|
|
97
|
+
| `cron_create_task` | Создаёт задачу: `title`, `schedule`, `prompt`, опционально `type` (`llm`/`script`), `delivery`, `provider`, `model`, `notifyTelegram`, `onlyOnFailure`, `timeoutSeconds`, `overlapPolicy`, `kanbanMode` |
|
|
98
|
+
| `cron_schedule_task` | Псевдоним `cron_create_task` для совместимости с существующими промптами |
|
|
99
|
+
| `cron_list_tasks` | Список задач со статусами, временем следующего запуска, токенами и стоимостью |
|
|
100
|
+
| `cron_pause_task` | Приостанавливает расписание без удаления конфигурации |
|
|
101
|
+
| `cron_resume_task` | Возобновляет приостановленное расписание |
|
|
102
|
+
| `cron_delete_task` | Полностью удаляет задачу и её историю |
|
|
103
|
+
| `cron_run_task` | Немедленный внеплановый запуск |
|
|
103
104
|
|
|
104
|
-
|
|
105
|
-
Агент может вызывать инструменты планировщика в процессе общения:
|
|
105
|
+
Пример вызова модели в диалоге:
|
|
106
106
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
107
|
+
```
|
|
108
|
+
cron_create_task({
|
|
109
|
+
"title": "Утренняя сводка",
|
|
110
|
+
"schedule": "0 8 * * 1-5",
|
|
111
|
+
"prompt": "Подготовь короткую утреннюю сводку активных задач и открытых тикетов.",
|
|
112
|
+
"type": "llm",
|
|
113
|
+
"delivery": "isolated"
|
|
114
|
+
})
|
|
115
|
+
```
|
|
110
116
|
|
|
111
|
-
###
|
|
112
|
-
|
|
117
|
+
### 4. Синтаксис расписаний
|
|
118
|
+
На базе `croner`: стандартные 5-полевые cron-выражения и дружелюбные алиасы:
|
|
113
119
|
|
|
114
|
-
* `0 9 * * 1-5` — по будням в 09:00
|
|
120
|
+
* `0 9 * * 1-5` — по будням в 09:00
|
|
115
121
|
* `*/15 * * * *` — каждые 15 минут
|
|
116
122
|
* `0 0 * * 0` — каждое воскресенье в полночь
|
|
117
|
-
* `every 10m` / `every 2h` / `every 30s` — интервалы
|
|
118
|
-
* `daily` / `hourly` / `
|
|
123
|
+
* `every 10m` / `every 2h` / `every 30s` — естественные интервалы
|
|
124
|
+
* алиасы `daily` / `hourly` / `weekdays` (`weekdays` → `0 9 * * 1-5`)
|
|
125
|
+
* **Разовые задачи**: `at: 2026-09-05T15:00:00Z` (точный ISO-таймстемп) или относительные задержки `in 20m` / `in 2h` (принимаются и русские варианты вроде `через 15 минут`). После единственного запуска задача автоматически переходит в `completed` и отображается на табе **Завершённые**.
|
|
126
|
+
|
|
127
|
+
### 5. Уведомления Telegram
|
|
128
|
+
Прямая интеграция с Telegram Bot API доставляет отчёты о запусках и трейсы ошибок в мессенджер:
|
|
129
|
+
|
|
130
|
+
* **Автоматические или собственные креденшелы** — введите свои `botToken` и `chatId` в диалоге настроек или позвольте плагину унаследовать значения по умолчанию из секции `dsh-messenger-gateway` вашего DSH `settings.yaml` (best-effort).
|
|
131
|
+
* **Режим «только при сбоях»** — включите `onlyOnFailure` глобально или для отдельной задачи. Успешные запуски молчат; сбои (статусы `error` и `timeout`) отправляют алерт с трейсом.
|
|
132
|
+
* **Markdown-оформление** — статусные значки (✅ / ❌), длительность, описание расписания и monospace-блоки вывода; динамические значения экранируются, поэтому нестандартные символы в названии не сломают сообщение.
|
|
133
|
+
* **Кнопка проверки** — проверьте доставку в Telegram до запуска критичных задач.
|
|
134
|
+
|
|
135
|
+
### 6. Интеграция с Kanban и учёт стоимости
|
|
136
|
+
* **Автоматические карточки Kanban** — при `kanbanMode` = `on_failure` или `always` плагин создаёт карточки в `dsh-kanban` (`on_failure` → *Backlog* при `error`/`timeout`; `always` → *Done*/*Backlog* по завершении).
|
|
137
|
+
* **Счётчик токенов и стоимости** — потребление токенов (ввод, вывод, чтения из кэша) учитывается по запускам и задачам с оценкой в USD по встроенной таблице цен и сводной панелью аналитики.
|
|
138
|
+
|
|
139
|
+
### 7. Политики наложения и таймаут выполнения
|
|
140
|
+
|
|
141
|
+
* **Таймаут (`timeoutSeconds`)** — по достижении лимита shell-процесс немедленно завершается через abort-сигнал, а агентская сессия закрывается, чтобы не расходовать токены. По умолчанию `1800` (30 минут).
|
|
142
|
+
* **Политика наложения (`overlapPolicy`)** — что делать, когда тик срабатывает при ещё активном предыдущем запуске:
|
|
143
|
+
* **`skip`** (по умолчанию): накладывающийся запуск отбрасывается, в истории появляется запись `skipped`;
|
|
144
|
+
* **`queue`**: следующий запуск ставится в очередь и стартует по завершении активного;
|
|
145
|
+
* **`replace`**: активный запуск прерывается через `AbortController`, запускается свежий.
|
|
146
|
+
|
|
147
|
+
Если сервис был выключен в момент планового запуска, при старте в истории появится запись `missed` — пробелы в истории остаются видимыми.
|
|
119
148
|
|
|
120
149
|
---
|
|
121
150
|
|
|
122
151
|
## 📦 Установка
|
|
123
152
|
|
|
124
|
-
Установка через командную строку DeepSeek Harness:
|
|
125
|
-
|
|
126
153
|
```bash
|
|
127
154
|
dsh plugin --profile web add @goodandready/dsh-cron
|
|
128
155
|
```
|
|
129
156
|
|
|
130
|
-
Перезапустите
|
|
157
|
+
Перезапустите DeepSeek Harness и обновите страницу в браузере.
|
|
131
158
|
|
|
132
159
|
---
|
|
133
160
|
|
|
134
161
|
## ⚙️ Конфигурация (`settings.yaml`)
|
|
135
162
|
|
|
136
|
-
|
|
163
|
+
Конфигурацию можно задать в `settings.yaml` или интерактивно через карточку настроек плагина в DSH:
|
|
137
164
|
|
|
138
165
|
```yaml
|
|
139
166
|
# settings.yaml
|
|
140
167
|
dsh-cron:
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
168
|
+
botToken: "" # токен Telegram Bot API (секретное поле)
|
|
169
|
+
chatId: "" # ID чата Telegram для отчётов
|
|
170
|
+
notifyTelegram: false # глобально отправлять отчёты о всех задачах
|
|
171
|
+
onlyOnFailure: false # отправлять отчёты только при сбоях
|
|
172
|
+
kanbanBaseUrl: "http://127.0.0.1:3000" # базовый URL HTTP API dsh-kanban
|
|
146
173
|
```
|
|
147
174
|
|
|
148
|
-
###
|
|
175
|
+
### Параметры
|
|
149
176
|
|
|
150
177
|
| Параметр | Тип | По умолчанию | Описание |
|
|
151
178
|
|:---|:---|:---|:---|
|
|
152
|
-
| `
|
|
153
|
-
| `
|
|
154
|
-
| `
|
|
155
|
-
| `
|
|
156
|
-
| `
|
|
179
|
+
| `botToken` | `string` | `""` | Токен Telegram Bot API. Если пусто, плагин пытается унаследовать бота, настроенного для `dsh-messenger-gateway` в настройках DSH (best-effort). Секретное поле: в интерфейсе отображается только замаскированное значение |
|
|
180
|
+
| `chatId` | `string` | `""` | ID чата Telegram для отчётов. Пустое значение — откат к первому разрешённому чату `dsh-messenger-gateway` |
|
|
181
|
+
| `notifyTelegram` | `boolean` | `false` | Глобальный выключатель доставки отчётов в Telegram |
|
|
182
|
+
| `onlyOnFailure` | `boolean` | `false` | Глобальный режим «только при сбоях» (`error`/`timeout`) |
|
|
183
|
+
| `kanbanBaseUrl` | `string` | `"http://127.0.0.1:3000"` | Базовый URL HTTP API `dsh-kanban` для автоматических карточек |
|
|
184
|
+
|
|
185
|
+
Примечания:
|
|
186
|
+
|
|
187
|
+
* История запусков ограничена **50 записями на задачу** (фиксировано); в записи хранится до 4000 символов вывода.
|
|
188
|
+
* Задачи выполняются в **локальном часовом поясе сервера**; cron-выражения вычисляет `croner` по часам хоста.
|
|
189
|
+
* Задачи сохраняются в каталоге данных DSH (`cron/tasks.json`) и переживают перезапуск; пропущенные one-shot запуски обнаруживаются при старте.
|
|
157
190
|
|
|
158
191
|
---
|
|
159
192
|
|
|
160
|
-
##
|
|
193
|
+
## 🔌 HTTP API
|
|
194
|
+
|
|
195
|
+
Все эндпоинты обслуживаются веб-сервером DSH под `/dsh-cron/`. Чтение открыто локальному интерфейсу; **мутирующие эндпоинты отклоняют cross-origin запросы** и принимают тела до 1 МБ. Для создания `script`-задач по HTTP дополнительно требуется заголовок `x-dsh-cron-confirm: script`, который подделанный межсайтовый запрос приложить не может.
|
|
161
196
|
|
|
162
|
-
|
|
197
|
+
| Метод | Путь | Описание |
|
|
198
|
+
|:---|:---|:---|
|
|
199
|
+
| `GET` | `/dsh-cron/tasks` | Список задач; параметры `status` (`all/active/paused/completed`), `query` (подстрока). Возвращает задачи, шаблоны рекомендаций и сводную статистику |
|
|
200
|
+
| `POST` | `/dsh-cron/tasks` | Создание или обновление задачи (при наличии `id` — обновление). Обязательны `title`, `schedule`, `prompt` |
|
|
201
|
+
| `GET` | `/dsh-cron/tasks/:id/history` | История запусков, `?limit=20` |
|
|
202
|
+
| `POST` | `/dsh-cron/tasks/:id/run` | Немедленный ручной запуск |
|
|
203
|
+
| `POST` | `/dsh-cron/tasks/:id/pause` | Пауза расписания |
|
|
204
|
+
| `POST` | `/dsh-cron/tasks/:id/resume` | Возобновление расписания |
|
|
205
|
+
| `POST` | `/dsh-cron/tasks/:id/toggle` | Переключение активна/на паузе |
|
|
206
|
+
| `PATCH` | `/dsh-cron/tasks/:id` | Частичное обновление (только whitelisted-поля: `title`, `schedule`, `prompt`, `type`, `delivery`, `provider`, `model`, настройки уведомлений/таймаута/overlap/kanban, `status`, `oneShot`) |
|
|
207
|
+
| `DELETE` | `/dsh-cron/tasks/:id` | Удаление задачи |
|
|
208
|
+
| `GET` | `/dsh-cron/models` | Список LLM-провайдеров; `?provider=<id>` — модели |
|
|
209
|
+
| `POST` | `/dsh-cron/chat/start` | Старт агентской сессии «Создать с DSH» с инструкциями планировщика |
|
|
210
|
+
| `GET` | `/dsh-cron/settings` | Настройки для клиента (токен замаскирован) |
|
|
211
|
+
| `POST` | `/dsh-cron/settings` | Обновление настроек интеграций |
|
|
212
|
+
| `POST` | `/dsh-cron/telegram/test` | Тестовое сообщение в Telegram |
|
|
213
|
+
| `POST` | `/dsh-cron/kanban/test` | Тестовая карточка в Kanban |
|
|
214
|
+
| `*` | `/dsh-cron/action/:id/:action` | Legacy-алиас действий над задачей (`run`, `toggle`, `delete`, `history`) |
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## 🧪 Тестирование
|
|
163
219
|
|
|
164
220
|
```bash
|
|
165
221
|
npm test
|
|
166
222
|
```
|
|
167
223
|
|
|
224
|
+
Набор покрывает разбор расписаний, движок планировщика, атомарное хранилище, HTTP-хелперы, уведомления и контракт инструментов.
|
|
225
|
+
|
|
168
226
|
---
|
|
169
227
|
|
|
170
228
|
## 📄 Лицензия
|
|
171
229
|
|
|
172
230
|
MIT © [GooDAnDReaDY](https://github.com/GooDAnDReaDY)
|
|
173
|
-
|
|
174
|
-
### Интеграция с Kanban и счетчик стоимости токенов (v0.1.17)
|
|
175
|
-
- **Автосоздание карточек в Kanban**: Автоматическое заведение задач в бэклог `dsh-kanban` при обнаружении сбоев/ошибок (`on_failure`) или при каждом завершении (`always`).
|
|
176
|
-
- **Трекинг токенов и расчет расходов (USD)**: Подсчет потребления токенов (input, output, cacheRead) для каждой задачи и запуск с расчетом примерной стоимости в долларах США.
|
|
177
|
-
- **Сводная панель статистики**: Отображение общего числа запусков, активных задач, суммарного расхода токенов и совокупных затрат прямо в заголовке планировщика.
|
|
178
|
-
|
|
179
|
-
### Разовые отложенные задачи (v0.1.18)
|
|
180
|
-
- **Точное время и относительные задержки**: Поддержка однократных задач, запускаемых в конкретный момент времени по стандарту ISO 8601 (`at: 2026-09-05T12:00:00Z`) или через заданный интервал (`in 20m`, `in 2h`, `через 15 минут`).
|
|
181
|
-
- **Автоматический перевод в «Завершенные»**: После единичного выполнения задача автоматически переходит в статус `completed`, исключая повторные старты.
|
|
182
|
-
- **Индикация в интерфейсе**: Разовые задачи помечаются специальным бейджем «Разовая» и фильтруются по вкладке «Завершенные».
|