ó
    ŸUAj*	  ã                  ó’   • % S r SSKJr  SSKrSSKJr  SSKJr  SSKJ	r	  \	" S5      r
SSS	S	S
.rS\S'   SS jrSS jrSS jrSS jrg)uE  Runtime state persistence, kept separate from static config.

Static configuration lives in ``/etc/wolfpanel/agent.conf`` which is ALSO
consumed by systemd as an ``EnvironmentFile``, so it must stay clean, stable
KEY=VALUE data. Mutable runtime values â€” status, last error, the
registration-pending and revoked flags â€” live here in
``/var/lib/wolfpanel/state.json`` instead, so they never pollute the
EnvironmentFile and never break systemd parsing.

All persisted string values are sanitized to a single line so a multi-line
error message can never corrupt the on-disk state.
é    )ÚannotationsN)ÚPath)ÚAny)Ú
get_loggerÚstateÚ F)ÚstatusÚ
last_errorÚregistration_pendingÚrevokedúdict[str, Any]Ú_DEFAULT_STATEc                ó®   • [        U [        5      (       a?  SR                  U R                  SS5      R                  SS5      R	                  5       5      $ U $ )z6Collapse runtime strings to a safe, single-line value.Ú ÚÚ
)Ú
isinstanceÚstrÚjoinÚreplaceÚsplit)Úvalues    Ú/D:\Programs\laragon\www\wolf\agent\src\state.pyÚ	_sanitizer       sD   € ä�%œ×ÑØ�x‰x˜Ÿ™ d¨CÓ0×8Ñ8¸¸sÓC×IÑIÓKÓLÐLØ€Ló    c                óæ   • [        [        5      n [        R                  " U R	                  SS95      n[        U[         5      (       a  UR                  U5        U$ ! [        [        4 a     U$ f = f)z:Load runtime state, falling back to defaults on any error.úutf-8©Úencoding)	Údictr   ÚjsonÚloadsÚ	read_textr   ÚupdateÚOSErrorÚ
ValueError)Úpathr   Údatas      r   Ú
load_stater)   '   sh   € ä”Ó €EðÜ�zŠz˜$Ÿ.™.°'˜.Ð:Ó;ˆÜ�dœD×!Ñ!Ø�L‰L˜Ôð €Løô ”ZÐ ó ØØ€Lðús   ‘A	A ÁA0Á/A0c                óž  • UR                  5        VVs0 sH  u  p#U[        U5      _M     nnn U R                  R                  SSS9  U R	                  U R
                  S-   5      nUR                  [        R                  " USS9SS9  UR                  U 5        g	s  snnf ! [         a   n[        R                  SX5         S	nAg	S	nAff = f)
z/Persist runtime state atomically. Never raises.T)ÚparentsÚexist_okz.tmpé   )Úindentr   r   z!failed to persist state to %s: %sN)Úitemsr   ÚparentÚmkdirÚ	with_nameÚnameÚ
write_textr!   Údumpsr   r%   ÚlogÚwarning)r'   r   Úkeyr   ÚcleanÚtmpÚexcs          r   Ú
save_stater<   3   s¯   € à5:·[±[´]ÔC±]¡z sˆS”)˜EÓ"Ò"±]€EÑCðDØ�‰×Ñ $°ÐÑ6Ø�n‰n˜TŸY™Y¨Ñ/Ó0ˆØ�‰”t—z’z %°Ñ2¸WˆÑEØ�‰�DÕùó Døô ó DÜ�‰Ð7¸×CÑCûðDús   ”B¯A,B" Â"
CÂ,CÃCc                ó~   • [        U 5      nUR                  5        H  u  p4[        U5      X#'   M     [        X5        U$ )z=Merge ``changes`` into the persisted state and write it back.)r)   r/   r   r<   )r'   Úchangesr   r8   r   s        r   Úupdate_stater?   ?   s7   € ä�tÓ€EØ—m‘m–o‰
ˆÜ˜uÓ%ˆ‹
ñ &äˆtÔØ€Lr   )r   r   Úreturnr   )r'   r   r@   r   )r'   r   r   r   r@   ÚNone)r'   r   r>   r   r@   r   )Ú__doc__Ú
__future__r   r!   Úpathlibr   Útypingr   Úloggerr   r6   r   Ú__annotations__r   r)   r<   r?   © r   r   Ú<module>rI      sV   ðòõ #ã Ý Ý å á�Ó€ð ØØ!Øñ	"€�ó ôô	ô	Dõr   