from __future__ import annotations from typing import Any, Protocol class AlertRepository(Protocol): def save_alert( self, user_id: int, kind: str, title: str, content: str, available_date: str, code: str, dedupe_key: str, ) -> int: ... def list_alerts( self, user_id: int, as_of: str, unread_only: bool = False, limit: int = 100, ) -> list[dict[str, Any]]: ... def count_unread_alerts(self, user_id: int, as_of: str) -> int: ... def mark_alert_read(self, user_id: int, alert_id: int) -> bool: ... def mark_all_alerts_read(self, user_id: int, as_of: str) -> int: ... def delete_alert(self, user_id: int, alert_id: int) -> bool: ... class TradeJournalRepository(Protocol): def save_trade_entry(self, *args: Any, **kwargs: Any) -> int: ... def list_trade_entries( self, user_id: int, start_date: str = "", end_date: str = "", code: str = "", limit: int = 300, ) -> list[dict[str, Any]]: ... def delete_trade_entry(self, user_id: int, trade_id: int) -> bool: ... class StrategyTrackingRepository(Protocol): def save_strategy_tracks( self, user_id: int, run_id: int, selection_date: str, strategy_name: str, candidates: list[dict[str, Any]], ) -> int: ... def get_screener_run(self, user_id: int, run_id: int) -> dict[str, Any] | None: ... def delete_strategy_track(self, user_id: int, track_id: int) -> bool: ... def list_strategy_tracks( self, user_id: int, limit_batches: int = 12, ) -> list[dict[str, Any]]: ... def load_tracking_bars( self, targets: list[tuple[str, str]], limit: int = 5, ) -> dict[tuple[str, str], list[dict[str, Any]]]: ...