from typing import List, Optional from pydantic import BaseModel, Field from datetime import datetime class LocalBook(BaseModel): """A minimal per-venue order book snapshot. This is intentionally tiny for Phase 0: top-of-book bids/asks with sizes and timestamp. """ venue_id: str asset: str best_bid: Optional[float] best_bid_size: Optional[float] best_ask: Optional[float] best_ask_size: Optional[float] timestamp: datetime = Field(default_factory=datetime.utcnow) class OrderEvent(BaseModel): """A canonical order lifecycle event used between adapters and simulator.""" order_id: str venue_id: str asset: str side: str # 'buy' or 'sell' price: Optional[float] size: float created_at: datetime = Field(default_factory=datetime.utcnow) status: str = "submitted" # submitted, accepted, filled, cancelled class QuoteSnapshot(BaseModel): venue_id: str asset: str bids: List[List[float]] = Field(default_factory=list) # [[price, size], ...] asks: List[List[float]] = Field(default_factory=list) timestamp: datetime = Field(default_factory=datetime.utcnow) class SharedSignals(BaseModel): """Lightweight aggregated signals used for cross-venue coordination.""" asset: str mid_price: Optional[float] liquidity: Optional[float] timestamp: datetime = Field(default_factory=datetime.utcnow) class PlanDelta(BaseModel): """An incremental plan update: proposed hedge or quote update.""" plan_id: str author: str asset: str venue_id: str side: str price: Optional[float] size: float created_at: datetime = Field(default_factory=datetime.utcnow) class NetworkLink(BaseModel): """Deterministic connectivity and delay profile for one venue.""" venue_id: str connected: bool = True latency_ms: int = 0 jitter_ms: int = 0 packet_loss: float = 0.0 updated_at: datetime = Field(default_factory=datetime.utcnow)