diff --git a/cron/jobs.py b/cron/jobs.py index 4258c479f6..6376260828 100644 --- a/cron/jobs.py +++ b/cron/jobs.py @@ -313,9 +313,10 @@ def compute_next_run(schedule: Dict[str, Any], last_run_at: Optional[str] = None elif schedule["kind"] == "cron": if not HAS_CRONITER: logger.warning( - "Cannot compute next run for cron schedule %r: 'croniter' " - "is not installed. Install the 'cron' extra (pip install " - "'hermes-agent[cron]') to re-enable recurring cron jobs.", + "Cannot compute next run for cron schedule %r: 'croniter' is " + "not installed. croniter is a core dependency as of v0.9.x; " + "reinstall hermes-agent or run 'pip install croniter' in your " + "runtime env.", schedule.get("expr"), ) return None diff --git a/pyproject.toml b/pyproject.toml index 9dd757c005..f1132e8d70 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,6 +30,8 @@ dependencies = [ "firecrawl-py>=4.16.0,<5", "parallel-web>=0.4.2,<1", "fal-client>=0.13.1,<1", + # Cron scheduler (built-in feature — scheduled cron/interval jobs use croniter). + "croniter>=6.0.0,<7", # Text-to-speech (Edge TTS is free, no API key needed) "edge-tts>=7.2.7,<8", # Skills Hub (GitHub App JWT auth — optional, only needed for bot identity) @@ -42,7 +44,7 @@ daytona = ["daytona>=0.148.0,<1"] vercel = ["vercel>=0.5.7,<0.6.0"] dev = ["debugpy>=1.8.0,<2", "pytest>=9.0.2,<10", "pytest-asyncio>=1.3.0,<2", "pytest-xdist>=3.0,<4", "mcp>=1.2.0,<2", "ty>=0.0.1a29,<0.0.22", "ruff"] messaging = ["python-telegram-bot[webhooks]>=22.6,<23", "discord.py[voice]>=2.7.1,<3", "aiohttp>=3.13.3,<4", "slack-bolt>=1.18.0,<2", "slack-sdk>=3.27.0,<4", "qrcode>=7.0,<8"] -cron = ["croniter>=6.0.0,<7"] +cron = [] # croniter is now a core dependency; this extra kept for back-compat slack = ["slack-bolt>=1.18.0,<2", "slack-sdk>=3.27.0,<4"] matrix = ["mautrix[encryption]>=0.20,<1", "Markdown>=3.6,<4", "aiosqlite>=0.20", "asyncpg>=0.29", "aiohttp-socks>=0.10,<1"] cli = ["simple-term-menu>=1.0,<2"]