from __future__ import annotations import json import os from dataclasses import asdict, dataclass from pathlib import Path @dataclass class AgentPersistentState: inventory_sequence: int = 0 telemetry_sequence: int = 0 class AgentStateStore: def __init__(self, state_file: Path, credential_file: Path) -> None: self.state_file = state_file self.credential_file = credential_file def load(self) -> AgentPersistentState: try: payload = json.loads(self.state_file.read_text(encoding="utf-8")) return AgentPersistentState( inventory_sequence=int(payload.get("inventory_sequence", 0)), telemetry_sequence=int(payload.get("telemetry_sequence", 0)), ) except (OSError, ValueError, TypeError, json.JSONDecodeError): return AgentPersistentState() def save(self, state: AgentPersistentState) -> None: self.state_file.parent.mkdir(parents=True, exist_ok=True) temporary = self.state_file.with_suffix(".tmp") temporary.write_text(json.dumps(asdict(state), sort_keys=True), encoding="utf-8") os.replace(temporary, self.state_file) def credential(self) -> str | None: try: value = self.credential_file.read_text(encoding="utf-8").strip() return value or None except OSError: return None def save_credential(self, credential: str) -> None: self.credential_file.parent.mkdir(parents=True, exist_ok=True) self.credential_file.write_text(credential, encoding="utf-8") os.chmod(self.credential_file, 0o600)