From 24f568b1496c65eb8a19ce1da6fed1cafeca7149 Mon Sep 17 00:00:00 2001 From: Weilong Liao <37870767+Soulter@users.noreply.github.com> Date: Wed, 3 Jun 2026 22:02:59 +0800 Subject: [PATCH] feat: future task UI (#8559) * feat: future task UI * fix: update filter label for UMO in English and Chinese locales * feat: enhance cron job management with delivery target handling and UI improvements * fix: update session label to indicate optional delivery target * feat: add tooltip for last run time and error in cron job display --- astrbot/core/cron/manager.py | 42 +- astrbot/dashboard/routes/cron.py | 34 +- .../mdi-subset/materialdesignicons-subset.css | 14 +- .../materialdesignicons-webfont-subset.woff | Bin 19084 -> 19228 bytes .../materialdesignicons-webfont-subset.woff2 | Bin 15376 -> 15460 bytes .../src/i18n/locales/en-US/features/cron.json | 84 +- .../src/i18n/locales/ru-RU/features/cron.json | 274 ++- .../src/i18n/locales/zh-CN/features/cron.json | 86 +- dashboard/src/theme/LightTheme.ts | 2 +- dashboard/src/views/CronJobPage.vue | 1711 ++++++++++++----- 10 files changed, 1599 insertions(+), 648 deletions(-) diff --git a/astrbot/core/cron/manager.py b/astrbot/core/cron/manager.py index 9f3116f65..fde2ad5cd 100644 --- a/astrbot/core/cron/manager.py +++ b/astrbot/core/cron/manager.py @@ -15,6 +15,7 @@ from astrbot.core.cron.events import CronMessageEvent from astrbot.core.db import BaseDatabase from astrbot.core.db.po import CronJob from astrbot.core.platform.message_session import MessageSession +from astrbot.core.platform.message_type import MessageType from astrbot.core.provider.entites import ProviderRequest from astrbot.core.utils.history_saver import persist_agent_history @@ -200,9 +201,18 @@ class CronJobManager: return None return aps_job.next_run_time.astimezone(timezone.utc) - async def _run_job(self, job_id: str) -> None: + async def run_job_now(self, job_id: str) -> None: + await self._run_job(job_id, ignore_enabled=True, delete_run_once=False) + + async def _run_job( + self, + job_id: str, + *, + ignore_enabled: bool = False, + delete_run_once: bool = True, + ) -> None: job = await self.db.get_cron_job(job_id) - if not job or not job.enabled: + if not job or (not job.enabled and not ignore_enabled): return start_time = datetime.now(timezone.utc) await self.db.update_cron_job( @@ -230,7 +240,7 @@ class CronJobManager: last_error=last_error, next_run_time=next_run, ) - if job.run_once: + if job.run_once and delete_run_once: # one-shot: remove after execution regardless of success await self.delete_job(job_id) @@ -245,9 +255,14 @@ class CronJobManager: async def _run_active_agent_job(self, job: CronJob, start_time: datetime) -> None: payload = job.payload or {} - session_str = payload.get("session") - if not session_str: - raise ValueError("ActiveAgentCronJob missing session.") + delivery_session_str = str(payload.get("session") or "").strip() + session_str = delivery_session_str or str( + MessageSession( + platform_name="cron", + message_type=MessageType.OTHER_MESSAGE, + session_id=job.job_id, + ) + ) note = payload.get("note") or job.description or job.name extras = { @@ -262,7 +277,7 @@ class CronJobManager: "run_at": ( job.payload.get("run_at") if isinstance(job.payload, dict) else None ), - "session": session_str, + "session": delivery_session_str, }, "cron_payload": payload, } @@ -271,6 +286,7 @@ class CronJobManager: message=note, session_str=session_str, extras=extras, + delivery_session_str=delivery_session_str, ) async def _woke_main_agent( @@ -279,6 +295,7 @@ class CronJobManager: message: str, session_str: str, extras: dict, + delivery_session_str: str = "", ) -> None: """Woke the main agent to handle the cron job message.""" from astrbot.core.astr_main_agent import ( @@ -353,11 +370,12 @@ class CronJobManager: "Output using same language as previous conversation. " "After completing your task, summarize and output your actions and results." ) - if not req.func_tool: - req.func_tool = ToolSet() - req.func_tool.add_tool( - self.ctx.get_llm_tool_manager().get_builtin_tool(SendMessageToUserTool) - ) + if delivery_session_str: + if not req.func_tool: + req.func_tool = ToolSet() + req.func_tool.add_tool( + self.ctx.get_llm_tool_manager().get_builtin_tool(SendMessageToUserTool) + ) result = await build_main_agent( event=cron_event, plugin_context=self.ctx, config=config, req=req diff --git a/astrbot/dashboard/routes/cron.py b/astrbot/dashboard/routes/cron.py index 8417c970c..85dbc2509 100644 --- a/astrbot/dashboard/routes/cron.py +++ b/astrbot/dashboard/routes/cron.py @@ -1,3 +1,4 @@ +import asyncio import traceback from datetime import datetime, timezone @@ -15,11 +16,13 @@ class CronRoute(Route): ) -> None: super().__init__(context) self.core_lifecycle = core_lifecycle + self._background_tasks: set[asyncio.Task] = set() self.routes = [ ("/cron/jobs", ("GET", self.list_jobs)), ("/cron/jobs", ("POST", self.create_job)), ("/cron/jobs/", ("PATCH", self.update_job)), ("/cron/jobs/", ("DELETE", self.delete_job)), + ("/cron/jobs//run", ("POST", self.run_job_now)), ] self.register_routes() @@ -71,7 +74,7 @@ class CronRoute(Route): name = payload.get("name") or "active_agent_task" cron_expression = payload.get("cron_expression") note = payload.get("note") or payload.get("description") or name - session = payload.get("session") + session = str(payload.get("session") or "").strip() persona_id = payload.get("persona_id") provider_id = payload.get("provider_id") timezone = payload.get("timezone") @@ -79,8 +82,6 @@ class CronRoute(Route): run_once = bool(payload.get("run_once", False)) run_at = payload.get("run_at") - if not session: - return jsonify(Response().error("session is required").__dict__) if run_once and not run_at: return jsonify( Response().error("run_at is required when run_once=true").__dict__ @@ -172,11 +173,10 @@ class CronRoute(Route): if "session" in payload: session = str(payload.get("session") or "").strip() - if not session: - return jsonify( - Response().error("session cannot be empty").__dict__ - ) - merged_payload["session"] = session + if session: + merged_payload["session"] = session + else: + merged_payload.pop("session", None) note_updated = False if "note" in payload: @@ -281,3 +281,21 @@ class CronRoute(Route): except Exception as e: # noqa: BLE001 logger.error(traceback.format_exc()) return jsonify(Response().error(f"Failed to delete job: {e!s}").__dict__) + + async def run_job_now(self, job_id: str): + try: + cron_mgr = self.core_lifecycle.cron_manager + if cron_mgr is None: + return jsonify( + Response().error("Cron manager not initialized").__dict__ + ) + job = await cron_mgr.db.get_cron_job(job_id) + if not job: + return jsonify(Response().error("Job not found").__dict__) + task = asyncio.create_task(cron_mgr.run_job_now(job_id)) + self._background_tasks.add(task) + task.add_done_callback(self._background_tasks.discard) + return jsonify(Response().ok(message="started").__dict__) + except Exception as e: # noqa: BLE001 + logger.error(traceback.format_exc()) + return jsonify(Response().error(f"Failed to run job: {e!s}").__dict__) diff --git a/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css b/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css index 73e5e1b92..8e5fd76cd 100644 --- a/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css +++ b/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css @@ -1,4 +1,4 @@ -/* Auto-generated MDI subset – 268 icons */ +/* Auto-generated MDI subset – 271 icons */ /* Do not edit manually. Run: pnpm run subset-icons */ @font-face { @@ -228,6 +228,10 @@ content: "\F0150"; } +.mdi-clock-time-four-outline::before { + content: "\F144E"; +} + .mdi-close::before { content: "\F0156"; } @@ -820,6 +824,10 @@ content: "\F040A"; } +.mdi-play-circle-outline::before { + content: "\F040D"; +} + .mdi-plus::before { content: "\F0415"; } @@ -892,6 +900,10 @@ content: "\F167A"; } +.mdi-send-outline::before { + content: "\F1165"; +} + .mdi-server::before { content: "\F048B"; } diff --git a/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff b/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff index 79ae57535f33578225882d73cb8ca249da304e17..181ce7f861d8ef9e5a7350046f16518f192c67c3 100644 GIT binary patch delta 18780 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 XoMT{QU|{5DlkrIt1MvaQlLtzLPybFr delta 18626 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 Z0C=2ZU}Rum1Q6GZ?3 diff --git a/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff2 b/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff2 index 13a0380b93659f3441bfd95338412180a9a70f4e..931625c6d7f87f508ea630673ddc995d15673d3d 100644 GIT binary patch literal 15460 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 diff --git a/dashboard/src/i18n/locales/en-US/features/cron.json b/dashboard/src/i18n/locales/en-US/features/cron.json index a3bafd4d6..5b081d69e 100644 --- a/dashboard/src/i18n/locales/en-US/features/cron.json +++ b/dashboard/src/i18n/locales/en-US/features/cron.json @@ -6,8 +6,9 @@ "page": { "title": "Future Task Management", "beta": "Experimental", - "subtitle": "See scheduled tasks for AstrBot. AstrBot will wake up, run them, and deliver the results.", + "subtitle": "AstrBot wakes up at the scheduled time, completes the task, and sends the result back to the target conversation.", "proactive": { + "link": "Supported platforms", "supported": "Proactive delivery is available only on the configured platforms below", "unsupported": "No proactive messaging platforms enabled. Turn them on in Platform settings." } @@ -18,9 +19,36 @@ "refresh": "Refresh", "delete": "Delete", "cancel": "Cancel", + "close": "Close", + "more": "More actions", + "runNow": "Run now", "save": "Save", "submit": "Create" }, + "platformDialog": { + "title": "Supported Platforms", + "description": "Only the following platforms support proactive message delivery. AstrBot can send future task results back only to target conversations on these platforms." + }, + "card": { + "onceAt": "One-off · {time}", + "runAt": "Run at: {time}", + "nextRun": "Next run: {time}", + "dailyAt": "Daily at {time}", + "weeklyAt": "Every {day} at {time}", + "monthlyAt": "Monthly on day {day} at {time}", + "everyMinutes": "Every {count} minutes", + "everyHours": "Every {count} hours", + "everyDays": "Every {count} days", + "customCron": "Custom · {cron}", + "noDeliveryTarget": "No delivery target" + }, + "filters": { + "search": "Search title and content", + "umo": "Filter by delivery target", + "noUmos": "No UMOs", + "noDeliveryTarget": "No delivery target", + "noMatches": "No matching future tasks." + }, "overview": { "totalTasks": "Total Tasks", "totalTasksNote": "Registered future tasks", @@ -82,12 +110,43 @@ "editTitle": "Edit Task", "chatHint": "You can ask AstrBot in chat to create future tasks instead of adding them here.", "runOnce": "One-off task", - "name": "Task name", - "note": "Task description", - "cron": "Cron expression", + "name": "Task name *", + "note": "Task requirements *", + "scheduleMode": "Execution time *", + "scheduleModes": { + "once": "One-off", + "interval": "Interval", + "daily": "Daily", + "weekly": "Weekly", + "monthly": "Monthly", + "cron": "Custom Cron" + }, + "intervalEvery": "Every *", + "intervalUnit": "Unit *", + "intervalUnits": { + "minutes": "Minutes", + "hours": "Hours", + "days": "Days" + }, + "dailyTime": "Time *", + "weeklyDay": "Weekday *", + "weeklyTime": "Time *", + "monthlyDay": "Day *", + "monthlyTime": "Time *", + "weekdays": { + "sunday": "Sunday", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday" + }, + "cron": "Cron expression *", "cronPlaceholder": "0 9 * * *", - "runAt": "Run at", - "session": "Target session (platform_id:message_type:session_id)", + "runAt": "Run at *", + "session": "Deliver to", + "noUmos": "No sessions available", "timezone": "Timezone (optional, e.g. Asia/Shanghai)", "enabled": "Enabled" }, @@ -97,11 +156,18 @@ "updateFailed": "Failed to update", "deleteSuccess": "Deleted", "deleteFailed": "Failed to delete", - "sessionRequired": "Session is required", - "noteRequired": "Description is required", + "nameRequired": "Task name is required", + "sessionRequired": "Delivery target is required", + "noteRequired": "Task requirements are required", "cronRequired": "Cron expression is required", "runAtRequired": "Please select run time", + "intervalRequired": "Please enter a valid interval", + "dailyTimeRequired": "Please select the daily run time", + "weeklyTimeRequired": "Please select the weekly day and time", + "monthlyTimeRequired": "Please select the monthly day and time", "createSuccess": "Created successfully", - "createFailed": "Failed to create" + "createFailed": "Failed to create", + "runStarted": "Started", + "runFailed": "Failed to run" } } diff --git a/dashboard/src/i18n/locales/ru-RU/features/cron.json b/dashboard/src/i18n/locales/ru-RU/features/cron.json index 76b875ad1..104228950 100644 --- a/dashboard/src/i18n/locales/ru-RU/features/cron.json +++ b/dashboard/src/i18n/locales/ru-RU/features/cron.json @@ -1,107 +1,173 @@ { - "header": { - "eyebrow": "Automation", - "live": "Живая синхронизация" - }, - "page": { - "title": "Запланированные задачи", - "beta": "Экспериментальные функции", - "subtitle": "Управление будущими задачами AstrBot. Бот автоматически проснется, выполнит задачу и отправит результат. Требуется включить «Проактивные способности» в конфигурации.", - "proactive": { - "supported": "Отправка результатов поддерживается только на указанных ниже настроенных платформах", - "unsupported": "Нет платформ, поддерживающих проактивные сообщения. Включите их в настройках платформ." - } - }, - "actions": { - "create": "Новая задача", - "edit": "Изменить", - "refresh": "Обновить", - "delete": "Удалить", - "cancel": "Отмена", - "save": "Сохранить", - "submit": "Создать" - }, - "overview": { - "totalTasks": "Всего задач", - "totalTasksNote": "Все зарегистрированные будущие задачи", - "enabledTasks": "Активные задачи", - "enabledTasksNote": "Задачи, которые будут автоматически выполнены", - "oneOffTasks": "Разовые задачи", - "recurringTasksNote": "Повторяющихся задач: {count}", - "proactivePlatforms": "Проактивные платформы", - "proactivePlatformsNote": "Платформы, способные отправлять результат сами" - }, - "section": { - "registered": { - "title": "Список задач", - "subtitle": "Просматривайте зарегистрированные задачи, время запуска и состояние" - }, - "delivery": { - "title": "Статус доставки", - "subtitle": "После выполнения задачи результат будет отправлен обратно через поддерживаемые платформы", - "support": "Проактивная доставка", - "available": "Доступна", - "unavailable": "Недоступна", - "enabledPlatforms": "Включенные платформы" - }, - "quickCreate": { - "title": "Быстрое создание", - "runMode": "Режим задачи", - "target": "Целевой контекст" - }, - "platforms": { - "title": "Поддерживаемые платформы" - } - }, - "table": { - "title": "Список задач", - "subtitle": "Отслеживайте cron, целевую сессию, историю запусков и состояние", - "empty": "Задач пока нет.", - "headers": { - "name": "Имя", - "type": "Тип", - "cron": "Cron", - "session": "ID сессии", - "nextRun": "Следующий запуск", - "lastRun": "Последний запуск", - "note": "Описание", - "actions": "Действия" - }, - "type": { - "once": "Разовая", - "recurring": "Повторяющаяся", - "activeAgent": "Активный агент", - "workflow": "Рабочий процесс", - "unknown": "{type}" - }, - "timezoneLocal": "Местное время", - "notAvailable": "—" - }, - "form": { - "title": "Создать задачу", - "editTitle": "Редактировать задачу", - "chatHint": "Вы можете ставить задачи прямо в чате, AstrBot создаст их автоматически без заполнения этой формы.", - "runOnce": "Разовая задача", - "name": "Имя задачи", - "note": "Описание", - "cron": "Cron-выражения", - "cronPlaceholder": "0 9 * * *", - "runAt": "Время запуска", - "session": "Целевая сессия (platform_id:message_type:session_id)", - "timezone": "Часовой пояс (опционально, напр. Europe/Moscow)", - "enabled": "Включено" - }, - "messages": { - "loadFailed": "Ошибка загрузки задач", - "updateSuccess": "Задача обновлена", - "updateFailed": "Ошибка обновления", - "deleteSuccess": "Удалено", - "deleteFailed": "Ошибка удаления", - "sessionRequired": "Укажите сессию", - "noteRequired": "Заполните описание", - "cronRequired": "Укажите Cron-выражение", - "runAtRequired": "Выберите время запуска", - "createSuccess": "Задача создана", - "createFailed": "Ошибка создания" + "header": { + "eyebrow": "Automation", + "live": "Живая синхронизация" + }, + "page": { + "title": "Запланированные задачи", + "beta": "Экспериментальные функции", + "subtitle": "AstrBot проснется в заданное время, выполнит задачу и отправит результат в целевую беседу.", + "proactive": { + "link": "Поддерживаемые платформы", + "supported": "Отправка результатов поддерживается только на указанных ниже настроенных платформах", + "unsupported": "Нет платформ, поддерживающих проактивные сообщения. Включите их в настройках платформ." } + }, + "actions": { + "create": "Новая задача", + "edit": "Изменить", + "refresh": "Обновить", + "delete": "Удалить", + "cancel": "Отмена", + "close": "Закрыть", + "more": "Другие действия", + "runNow": "Запустить сейчас", + "save": "Сохранить", + "submit": "Создать" + }, + "platformDialog": { + "title": "Поддерживаемые платформы", + "description": "Только следующие платформы поддерживают проактивную отправку сообщений. AstrBot сможет отправить результат будущей задачи только в целевые беседы на этих платформах." + }, + "card": { + "onceAt": "Один раз · {time}", + "runAt": "Время запуска: {time}", + "nextRun": "Следующий запуск: {time}", + "dailyAt": "Каждый день в {time}", + "weeklyAt": "Каждый {day} в {time}", + "monthlyAt": "Каждый месяц, день {day}, {time}", + "everyMinutes": "Каждые {count} мин.", + "everyHours": "Каждые {count} ч.", + "everyDays": "Каждые {count} дн.", + "customCron": "Вручную · {cron}", + "noDeliveryTarget": "Цель доставки не задана" + }, + "filters": { + "search": "Поиск по названию и содержанию", + "umo": "Фильтр по цели доставки", + "noUmos": "Нет UMO", + "noDeliveryTarget": "Цель доставки не задана", + "noMatches": "Нет подходящих будущих задач." + }, + "overview": { + "totalTasks": "Всего задач", + "totalTasksNote": "Все зарегистрированные будущие задачи", + "enabledTasks": "Активные задачи", + "enabledTasksNote": "Задачи, которые будут автоматически выполнены", + "oneOffTasks": "Разовые задачи", + "recurringTasksNote": "Повторяющихся задач: {count}", + "proactivePlatforms": "Проактивные платформы", + "proactivePlatformsNote": "Платформы, способные отправлять результат сами" + }, + "section": { + "registered": { + "title": "Список задач", + "subtitle": "Просматривайте зарегистрированные задачи, время запуска и состояние" + }, + "delivery": { + "title": "Статус доставки", + "subtitle": "После выполнения задачи результат будет отправлен обратно через поддерживаемые платформы", + "support": "Проактивная доставка", + "available": "Доступна", + "unavailable": "Недоступна", + "enabledPlatforms": "Включенные платформы" + }, + "quickCreate": { + "title": "Быстрое создание", + "runMode": "Режим задачи", + "target": "Целевой контекст" + }, + "platforms": { + "title": "Поддерживаемые платформы" + } + }, + "table": { + "title": "Список задач", + "subtitle": "Отслеживайте cron, целевую сессию, историю запусков и состояние", + "empty": "Задач пока нет.", + "headers": { + "name": "Имя", + "type": "Тип", + "cron": "Cron", + "session": "ID сессии", + "nextRun": "Следующий запуск", + "lastRun": "Последний запуск", + "note": "Описание", + "actions": "Действия" + }, + "type": { + "once": "Разовая", + "recurring": "Повторяющаяся", + "activeAgent": "Активный агент", + "workflow": "Рабочий процесс", + "unknown": "{type}" + }, + "timezoneLocal": "Местное время", + "notAvailable": "—" + }, + "form": { + "title": "Создать задачу", + "editTitle": "Редактировать задачу", + "chatHint": "Вы можете ставить задачи прямо в чате, AstrBot создаст их автоматически без заполнения этой формы.", + "runOnce": "Разовая задача", + "name": "Имя задачи *", + "note": "Требования задачи *", + "scheduleMode": "Время выполнения *", + "scheduleModes": { + "once": "Один раз", + "interval": "Интервал", + "daily": "Каждый день", + "weekly": "Каждую неделю", + "monthly": "Каждый месяц", + "cron": "Cron вручную" + }, + "intervalEvery": "Каждые *", + "intervalUnit": "Единица *", + "intervalUnits": { + "minutes": "Минуты", + "hours": "Часы", + "days": "Дни" + }, + "dailyTime": "Время *", + "weeklyDay": "День недели *", + "weeklyTime": "Время *", + "monthlyDay": "День *", + "monthlyTime": "Время *", + "weekdays": { + "sunday": "Воскресенье", + "monday": "Понедельник", + "tuesday": "Вторник", + "wednesday": "Среда", + "thursday": "Четверг", + "friday": "Пятница", + "saturday": "Суббота" + }, + "cron": "Cron-выражения *", + "cronPlaceholder": "0 9 * * *", + "runAt": "Время запуска *", + "session": "Доставить в", + "noUmos": "Нет доступных сессий", + "timezone": "Часовой пояс (опционально, напр. Europe/Moscow)", + "enabled": "Включено" + }, + "messages": { + "loadFailed": "Ошибка загрузки задач", + "updateSuccess": "Задача обновлена", + "updateFailed": "Ошибка обновления", + "deleteSuccess": "Удалено", + "deleteFailed": "Ошибка удаления", + "nameRequired": "Укажите имя задачи", + "sessionRequired": "Укажите цель доставки", + "noteRequired": "Заполните требования задачи", + "cronRequired": "Укажите Cron-выражение", + "runAtRequired": "Выберите время запуска", + "intervalRequired": "Укажите корректный интервал", + "dailyTimeRequired": "Выберите ежедневное время запуска", + "weeklyTimeRequired": "Выберите день недели и время запуска", + "monthlyTimeRequired": "Выберите день месяца и время запуска", + "createSuccess": "Задача создана", + "createFailed": "Ошибка создания", + "runStarted": "Запущено", + "runFailed": "Ошибка запуска" + } } diff --git a/dashboard/src/i18n/locales/zh-CN/features/cron.json b/dashboard/src/i18n/locales/zh-CN/features/cron.json index 2345efe98..750af66bb 100644 --- a/dashboard/src/i18n/locales/zh-CN/features/cron.json +++ b/dashboard/src/i18n/locales/zh-CN/features/cron.json @@ -4,10 +4,11 @@ "live": "实时同步" }, "page": { - "title": "未来任务管理", + "title": "未来任务", "beta": "实验性", - "subtitle": "AstrBot 可以被自动唤醒然后执行任务,并将结果告知任务布置方。需要先在配置文件中启用“主动型能力”。", + "subtitle": "AstrBot 会在设定时间自动唤醒,完成任务后把结果投递回目标会话。", "proactive": { + "link": "支持的消息平台", "supported": "主动发送结果仅支持以下您已配置的平台", "unsupported": "暂无支持主动消息的平台,请在平台设置中开启。" } @@ -18,9 +19,36 @@ "refresh": "刷新", "delete": "删除", "cancel": "取消", + "close": "关闭", + "more": "更多操作", + "runNow": "立即执行", "save": "保存", "submit": "创建" }, + "platformDialog": { + "title": "支持的消息平台", + "description": "只有以下平台支持主动推送消息。未来任务完成后,AstrBot 才能把结果投递回这些平台的目标会话。" + }, + "card": { + "onceAt": "一次性 · {time}", + "runAt": "执行时间:{time}", + "nextRun": "下次执行:{time}", + "dailyAt": "每天 {time}", + "weeklyAt": "每周{day} {time}", + "monthlyAt": "每月 {day} 日 {time}", + "everyMinutes": "每隔 {count} 分钟", + "everyHours": "每隔 {count} 小时", + "everyDays": "每隔 {count} 天", + "customCron": "自定义 · {cron}", + "noDeliveryTarget": "未设置投递地" + }, + "filters": { + "search": "搜索任务名称和内容", + "umo": "按投递地筛选", + "noUmos": "暂无 UMO", + "noDeliveryTarget": "未设置投递地", + "noMatches": "没有匹配的未来任务。" + }, "overview": { "totalTasks": "任务总数", "totalTasksNote": "当前已注册的未来任务", @@ -82,12 +110,43 @@ "editTitle": "编辑任务", "chatHint": "你可以直接通过聊天的方式来让 AstrBot 创建未来任务,而不必在此添加。", "runOnce": "一次性任务", - "name": "任务名称", - "note": "任务说明", - "cron": "Cron 表达式", + "name": "任务名称 *", + "note": "任务需求 *", + "scheduleMode": "执行时间 *", + "scheduleModes": { + "once": "一次性", + "interval": "间隔", + "daily": "每天", + "weekly": "每周", + "monthly": "每个月", + "cron": "自定义" + }, + "intervalEvery": "每隔 *", + "intervalUnit": "单位 *", + "intervalUnits": { + "minutes": "分钟", + "hours": "小时", + "days": "天" + }, + "dailyTime": "时间 *", + "weeklyDay": "星期 *", + "weeklyTime": "时间 *", + "monthlyDay": "日期 *", + "monthlyTime": "时间 *", + "weekdays": { + "sunday": "周日", + "monday": "周一", + "tuesday": "周二", + "wednesday": "周三", + "thursday": "周四", + "friday": "周五", + "saturday": "周六" + }, + "cron": "Cron 表达式 *", "cronPlaceholder": "0 9 * * *", - "runAt": "执行时间", - "session": "目标 session (platform_id:message_type:session_id)", + "runAt": "执行时间 *", + "session": "投递到(可选)", + "noUmos": "暂无可用会话", "timezone": "时区(可选,如 Asia/Shanghai)", "enabled": "启用" }, @@ -97,11 +156,18 @@ "updateFailed": "更新失败", "deleteSuccess": "已删除", "deleteFailed": "删除失败", - "sessionRequired": "请填写 session", - "noteRequired": "请填写说明", + "nameRequired": "请填写任务名称", + "sessionRequired": "请选择投递目标", + "noteRequired": "请填写任务需求", "cronRequired": "请填写 Cron 表达式", "runAtRequired": "请选择执行时间", + "intervalRequired": "请填写有效的间隔时间", + "dailyTimeRequired": "请选择每天执行的时间", + "weeklyTimeRequired": "请选择每周执行的星期和时间", + "monthlyTimeRequired": "请选择每月执行的日期和时间", "createSuccess": "创建成功", - "createFailed": "创建失败" + "createFailed": "创建失败", + "runStarted": "已开始执行", + "runFailed": "执行失败" } } diff --git a/dashboard/src/theme/LightTheme.ts b/dashboard/src/theme/LightTheme.ts index b88f05c28..a91e212ae 100644 --- a/dashboard/src/theme/LightTheme.ts +++ b/dashboard/src/theme/LightTheme.ts @@ -27,7 +27,7 @@ const PurpleTheme: ThemeTypes = { borderLight: '#d0d0d0', border: '#d0d0d0', inputBorder: '#787878', - containerBg: '#f9fafcf4', + containerBg: '#fffffff4', surface: '#fff', 'on-surface-variant': '#fff', facebook: '#4267b2', diff --git a/dashboard/src/views/CronJobPage.vue b/dashboard/src/views/CronJobPage.vue index b59d3b0be..c1d6e2737 100644 --- a/dashboard/src/views/CronJobPage.vue +++ b/dashboard/src/views/CronJobPage.vue @@ -1,348 +1,744 @@ + + + + + + {{ tm("platformDialog.title") }} + + +

+ {{ tm("platformDialog.description") }} +

+
+
+
+ {{ platform.display_name || platform.name }} +
+
{{ platform.id }}
+
+
+
+ {{ tm("page.proactive.unsupported") }} +
+
+ + + {{ tm("actions.close") }} + + +
+
+ + + {{ snackbar.message }} + + + + + {{ + dialogTitle + }} + +
+ + + +
+ + + + +
+ + +
+ + + +
+ + +
+ +
+ + +
+ + +
+ + +
+
+ + {{ + tm("actions.cancel") + }} + + {{ dialogSubmitText }} + + +
+
+