from __future__ import annotations import logging from dataclasses import asdict from core.events import Event, EventBus, EventType from tracking.trackio_client import TrackingClient class AppState: """Shared in-process state for UI events and lightweight traces.""" def __init__( self, event_bus: EventBus | None = None, tracking_client: TrackingClient | None = None, ) -> None: self.event_bus = event_bus or EventBus() self.events: list[Event] = [] self.logger = logging.getLogger("openbmb_workbench") self.tracking_client = tracking_client or TrackingClient() self.tracking_client.init() def emit(self, event: Event) -> None: self.events.append(event) self.logger.info("event=%s payload=%s", event.type.value, event.payload) self.tracking_client.log(event.type.value, event.payload) self.event_bus.emit(event) def recent_events(self, limit: int = 20) -> list[dict]: recent = self.events[-limit:] return [asdict(event) for event in recent] def emit_inference_response( mode: str, model_id: str, backend: str, response: str, state: AppState | None = None, ) -> None: target_state = state or APP_STATE target_state.emit( Event( EventType.INFERENCE_RESPONSE, { "mode": mode, "model_id": model_id, "backend": backend, "response_chars": len(response), }, ) ) APP_STATE = AppState()