diff --git a/nanobot/cron/service.py b/nanobot/cron/service.py index 0282aa1c..1cc858ce 100644 --- a/nanobot/cron/service.py +++ b/nanobot/cron/service.py @@ -109,6 +109,12 @@ class CronService: deliver=j["payload"].get("deliver", False), channel=j["payload"].get("channel"), to=j["payload"].get("to"), + channel_meta=( + j["payload"].get("channelMeta") + or j["payload"].get("channel_meta") + or {} + ), + session_key=j["payload"].get("sessionKey") or j["payload"].get("session_key"), ), state=CronJobState( next_run_at_ms=j.get("state", {}).get("nextRunAtMs"), @@ -210,6 +216,8 @@ class CronService: "deliver": j.payload.deliver, "channel": j.payload.channel, "to": j.payload.to, + "channelMeta": j.payload.channel_meta, + "sessionKey": j.payload.session_key, }, "state": { "nextRunAtMs": j.state.next_run_at_ms, diff --git a/tests/cron/test_cron_service.py b/tests/cron/test_cron_service.py index b41d5b15..1f000dbd 100644 --- a/tests/cron/test_cron_service.py +++ b/tests/cron/test_cron_service.py @@ -65,6 +65,37 @@ def test_add_job_preserves_channel_meta_and_session_key(tmp_path) -> None: assert reloaded.payload.session_key == "slack:C123:1234567890.123456" +@pytest.mark.asyncio +async def test_channel_meta_and_session_key_survive_store_reload(tmp_path) -> None: + store_path = tmp_path / "cron" / "jobs.json" + service = CronService(store_path) + await service.start() + meta = {"slack": {"thread_ts": "1234567890.123456", "channel_type": "channel"}} + try: + job = service.add_job( + name="thread test", + schedule=CronSchedule(kind="every", every_ms=60_000), + message="hello", + deliver=True, + channel="slack", + to="C123", + channel_meta=meta, + session_key="slack:C123:1234567890.123456", + ) + finally: + service.stop() + + raw = json.loads(store_path.read_text(encoding="utf-8")) + payload = raw["jobs"][0]["payload"] + assert payload["channelMeta"] == meta + assert payload["sessionKey"] == "slack:C123:1234567890.123456" + + reloaded = CronService(store_path).get_job(job.id) + assert reloaded is not None + assert reloaded.payload.channel_meta == meta + assert reloaded.payload.session_key == "slack:C123:1234567890.123456" + + @pytest.mark.asyncio async def test_execute_job_records_run_history(tmp_path) -> None: store_path = tmp_path / "cron" / "jobs.json"