Ë
    ¥©	j€  ã                   ój   — U d Z ddlmZ ddlmZmZ  ee«      Z G d„ d«      Zda	edz  e
d<   defd	„Zy)
z…
Findings classifier - assigns character_id to validated findings.
Uses rule-based logic to match findings to specialist characters.
é    )Ú
get_logger)ÚCharacterIdÚFindingValidatedc                   óÆ   — e Zd ZU dZg d¢Zg d¢Zg d¢Zg d¢Zg d¢Zg d¢Z	de
d	ee
   d
efd„ZddddddddddddddœZee
e
f   ed<   ded
efd„Zdee   d
eeee   f   fd„Zy)ÚFindingsClassifiera¹  
    Assigns findings to specialist characters based on content analysis.
    
    Characters:
    - Aegis (Security Paladin): injections, XSS, auth, CVEs
    - Schema (DB Mage): N+1, indexes, migrations, locks
    - Pixel (UX Bard): a11y, contrast, copy, states
    - Atlas (Architecture Explorer): patterns, coupling, consistency
    - Echo (Test Priest): coverage, edge cases, mocks
    - Codex (Docs Scribe): outdated docs, comments
    )zsql injectionÚxssÚcsrfÚauthenticationÚauthorizationÚsecurityÚvulnerabilityÚcveÚsanitizeÚescapeÚtokenÚpasswordÚsecretÚ
credentialÚ
encryptionÚhash)zn+1ÚqueryÚdatabaseÚindexÚ	migrationÚtransactionÚlockÚdeadlockÚormÚsqlÚselectÚjoinÚperformanceÚdbÚtableÚcolumnzforeign keyÚ
constraint)ÚaccessibilityÚa11yÚariaÚcontrastÚcolorÚfontÚuiÚuxzuser experienceÚ	usabilityzscreen readerÚkeyboardÚfocusÚsemanticzalt textÚlabelÚwcag)ÚarchitectureÚpatternÚdesignÚcouplingÚcohesionÚ
dependencyÚsolidÚdryÚ
separationÚabstractionÚ	interfaceÚclassÚmoduleÚ	componentÚ	structureÚorganizationÚconsistencyÚnaming)ÚtestÚcoveragez	edge caseÚmockÚstubÚ	assertionz	unit testÚintegrationÚe2eÚspecÚexpectÚdescribez	it shouldz	test caseÚscenarioÚ
validation)ÚdocumentationÚcommentÚjsdocÚreadmeÚdocsÚoutdatedzmissing docsÚundocumentedÚ	docstringzapi docszinline commentÚtodoÚfixmeÚexplainÚtextÚkeywordsÚreturnc                 óL   ‡— |j                  «       Št        ˆfd„|D «       «      S )z.Calculate how many keywords match in the text.c              3   ó,   •K  — | ]  }|‰v sŒd –— Œ y­w)é   N© )Ú.0ÚkeywordÚ
text_lowers     €ú8/var/www/html/prparty/backend/app/services/classifier.pyú	<genexpr>z>FindingsClassifier._calculate_keyword_score.<locals>.<genexpr>A   s   øè ø€ ÒF˜°¸:Ò0E”1ÑFùs   ƒ	�)ÚlowerÚsum)Úselfr^   r_   rg   s      @rh   Ú_calculate_keyword_scorez+FindingsClassifier._calculate_keyword_score>   s   ø€ à—Z‘Z“\ˆ
ÜÓF HÔFÓFÐFó    ÚaegisÚschemaÚpixelÚatlasÚechoÚcodex)r   r   r#   r.   r-   r5   ÚarchÚtestsrG   ÚtestingrS   rW   ÚdocÚCATEGORY_TO_CHARACTERÚfindingc           	      óD  — t        |dd«      }|| j                  v r4| j                  |   }t        j                  d|j                  ||¬«       |S |j
                  › d|j                  › �j                  «       }| j                  || j                  «      | j                  || j                  «      | j                  || j                  «      | j                  || j                  «      | j                  || j                  «      | j                  || j                  «      dœ}t        |j!                  «       d„ ¬«      d	   }||   d	k(  r8|j"                  d
k(  rd}n&|j"                  dk(  rd}n|j"                  dk(  rd}nd}t        j                  d|j                  ||¬«       |S )z×
        Assign a character to a finding based on content analysis.

        Args:
            finding: Validated finding to classify

        Returns:
            Character ID that best matches the finding
        ÚcategoryÚgeneralÚfinding_classified_by_category)Ú
finding_idÚcharacter_idÚmodel_categoryÚ ©ro   rp   rq   rr   rs   rt   c                 ó   — | d   S )Nrc   rd   )Úxs    rh   ú<lambda>z5FindingsClassifier.classify_finding.<locals>.<lambda>v   s
   € ¸¸1¹€ rn   )Úkeyr   Úcriticalro   Úhighrr   Úmediumrp   rt   Úfinding_classified_by_keywords)r   r€   Úscores)Úgetattrry   ÚloggerÚinfoÚidÚtitleÚdescriptionrj   rm   ÚAEGIS_KEYWORDSÚSCHEMA_KEYWORDSÚPIXEL_KEYWORDSÚATLAS_KEYWORDSÚECHO_KEYWORDSÚCODEX_KEYWORDSÚmaxÚitemsÚseverity)rl   rz   r�   r€   r^   rŒ   s         rh   Úclassify_findingz#FindingsClassifier.classify_findingT   s™  € ô ! ¨*°iÓ@ˆØ˜T×7Ñ7Ñ7Ø×5Ñ5°nÑEˆLÜ�K‰KØ0Ø"Ÿ:™:Ø)Ø-ð	 ô ð  Ðð —-‘-�  '×"5Ñ"5Ð!6Ð7×=Ñ=Ó?ˆð ×2Ñ2°4¸×9LÑ9LÓMØ×3Ñ3°D¸$×:NÑ:NÓOØ×2Ñ2°4¸×9LÑ9LÓMØ×2Ñ2°4¸×9LÑ9LÓMØ×1Ñ1°$¸×8JÑ8JÓKØ×2Ñ2°4¸×9LÑ9LÓMñ
ˆô ˜6Ÿ<™<›>©~Ô>¸qÑAˆà�,Ñ 1Ò$Ø×Ñ :Ò-Ø&‘Ø×!Ñ! VÒ+Ø&‘Ø×!Ñ! XÒ-Ø'‘à&�ä�‰Ø,Ø—z‘zØ%Øð	 	ô 	
ð Ðrn   Úfindingsc                 óL  — g g g g g g dœ}|D ]'  }| j                  |«      }||   j                  |«       Œ) t        j                  dt	        |«      t	        |d   «      t	        |d   «      t	        |d   «      t	        |d   «      t	        |d   «      t	        |d   «      ¬	«       |S )
zç
        Classify multiple findings and group by character.
        
        Args:
            findings: List of validated findings
        
        Returns:
            Dict mapping character_id to their assigned findings
        rƒ   Úfindings_classifiedro   rp   rq   rr   rs   rt   )Útotal_findingsro   rp   rq   rr   rs   rt   )rœ   ÚappendrŽ   r�   Úlen)rl   r�   Ú
classifiedrz   r€   s        rh   Úclassify_findingsz$FindingsClassifier.classify_findings‹   sÅ   € ð ØØØØØñA
ˆ
ð  ò 	5ˆGØ×0Ñ0°Ó9ˆLØ�|Ñ$×+Ñ+¨GÕ4ð	5ô 	�‰Ø!Ü˜x›=Ü�j Ñ)Ó*Ü�z (Ñ+Ó,Ü�j Ñ)Ó*Ü�j Ñ)Ó*Ü�Z Ñ'Ó(Ü�j Ñ)Ó*ð 	ô 		
ð Ðrn   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r“   r”   r•   r–   r—   r˜   ÚstrÚlistÚintrm   ry   ÚdictÚ__annotations__r   r   rœ   r¤   rd   rn   rh   r   r      sÕ   … ñ
ò€Nò€Oò€Nò€Nò€Mò€NðG¨Sð G¸DÀ¹Ið GÈ#ó Gð ØØØØØØØØØØ ØØñ-Ð˜4  S ™>ó ð 5Ð(8ð 5¸[ó 5ðn%àÐ'Ñ(ð%ð 
ˆk˜4Ð 0Ñ1Ð1Ñ	2ô%rn   r   NÚ_classifierr`   c                  ó.   — t         €
t        «       a t         S )z)Get or create global classifier instance.)r®   r   rd   rn   rh   Úget_classifierr°   ·   s   € ô ÐÜ(Ó*ˆÜÐrn   )r¨   Úapp.logging_configr   Ú
app.modelsr   r   r¥   rŽ   r   r®   r­   r°   rd   rn   rh   ú<module>r³      sH   ðòõ *ß 4á	�HÓ	€÷eñ eðR *.€Ð $Ñ&Ó -ðÐ*ô rn   