"""Typed gateway monitoring events. Content-free service-health and redacted diagnostic events for the gateway daemon. These are the only event shapes the monitoring plane emits: no prompts, messages, tool args/results, session history, or usage analytics. """ from __future__ import annotations import time from dataclasses import dataclass, field, asdict from typing import Any, Dict, Optional def _now_ns() -> int: return time.time_ns() @dataclass(slots=True) class GatewayHealthEvent: """Content-free gateway health snapshot or lifecycle event.""" name: str gateway_state: Optional[str] = None old_state: Optional[str] = None new_state: Optional[str] = None exit_reason: Optional[str] = None restart_requested: Optional[bool] = None active_agents: int = 0 gateway_busy: bool = False gateway_drainable: bool = False platform_count: int = 0 fatal_platform_count: int = 0 profile: Optional[str] = None install_id: Optional[str] = None version: Optional[str] = None supervision_mode: Optional[str] = None pid: Optional[int] = None ts_ns: int = field(default_factory=_now_ns) def to_dict(self) -> Dict[str, Any]: return {"event": "gateway_health", **asdict(self)} @dataclass(slots=True) class GatewayDiagnosticEvent: """Redacted gateway diagnostic event for operator-owned observability.""" name: str subsystem: str error_class: str = "unknown" error_code: Optional[str] = None platform: Optional[str] = None old_state: Optional[str] = None new_state: Optional[str] = None profile: Optional[str] = None version: Optional[str] = None severity: str = "warning" ts_ns: int = field(default_factory=_now_ns) source_logger: Optional[str] = None def to_dict(self) -> Dict[str, Any]: return {"event": "gateway_diagnostic", **asdict(self)} @dataclass(slots=True) class CronExecutionEvent: """Content-free durable cron execution lifecycle projection.""" status: str job_key: str source: str = "unknown" duration_ms: Optional[int] = None delivery_outcome: Optional[str] = None error_class: Optional[str] = None ts_ns: int = field(default_factory=_now_ns) def to_dict(self) -> Dict[str, Any]: return {"event": "cron_execution", **asdict(self)} __all__ = [ "GatewayHealthEvent", "GatewayDiagnosticEvent", "CronExecutionEvent", ]