"""Live-sync entrypoint (refactor ยง2, step 3). The sync worker's ``on_startup`` starts a :class:`SyncCoordinator`, which claims accounts from the ``sync:live`` registry via Redis leases and runs one :class:`~app.sync.runner.AccountRunner` per owned account. ``on_shutdown`` stops it, releasing every lease so peers can take the accounts over immediately. """ from __future__ import annotations import logging from typing import Any from app.sync.coordinator import SyncCoordinator logger = logging.getLogger(__name__) async def start_supervisor(ctx: dict[str, Any]) -> None: coordinator = SyncCoordinator() await coordinator.start() ctx["coordinator"] = coordinator async def stop_supervisor(ctx: dict[str, Any]) -> None: coordinator: SyncCoordinator | None = ctx.get("coordinator") if coordinator is not None: await coordinator.stop() ctx["coordinator"] = None