§
    5…¬j­  ã                  óÀ   — d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	m
Z
mZmZmZ ddlZ	 ddlZn# e$ r dZY nw xY wdgZe G d„ d¦  «        ¦   «         Z	 	 	 ddd„ZdS )u]  AutoPOE2 - Reconnect Invariant Gate & Validator.
===================================================
Domain: QA & Governance Sentinel (SÆ° Ä‘oÃ n 4)
TuÃ¢n thá»§ nghiÃªm ngáº·t:
- Rule 4C & Rule 5: Cáº¥m mock áº£o, 100% dá»¯ liá»‡u thá»±c nghiá»‡m.
- INV-RECONNECT-PROCESS-ALIVE: Client PID pháº£i tá»“n táº¡i vÃ  Ä‘ang cháº¡y trÃªn Windows.
- INV-RECONNECT-HWND-VALID: HWND pháº£i há»£p lá»‡ (win32gui.IsWindow).
- INV-RECONNECT-NO-HARDCODED-VITALS: Cáº¥m gÃ¡n cá»©ng chá»‰ sá»‘ sinh tá»“n (es=4284, hp=1, mana=897)
  khi bá»™ nhá»› chÆ°a gáº¯n káº¿t (memory_attached=False) hoáº·c player.address == 0x0.
é    )ÚannotationsN)Ú	dataclassÚfield)ÚAnyÚDictÚListÚOptionalÚTuple)i¼  é   i�  c                  óˆ   — e Zd ZU ded<    ee¬¦  «        Zded<    ee¬¦  «        Zded<    ee¬¦  «        Z	ded<   dd
„Z
dS )ÚReconnectValidationResultÚboolÚis_valid)Údefault_factoryz	List[str]ÚerrorsÚwarningsúDict[str, Any]ÚmetadataÚreturnc                ó8   — | j         | j        | j        | j        dœS )N©r   r   r   r   r   )Úselfs    ú>C:\Projects\AutoPOE2\src\assistant_tool\reconnect_validator.pyÚto_dictz!ReconnectValidationResult.to_dict'   s%   € àœØ”kØœØœð	
ð 
ð 	
ó    N)r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r   Úlistr   r   Údictr   r   © r   r   r   r       s�   € € € € € € à€N€N�NØ˜¨dÐ3Ñ3Ô3€FÐ3Ð3Ð3Ñ3Ø˜%°Ð5Ñ5Ô5€HÐ5Ð5Ð5Ñ5Ø$˜u°TÐ:Ñ:Ô:€HÐ:Ð:Ð:Ñ:ð
ð 
ð 
ð 
ð 
ð 
r   r   TÚresult_datar   Úram_snapshotúOptional[Dict[str, Any]]Úcheck_live_processr   Úcheck_live_hwndr   c                ó¨
  — g }g }i }g d¢}|D ]}|| vr|                      d|› d�¦  «         Œ |rt          d||¬¦  «        S t          |                      dd¦  «        ¦  «                             ¦   «         }	|                      d¦  «        }
|                      d	¦  «        }d
}	 t          |
¦  «        }||d<   |dk    r|                      d|› d�¦  «         n0# t          t          f$ r |                      d|
› d�¦  «         Y nw xY w|rà|rÞt          j	        |¦  «        s|                      d|› d|	› d�¦  «         n­	 t          j
        |¦  «        }|                     ¦   «         }||d<   |                     ¦   «         t          j        k    r|                      d|› d�¦  «         nC# t          j        t          j        f$ r%}|                      d|› d|› �¦  «         Y d
}~nd
}~ww xY wd
}t!          |t
          ¦  «        r|}nžt!          |t          ¦  «        r_	 |                     d¦  «        rt          |d¦  «        nt          |¦  «        }nS# t          $ r |                      d|› d�¦  «         Y n.w xY w|                      dt%          |¦  «        j        › �¦  «         ||d<   |rI|rGt(          �@|dk    st)          j        |¦  «        s&|                      dt-          |¦  «        › d�¦  «         |                      dd¦  «        }|                      dd¦  «        }|                      d d¦  «        }	 t          |¦  «        t          |¦  «        t          |¦  «        f}n.# t          t          f$ r d!}|                      d"¦  «         Y nw xY w|||d#œ|d$<   |��“|                     d%i ¦  «        }t          |                     d&d'¦  «        ¦  «                             ¦   «         }|                     d(d¦  «        }||d)<   ||d*<   | p|d+v }|r{|t0          v r&|                      d,|› d-|› d.|› d/|› d0|› d1�¦  «         nð|	d2k    rEt          |¦  «        dk    st          |¦  «        dk    r|                      d3|› d-|› d4|› d5�¦  «         n¤|                     dd¦  «        }|                     dd¦  «        }|                     d d¦  «        }t          |¦  «        t          |¦  «        k    s t          |¦  «        t          |¦  «        k    r"|                      d6|› d7|› d8|› d7|› d5�	¦  «         t3          |¦  «        dk    }t          ||||¬9¦  «        S ):u  XÃ¡c thá»±c toÃ n diá»‡n káº¿t quáº£ Reconnect theo cÃ¡c Báº¥t biáº¿n Kiáº¿n trÃºc.
    
    Args:
        result_data: Dict tá»« file reconnect_result.json
        ram_snapshot: Dict tá»« artifact _RAM.json chá»¥p táº¡i thá»�i Ä‘iá»ƒm reconnect
        check_live_process: Kiá»ƒm tra PID cÃ³ Ä‘ang cháº¡y thá»±c táº¿ trong Windows hay khÃ´ng
        check_live_hwnd: Kiá»ƒm tra HWND cÃ³ tá»“n táº¡i qua IsWindow hay khÃ´ng
        
    Returns:
        ReconnectValidationResult chá»©a tráº¡ng thÃ¡i vÃ  danh sÃ¡ch vi pháº¡m.
    )ÚstatusÚpidÚhwndzMissing required field: 'ú'F)r   r   r   r)   Ú r*   r+   NÚ
parsed_pidr   z*INV-RECONNECT-PROCESS-ALIVE: Invalid PID (ú)z.INV-RECONNECT-PROCESS-ALIVE: Non-numeric PID (z!INV-RECONNECT-PROCESS-ALIVE: PID z2 does not exist in Windows process table. Status 'z/' cannot be claimed for a non-existent process.Úprocess_namez is a zombie process.z0INV-RECONNECT-PROCESS-ALIVE: Cannot inspect PID z: )Ú0xÚ0Xé   z-INV-RECONNECT-HWND-VALID: Cannot parse HWND 'z7INV-RECONNECT-HWND-VALID: HWND must be str or int, got Úparsed_hwndzINV-RECONNECT-HWND-VALID: HWND z is not a valid open window.ÚesÚhpÚmana)r   r   r   zVitals values are non-numeric.)r5   r6   r7   ÚvitalsÚplayerÚaddressÚ0x0Úmemory_attachedÚram_attachedÚplayer_ram_address)r;   Ú0r-   zMINV-RECONNECT-NO-HARDCODED-VITALS: Detected hardcoded CI template vitals (es=z, hp=z, mana=z() while RAM snapshot has player.address=z and memory_attached=z. Violates Rule 4C & Rule 5!ÚSUCCESSzZINV-RECONNECT-NO-HARDCODED-VITALS: Reconnect result claims SUCCESS with active vitals (es=z4) but RAM snapshot shows unattached memory (address=z).z-Vitals mismatch between Reconnect Result (hp=z, es=z) and RAM Snapshot (hp=r   )Úappendr   ÚstrÚgetÚupperÚintÚ
ValueErrorÚ	TypeErrorÚpsutilÚ
pid_existsÚProcessÚnamer)   ÚSTATUS_ZOMBIEÚNoSuchProcessÚAccessDeniedÚ
isinstanceÚ
startswithÚtyper   Úwin32guiÚIsWindowÚhexÚlowerÚHARDCODED_PROHIBITED_VITALSÚlen)r#   r$   r&   r'   r   r   ÚmetaÚrequired_fieldsÚ
field_namer)   r*   Úhwnd_rawr.   ÚprocÚ	proc_nameÚer4   Úes_valÚhp_valÚmana_valÚvitals_tupleÚ
player_ramÚram_addrÚmem_attachedÚis_ram_deadÚram_hpÚram_esÚram_manar   s                                r   Úvalidate_reconnect_resultrj   0   sù  € ð" €FØ€HØ€Dð 0Ð/Ð/€OØ%ð Eð Eˆ
Ø˜[Ð(Ð(Ø�MŠMÐC°jÐCÐCÐCÑDÔDÐDøàð WÝ(°%ÀÐQUÐVÑVÔVÐVå�—’ ¨2Ñ.Ô.Ñ/Ô/×5Ò5Ñ7Ô7€FØ
�/Š/˜%Ñ
 Ô
 €CØ�Š˜vÑ&Ô&€Hð !%€JðOÝ˜‘X”Xˆ
Ø'ˆˆ\ÑØ˜Š?ˆ?Ø�MŠMÐTÀzÐTÐTÐTÑUÔUÐUøøÝ�	Ð"ð Oð Oð OØ�ŠÐMÀsÐMÐMÐMÑNÔNÐNÐNÐNðOøøøð ð dÐ(ð dÝÔ  Ñ,Ô,ð 	dØ�MŠMðS°Jð Sð SØ!ðSð Sð Sñô ð ð ð
dÝ”~ jÑ1Ô1�Ø ŸIšI™KœK�	Ø'0��^Ñ$Ø—;’;‘=”=¥FÔ$8Ò8Ð8Ø—M’MÐ"gÀjÐ"gÐ"gÐ"gÑhÔhÐhøøÝÔ(­&Ô*=Ð>ð dð dð dØ—’ÐbÐQ[ÐbÐbÐ_`ÐbÐbÑcÔcÐcÐcÐcÐcÐcÐcøøøøðdøøøð "&€KÝ�(�CÑ Ô ð kØˆˆÝ	�H�cÑ	"Ô	"ð kð	WØ/7×/BÒ/BÀ<Ñ/PÔ/PÐc�#˜h¨Ñ+Ô+Ð+ÕVYÐZbÑVcÔVcˆKˆKøÝð 	Wð 	Wð 	WØ�MŠMÐUÈ(ÐUÐUÐUÑVÔVÐVÐVÐVð	Wøøøð 	�ŠÐiÕPTÐU]ÑP^ÔP^ÔPgÐiÐiÑjÔjÐjà%€DˆÑàð �ð ­8Ð+?Ø˜!ÒÐ¥8Ô#4°[Ñ#AÔ#AÐØ�MŠMØ`µ#°kÑ2BÔ2BÐ`Ð`Ð`ñô ð ð
 �_Š_˜T 1Ñ%Ô%€FØ�_Š_˜T 1Ñ%Ô%€FØ�Š˜v qÑ)Ô)€Hð:Ý˜F™œ¥S¨¡[¤[µ#°h±-´-Ð@ˆˆøÝ�	Ð"ð :ð :ð :Ø ˆØ�ŠÐ8Ñ9Ô9Ð9Ð9Ð9ð:øøøð
 ØØðð €Dˆ�Nð ÑØ!×%Ò% h°Ñ3Ô3ˆ
Ý�z—~’~ i°Ñ7Ô7Ñ8Ô8×>Ò>Ñ@Ô@ˆØ#×'Ò'Ð(9¸5ÑAÔAˆà+ˆˆ^ÑØ%-ˆÐ!Ñ"ð (Ð'ÐJ¨XÐ9IÐ-Iˆàð 	àÕ:Ð:Ð:Ø—’ðVØ!ðVð VØ(.ðVð VØ7?ðVð VØiqðVð Và+7ðVð Vð Vñô ð ð ð
 ˜9Ò$Ð$­#¨f©+¬+¸ª/¨/½SÀ¹[¼[È1º_¸_Ø—’ðqØ!ðqð qØ(.ðqð qØdlðqð qð qñô ð øð  —^’^ D¨!Ñ,Ô,ˆFØ—^’^ D¨!Ñ,Ô,ˆFØ!—~’~ f¨aÑ0Ô0ˆHå�6‰{Œ{�c &™kœkÒ)Ð)­S°©[¬[½CÀ¹K¼KÒ-GÐ-GØ—’ðDÀFð Dð DÐQWð Dð DØ,2ðDð DØ9?ðDð Dð Dñô ð õ
 �F‘”˜qÒ €HÝ$ØØØØð	ñ ô ð sO   Â#3C Ã*DÄDÄ=A(F& Æ&G&ÇG!Ç!G&È4I É#I4É3I4Ì4,M! Í!(NÎN)NTT)
r#   r   r$   r%   r&   r   r'   r   r   r   )Ú__doc__Ú
__future__r   ÚosÚjsonÚdataclassesr   r   Útypingr   r   r   r	   r
   rH   rR   ÚImportErrorrV   r   rj   r"   r   r   ú<module>rr      s*  ðð	ð 	ð #Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3à €€€ðØ€O€O€O€OøØð ð ð Ø€H€H€Hðøøøð ðÐ ð
 ð
ð 
ð 
ð 
ð 
ñ 
ô 
ñ „ð
ð" .2Ø#Ø ð	Kð Kð Kð Kð Kð Kð Ks   ¬1 ±;º;