feat: add Scheduler provider + multi-provider UX fixes

Scheduler provider:
- Virtual provider (no external service) that emits SCHEDULED_MESSAGE
  events on user-defined intervals or cron expressions
- Custom variables stored in tracker filters, flattened into template context
- fire_count persists across triggers via tracker state
- APScheduler CronTrigger support for cron-mode schedules
- Default templates (EN+RU), seeded on startup

Multi-provider UX fixes:
- Tracking config hides Immich-specific sections (periodic, scheduled,
  memory, asset display) for non-Immich providers
- Command config driven by provider capabilities — hides commands/settings
  for providers without bot commands
- Template config hides empty "Scheduled Messages" group
- Test menu on tracker targets is provider-aware (Immich shows all 4 test
  types, others show only basic)
- Removed redundant Test button from tracker card
- System-owned tracking configs (user_id=0) seeded for Gitea + Scheduler
- Fixed ownership checks to allow system configs in tracker-target links
- Capabilities cache shared across template-configs and command-configs
- Command tracker bot selector uses EntitySelect instead of raw select
- Sample context includes Gitea + Scheduler variables for template preview
This commit is contained in:
2026-03-22 15:50:51 +03:00
parent 6d28cfb8d8
commit 0562f78b35
30 changed files with 688 additions and 56 deletions
+11
View File
@@ -107,6 +107,7 @@
"checking": "Checking...",
"typeImmich": "Immich",
"typeGitea": "Gitea",
"typeScheduler": "Scheduler",
"loadError": "Failed to load providers.",
"externalDomain": "External Domain",
"optional": "optional",
@@ -134,6 +135,14 @@
"eventTypes": "Event Types",
"notificationTargets": "Notification Targets",
"scanInterval": "Scan Interval (seconds)",
"scheduleType": "Schedule",
"intervalMode": "Interval",
"cronMode": "Cron expression",
"cronExpression": "Cron expression",
"cronHint": "Standard 5-field cron: minute hour day month weekday. Example: 0 9 * * 1-5 (weekdays at 9:00)",
"customVariables": "Custom Variables",
"customVariablesHint": "Define key-value pairs available in templates as {{ key }}.",
"addVariable": "Add variable",
"createTracker": "Create Tracker",
"noTrackers": "No trackers yet. Add a provider first, then create a tracker.",
"active": "Active",
@@ -310,6 +319,7 @@
"rateSearch": "Search cooldown",
"rateFind": "Find cooldown",
"rateDefault": "Default cooldown",
"noCommandsForProvider": "This provider type does not support bot commands.",
"syncCommands": "Sync with Telegram",
"discoverChats": "Discover chats from Telegram",
"clickToCopy": "Click to copy chat ID",
@@ -365,6 +375,7 @@
"prMerged": "PR merged",
"prCommented": "PR commented",
"releasePublished": "Release published",
"scheduledMessage": "Scheduled message",
"trackImages": "Track images",
"trackVideos": "Track videos",
"favoritesOnly": "Favorites only",