diff --git a/cron/scheduler.py b/cron/scheduler.py index 359069966195..84d2fadd2605 100644 --- a/cron/scheduler.py +++ b/cron/scheduler.py @@ -434,8 +434,15 @@ def _resolve_single_delivery_target(job: dict, deliver_value: str) -> Optional[d if deliver_value == "origin": if origin: + platform = origin["platform"] + # WebUI surfaces cron runs by reading the local session DB — + # no external gateway delivery is needed. Returning None + # treats it like "local", avoiding "unknown platform 'webui'" + # errors (#45360). + if platform.lower() == "webui": + return None return { - "platform": origin["platform"], + "platform": platform, "chat_id": str(origin["chat_id"]), "thread_id": origin.get("thread_id"), } diff --git a/tests/cron/test_scheduler.py b/tests/cron/test_scheduler.py index fd445de8ca6a..c5915166acca 100644 --- a/tests/cron/test_scheduler.py +++ b/tests/cron/test_scheduler.py @@ -87,6 +87,28 @@ def test_origin_delivery_preserves_thread_id(self): "thread_id": "17585", } + def test_webui_origin_platform_returns_none(self): + """WebUI reads from local session DB — no gateway delivery needed (#45360).""" + job = { + "deliver": "origin", + "origin": { + "platform": "webui", + "chat_id": "session-abc", + }, + } + assert _resolve_delivery_target(job) is None + + def test_webui_origin_platform_case_insensitive(self): + """Platform name comparison should be case-insensitive.""" + job = { + "deliver": "origin", + "origin": { + "platform": "WebUI", + "chat_id": "session-abc", + }, + } + assert _resolve_delivery_target(job) is None + @pytest.mark.parametrize( ("platform", "env_var", "chat_id"), [