Ë
    .Þj¿  ã                  ó¸   — d Z ddlmZ ddlZddlZddlZddlZddlmZ ddlm	Z	 ddl
mZmZ ddlmZ  eh d	£«      Z G d
„ de«      Zddd„Z G d„ d«      Zdd„Zy)u†  Strukturiertes Entscheidungsprotokoll (JSON Lines).

Jede Zeile ist ein vollstÃ¤ndiger Datensatz einer Entscheidung oder eines
Ergebnisses. Prompt-, Antwort- oder Memory-Klartext wird nie geschrieben,
nur Digest und LÃ¤nge. Der WÃ¤chter verweigert DatensÃ¤tze mit Klartext-
SchlÃ¼sseln (text, prompt, content, ...), damit ein spÃ¤terer Fehler im
Aufrufer nicht still Inhalte protokolliert.
é    )ÚannotationsN)Údatetime)ÚPath)ÚAnyÚCallableé   )Úensure_private_dir>   ÚmacÚdataÚtextÚstdinÚoutputÚpromptÚcontentÚ	clearanceÚ
reply_textÚmemory_textÚmessage_textc                  ó   — e Zd Zy)ÚDecisionLogErrorN)Ú__name__Ú
__module__Ú__qualname__© ó    ú9/home/aria/aria-v3-dev/python/aria_router/decision_log.pyr   r      s   „ Ør   r   c                ó8  — t        | t        «      r`| j                  «       D ]L  \  }}t        |t        «      st	        d|› �«      ‚|t
        v rt	        d|› |› �«      ‚t        ||› |› d�«       ŒN y t        | t        t        f«      r| D ]  }t        ||«       Œ y y )NzNON_STRING_KEY:zFORBIDDEN_LOG_FIELD:ú.)	Ú
isinstanceÚdictÚitemsÚstrr   ÚFORBIDDEN_KEYSÚ_checkÚlistÚtuple)ÚvalueÚpathÚkeyÚitems       r   r$   r$      s¢   € Ü�%œÔØŸ™›ò 	*‰IˆC�Ü˜c¤3Ô'Ü&¨¸¸Ð'?Ó@Ð@Ø”nÑ$Ü&Ð)=¸d¸VÀCÀ5Ð'IÓJÐJÜ�4˜D˜6 #  a˜Õ)ñ	*ô 
�EœD¤%˜=Ô	)Øò 	ˆDÜ�4˜Õñ	ð 
*r   c                  óX   — e Zd ZdZd
ej                  ddœ	 dd„Zdd„Zdd„Zdd„Zdd„Z	y	)ÚDecisionLoguo  Append-only JSON Lines. Mit ``retention_seconds > 0`` werden DatensÃ¤tze, deren ``ts`` Ã¤lter ist,
    hÃ¶chstens einmal je ``prune_interval_seconds`` entfernt (E17). Das KÃ¼rzen lÃ¤uft unter derselben
    Dateisperre an Ort und Stelle (gleiche Inode), damit kein paralleler Schreiber in eine ersetzte
    Datei schreibt. Zeilen ohne lesbaren ``ts`` bleiben erhalten.i€Q )ÚclockÚprune_interval_secondsc               óà   — t        |«      | _        t        |«      | _        || _        t        |«      | _        | j                  j                  | j                  j                  dz   «      | _        y )Nz.pruned)	r   r(   ÚintÚ
_retentionÚ_clockÚ	_intervalÚ	with_nameÚnameÚ_marker)Úselfr(   Úretention_secondsr-   r.   s        r   Ú__init__zDecisionLog.__init__2   sQ   € ä˜“JˆŒ	ÜÐ/Ó0ˆŒØˆŒÜÐ3Ó4ˆŒØ—y‘y×*Ñ*¨4¯9©9¯>©>¸IÑ+EÓFˆ�r   c                óª  — t        |«       t        j                  |ddd¬«      }t        | j                  j
                  «       t        j                  | j                  t        j                  t        j                  z  t        j                  z  d«      }	 t        j                  |t        j                  «       t        j                  ||dz   j                  d«      «       t        j                   |«       | j"                  dkD  r!| j%                  «       r| j'                  |«       	 t        j                  |t        j(                  «       t        j*                  |«       y # t        j*                  |«       w xY w# 	 t        j                  |t        j(                  «       t        j*                  |«       w # t        j*                  |«       w xY wxY w)	NTF)ú,ú:)Ú	sort_keysÚensure_asciiÚ
separatorsé€  ú
úutf-8r   )r$   ÚjsonÚdumpsr	   r(   ÚparentÚosÚopenÚO_RDWRÚO_CREATÚO_APPENDÚfcntlÚflockÚLOCK_EXÚwriteÚencodeÚfsyncr1   Ú
_prune_dueÚ_pruneÚLOCK_UNÚclose)r7   ÚrecordÚlineÚfds       r   rN   zDecisionLog.write:   s  € ÜˆvŒÜ�z‰z˜&¨D¸uÐQ[Ô\ˆÜ˜4Ÿ9™9×+Ñ+Ô,Ü�W‰W�T—Y‘Y¤§	¡	¬B¯J©JÑ 6¼¿¹Ñ DÀeÓLˆð
	Ü�K‰K˜œEŸM™MÔ*Ü�H‰H�R˜$ ™+×-Ñ-¨gÓ6Ô7Ü�H‰H�RŒLØ�‰ Ò" t§¡Ô'8Ø—‘˜B”ðÜ—‘˜B¤§¡Ô.ä—‘˜•ø”—‘˜•ûðÜ—‘˜B¤§¡Ô.ä—‘˜•ø”—‘˜•ýs1   ÂBE< Ä($E" Å"E9Å<GÅ>$F8Æ"GÆ8GÇGc                ó°   — 	 t        j                  | j                  «      j                  | j                  z   | j                  «       k  S # t        $ r Y yw xY w)NT)rF   Ústatr6   Úst_mtimer3   r2   ÚFileNotFoundError)r7   s    r   rQ   zDecisionLog._prune_dueK   sF   € ð	Ü—7‘7˜4Ÿ<™<Ó(×1Ñ1°D·N±NÑBÀdÇkÁkÃmÑSÐSøÜ ò 	Ùð	ús   ‚AA	 Á		AÁAc                ó  — | j                  «       | j                  z
  }t        j                  |dt        j                  «       g }	 t        j
                  |d«      }|sn|j                  |«       Œ+dj                  |«      j                  d«      j                  d¬«      }|D �cg c]"  }|j                  «       sŒt        ||«      rŒ!|‘Œ$ }}t        |«      t        |D �cg c]  }|j                  «       sŒ|‘Œ c}«      k7  rat        j                  |d«       |r4t        j                  |dj                  |«      j                  d«      «       t        j                   |«       t        j"                  | j$                  t        j&                  t        j(                  z  t        j*                  z  d«      }t        j,                  |«       | j                  «       }	t        j.                  | j$                  |	|	f«       y c c}w c c}w )	Nr   Ti   r   rB   )ÚkeependsÚ r@   )r2   r1   rF   ÚlseekÚSEEK_SETÚreadÚappendÚjoinÚdecodeÚ
splitlinesÚstripÚ_older_thanÚlenÚ	ftruncaterN   rO   rP   rG   r6   ÚO_WRONLYrI   ÚO_TRUNCrT   Úutime)
r7   rW   ÚcutoffÚchunksÚchunkÚlinesÚentryÚkeptÚmfdÚnows
             r   rR   zDecisionLog._pruneQ   si  € Ø—‘“ §¡Ñ0ˆÜ
�‰��QœŸ™Ô$ØˆØÜ—G‘G˜B Ó(ˆEÙØØ�M‰M˜%Ô ð	 ð
 —‘˜Ó ×'Ñ'¨Ó0×;Ñ;ÀTÐ;ÓJˆØ#(Ö]˜%¨E¯K©K­MÄ+ÈeÐU[ÕB\’Ð]ˆÐ]Üˆt‹9œ°ÖG u¸¿¹½šUÒGÓHÒHÜ�L‰L˜˜QÔÙÜ—‘˜˜RŸW™W T›]×1Ñ1°'Ó:Ô;Ü�H‰H�RŒLÜ�g‰g�d—l‘l¤B§K¡K´"·*±*Ñ$<¼r¿z¹zÑ$IÈ5ÓQˆÜ
�‰�ŒØ�k‰k‹mˆÜ
�‰�—‘  S˜zÕ*ùò ^ùÚGs   Â%G>Â;G>ÃG>Ã!H
Ã7H
c                óô   — 	 t        | j                  dd¬«      5 }|D �cg c](  }|j                  «       sŒt        j                  |«      ‘Œ* c}cd d d «       S c c}w # 1 sw Y   y xY w# t
        $ r g cY S w xY w)NÚrrB   )Úencoding)rG   r(   rf   rC   Úloadsr[   )r7   ÚhandlerV   s      r   Úread_allzDecisionLog.read_allf   sm   € ð	Ü�d—i‘i ¨wÔ7ð M¸6Ø5;ÖL¨T¸t¿z¹z½|œŸ
™
 4Õ(ÒL÷Mñ MùÚL÷Mð Mûä ò 	ØŠIð	úsD   ‚A) šAŸAµAÁAÁ	A) ÁAÁA&Á"A) Á&A) Á)A7Á6A7N)r   )r(   r   r8   r0   r-   zCallable[[], float]r.   r0   )rU   r    ÚreturnÚNone)r{   Úbool)rW   r0   r{   r|   )r{   z
list[dict])
r   r   r   Ú__doc__Útimer9   rN   rQ   rR   rz   r   r   r   r,   r,   ,   s=   „ ñEð
GÐ_c×_hÑ_hØ/4ñGØ),óGóó"ó+ô*r   r,   c                óþ   — 	 t        j                  | «      j                  d«      }t        j                  t        |«      j                  dd«      «      j                  «       |k  S # t        t        t        f$ r Y yw xY w)NÚtsÚZz+00:00F)rC   rx   Úgetr   Úfromisoformatr"   ÚreplaceÚ	timestampÚ
ValueErrorÚ	TypeErrorÚAttributeError)rV   rm   r�   s      r   rg   rg   n   sh   € ðÜ�Z‰Z˜Ó×!Ñ! $Ó'ˆÜ×%Ñ%¤c¨"£g§o¡o°c¸8Ó&DÓE×OÑOÓQÐTZÑZÐZøÜœ	¤>Ð2ò Ùðús   ‚A"A% Á%A<Á;A<)r^   )r'   r   r(   r"   r{   r|   )rV   r"   rm   Úfloatr{   r}   )r~   Ú
__future__r   rK   rC   rF   r   r   Úpathlibr   Útypingr   r   Ústater	   Ú	frozensetr#   ÚRuntimeErrorr   r$   r,   rg   r   r   r   ú<module>r‘      sW   ðñõ #ã Û Û 	Û Ý Ý ß  å %áò ó €ô	�|ô 	ô
÷?ñ ?ôDr   