ó
    dî¨jO#  ã                  ó˜  • S r SSKJr  SSKrSSKrSSKrSSKJr  SSKJ	r	J
r
Jr  SSKJrJr  SSKJr  \ " S S	5      5       r        SS
 jrSS jrSS jrSSS jjrSSS jjr S       S S jjrS!S jr S       S S jjrS"S jrS!S jrS!S jrS#S jr S       S S jjrS!S jrS!S jr S#S jr! S       S S jjr"g)$z+Normalize and filter Jira webhook payloads.é    )ÚannotationsN)Ú	dataclass)ÚAnyÚDictÚOptional)ÚSettingsÚget_settings)ÚWorkflowStatec                  óŽ   • \ rS rSr% S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S	\S
'   S\S'   S\S'   S\S'   \SS j5       rSrg)ÚNormalizedWebhookEventé   ÚstrÚdelivery_idÚ
event_typeÚjira_keyÚproject_keyÚstatusÚ
issue_typez	list[str]ÚlabelsúOptional[str]Úcomment_bodyÚcomment_author_idúDict[str, Any]Úrawc                ó    • U R                   S;   $ )N>   Úcomment_createdÚcomment_updated)r   )Úselfs    Ú:/var/www/html/gaurav/packages/integrations/jira_webhook.pyÚ
is_commentÚ!NormalizedWebhookEvent.is_comment   s   € à�‰Ð"HÑHÐHó    © N)ÚreturnÚbool)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__annotations__Úpropertyr    Ú__static_attributes__r#   r"   r   r   r      sN   ‡ àÓØƒOØƒMØÓØƒKØƒOØÓØÓØ$Ó$Ø	ÓàóIó óIr"   r   c                óÎ   • U(       d  g[         R                  " UR                  S5      U [        R                  5      R                  5       nSU 3n[         R                  " XA5      $ )zTValidate optional HMAC SHA256 signature. If no header provided in local/mock, allow.Tzutf-8zsha256=)ÚhmacÚnewÚencodeÚhashlibÚsha256Ú	hexdigestÚcompare_digest)ÚbodyÚsignature_headerÚsecretÚdigestÚexpecteds        r   Úvalidate_webhook_signaturer:   !   sO   € ö ØÜ�XŠX�f—m‘m GÓ,¨d´G·N±NÓC×MÑMÓO€FØ˜˜Ð!€HÜ×Ò˜xÓ:Ð:r"   c                óÒ  • U R                  S5      =(       d    U R                  S5      =(       d    SnU R                  S5      =(       d    0 nUR                  S5      =(       d    0 nU R                  S5      =(       d    0 nUR                  S5      =(       d    SnU(       d9  U(       a2  U R                  S5      =(       d    0 R                  S5      =(       d    Sn[        UUUU(       aD  UR                  S	5      =(       d    0 R                  S5      =(       d    UR                  S
5      S   OSUR                  S5      =(       d    0 R                  S5      =(       d    SUR                  S5      =(       d    0 R                  S5      =(       d    S[        UR                  S5      =(       d    / 5      [	        U5      UR                  S5      =(       d    0 R                  S5      U S9
$ )NÚwebhookEventÚissue_event_type_nameÚunknownÚissueÚfieldsÚcommentÚkeyÚ ÚprojectÚ-r   r   ÚnameÚ	issuetyper   ÚauthorÚ	accountId)
r   r   r   r   r   r   r   r   r   r   )Úgetr   ÚsplitÚlistÚ_comment_text)Úpayloadr   r   r?   r@   rA   rB   s          r   Únormalize_jira_webhookrO   .   sc  € Ø—‘˜^Ó,×a°·±Ð<SÓ0T×aÐXa€JØ�K‰K˜Ó ×& B€EØ�Y‰Y�xÓ ×& B€FØ�k‰k˜)Ó$×*¨€GØ
�)‰)�EÓ
×
 ˜b€CÞ–7à�{‰{˜7Ó#×) r×.Ñ.¨uÓ5×;¸ˆä!ØØØÞVY�f—j‘j Ó+×1¨r×6Ñ6°uÓ=×RÀÇÁÈ3ÃÐPQÑARøÐ_aØ—‘˜HÓ%×+¨×0Ñ0°Ó8×>¸BØ—Z‘Z Ó,×2°×7Ñ7¸Ó?×EÀ2Ü�F—J‘J˜xÓ(×.¨BÓ/Ü" 7Ó+Ø#ŸK™K¨Ó1×7°R×<Ñ<¸[ÓIØñð r"   c                óì   ^^• U (       d  g U R                  S5      n[        U[        5      (       a  U$ [        U[        5      (       a-  / mSUU4S jjmT" U5        T(       a  SR	                  T5      $ S $ g )Nr5   c                óP  >• [        U [        5      (       ai  U R                  S5      S:X  a*  U R                  S5      (       a  TR                  U S   5        U R                  S5      =(       d    /  H  nT" U5        M     g [        U [        5      (       a  U  H  nT" U5        M     g g )NÚtypeÚtextÚcontent)Ú
isinstanceÚdictrJ   ÚappendrL   )ÚnodeÚcÚtextsÚwalks     €€r   r[   Ú_comment_text.<locals>.walkP   s„   ø€ Ü˜$¤×%Ñ%Ø—8‘8˜FÓ# vÓ-°$·(±(¸6×2BÑ2BØ—L‘L  f¡Ô.ØŸ™ )Ó,×2°Ò2�AÙ˜–Gò 3ä˜D¤$×'Ñ'Û�AÙ˜–Gò ð (r"   Ú
)rX   r   r$   ÚNone)rJ   rU   r   rV   Újoin)rA   r5   rZ   r[   s     @@r   rM   rM   F   sg   ù€ ÞØØ�;‰;�vÓ€DÜ�$œ×ÑØˆÜ�$œ×Ñàˆ÷	ð 	ñ 	ˆTŒ
Þ#(ˆt�y‰y˜ÓÐ2¨dÐ2Ør"   c                óB  • U=(       d
    [        5       nU R                  UR                  ;  a  gU R                  (       a  U R                  UR                  ;  a  gUR
                  U R                  =(       d    / ;   nU R                  UR                  :H  nU=(       d    U$ ©NF)	r	   r   Újira_project_key_listr   Újira_issue_type_listÚjira_agent_labelr   r   Újira_agent_status)ÚeventÚsettingsÚlabel_okÚ	status_oks       r   Úis_agent_readyrj   _   s|   € Ø×)œ<›>€HØ×Ñ × >Ñ >Ó>ØØ××˜E×,Ñ,°H×4QÑ4QÓQØØ×(Ñ(¨U¯\©\×-?¸RÑ@€HØ—‘ × :Ñ :Ñ:€IØ× �yÐ r"   c                ó<   • U R                   (       a  g[        X5      $ ra   )r    rj   )rf   rg   s     r   Úshould_start_runrl   j   s   € Ø××ØÜ˜%Ó*Ð*r"   c                óD  • U=(       d
    [        5       nU R                  (       d  gU[        R                  :w  a  gU R                  (       a  U R                  R                  5       (       d  gUR                  nU(       a  U R                  U:X  a  gSU R                  ;   a  gg)NFzAgent Nova needs clarificationT)r	   r    r
   ÚNEEDS_CLARIFICATIONr   ÚstripÚjira_bot_account_idr   ©rf   Úcurrent_staterg   Úbot_ids       r   Úshould_resume_clarificationrt   p   s   € ð
 ×)œ<›>€HØ××ØØœ×9Ñ9Ó9ØØ×× U×%7Ñ%7×%=Ñ%=×%?Ñ%?ØØ×)Ñ)€FÞ�%×)Ñ)¨VÓ3Øà'¨5×+=Ñ+=Ó=ØØr"   c                ó¶   • U (       a  U R                  5       (       d  g[        [        R                  " SU R                  5       [        R                  5      5      $ )NFz^(reject|rejected)\b)ro   r%   ÚreÚmatchÚ
IGNORECASE©r5   s    r   Úis_design_reject_commentrz   …   s5   € Þ�t—z‘z—|‘|ØÜ”—’Ð0°$·*±*³,ÄÇÁÓNÓOÐOr"   c                óÚ  • U=(       d
    [        5       nU R                  (       d  gU[        R                  :w  a  gU R                  (       a  U R                  R                  5       (       d  gUR                  nU(       a  U R                  U:X  a  gU R                  nSU;   a  gUR                  5       R                  S5      (       d$  UR                  5       R                  S5      (       a  gg)zFTrue when a human comment should resume a run paused in DESIGN_REVIEW.Fz"Agent Nova design ready for reviewz## Confluence design doczConfluence design docT)
r	   r    r
   ÚDESIGN_REVIEWr   ro   rp   r   ÚlstripÚ
startswith)rf   rr   rg   rs   r5   s        r   Úshould_resume_design_reviewr   ‹   s¾   € ð ×)œ<›>€HØ××ØØœ×3Ñ3Ó3ØØ×× U×%7Ñ%7×%=Ñ%=×%?Ñ%?ØØ×)Ñ)€FÞ�%×)Ñ)¨VÓ3ØØ×Ñ€DØ+¨tÓ3ØØ‡{�{ƒ}×ÑÐ :×;Ñ;¸t¿{¹{»}×?WÑ?WØ÷@ñ @ð Ør"   c                ó:   • [        U R                  5      (       a  gg)z@Return 'reject' or 'approve' for a design-review resume comment.ÚrejectÚapprove)rz   r   )rf   s    r   Údesign_review_decisionrƒ   ¥   s   € ä × 2Ñ 2×3Ñ3ØØr"   c                óv  • U (       a  U R                  5       (       d  gU R                  5       n[        R                  " SU[        R                  5      (       a  g[	        [        R                  " SU[        R                  5      5      =(       a+    [        R                  " SU[        R                  5      (       + $ )NFú\bclose\s+as\s+duplicate\bTz\bduplicate\bú\bcontinue\b©ro   rv   Úsearchrx   r%   ©r5   rS   s     r   Úis_duplicate_close_commentrŠ   ¬   sy   € Þ�t—z‘z—|‘|ØØ�:‰:‹<€DÜ	‡y‚yÐ.°´b·m±m×DÑDØÜ”—	’	Ð*¨D´"·-±-Ó@ÓA÷ Ì"Ï)Ê)Ø˜œrŸ}™}óKô Gð r"   c                ó¶   • U (       a  U R                  5       (       d  g[        [        R                  " SU R                  5       [        R                  5      5      $ ©NFr†   ©ro   r%   rv   rˆ   rx   ry   s    r   Úis_duplicate_continue_commentrŽ   ·   ó4   € Þ�t—z‘z—|‘|ØÜ”—	’	˜/¨4¯:©:«<¼¿¹ÓGÓHÐHr"   c                ó`   • U R                   n[        U5      (       a  g[        U5      (       a  gg)zEReturn 'close', 'continue', or None if the comment is not a decision.ÚcloseÚcontinueN)r   rŠ   rŽ   ©rf   r5   s     r   Úduplicate_review_decisionr”   ½   s,   € à×Ñ€DÜ! $×'Ñ'ØÜ$ T×*Ñ*ØØr"   c                ó\  • U=(       d
    [        5       nU R                  (       d  gU[        R                  :w  a  gU R                  (       a  U R                  R                  5       (       d  gUR                  nU(       a  U R                  U:X  a  gSU R                  ;   a  g[        U 5      SL$ )zITrue when a human comment should resume a run paused in DUPLICATE_REVIEW.Fz&Agent Nova possible duplicate detectedN)	r	   r    r
   ÚDUPLICATE_REVIEWr   ro   rp   r   r”   rq   s       r   Úshould_resume_duplicate_reviewr—   Ç   sŒ   € ð ×)œ<›>€HØ××ØØœ×6Ñ6Ó6ØØ×× U×%7Ñ%7×%=Ñ%=×%?Ñ%?ØØ×)Ñ)€FÞ�%×)Ñ)¨VÓ3ØØ/°5×3EÑ3EÓEØÜ$ UÓ+°4Ð7Ð7r"   c                óÎ  • U (       a  U R                  5       (       d  gU R                  5       n[        R                  " SU[        R                  5      (       a  g[        R                  " SU[        R                  5      (       a  g[	        [        R                  " SU[        R                  5      5      =(       a+    [        R                  " SU[        R                  5      (       + $ )NFz\balready\s+done\bTr…   z	\bclose\br†   r‡   r‰   s     r   Úis_doc_close_commentr™   Ü   s“   € Þ�t—z‘z—|‘|ØØ�:‰:‹<€DÜ	‡y‚yÐ&¨¬b¯m©m×<Ñ<Øä	‡y‚yÐ.°´b·m±m×DÑDØÜ”—	’	˜,¨¬b¯m©mÓ<Ó=÷ ÄbÇiÂiØ˜œrŸ}™}óGô Cð r"   c                ó¶   • U (       a  U R                  5       (       d  g[        [        R                  " SU R                  5       [        R                  5      5      $ rŒ   r�   ry   s    r   Úis_doc_continue_commentr›   ê   r�   r"   c                ó`   • U R                   n[        U5      (       a  g[        U5      (       a  gg)zCReturn 'close', 'continue', or None for DOC_REVIEW resume comments.r‘   r’   N)r   r™   r›   r“   s     r   Údoc_review_decisionr�   ð   s,   € à×Ñ€DÜ˜D×!Ñ!ØÜ˜t×$Ñ$ØØr"   c                ó\  • U=(       d
    [        5       nU R                  (       d  gU[        R                  :w  a  gU R                  (       a  U R                  R                  5       (       d  gUR                  nU(       a  U R                  U:X  a  gSU R                  ;   a  g[        U 5      SL$ )zCTrue when a human comment should resume a run paused in DOC_REVIEW.Fz-functionality may already exist in ConfluenceN)	r	   r    r
   Ú
DOC_REVIEWr   ro   rp   r   r�   rq   s       r   Úshould_resume_doc_reviewr    ú   sŒ   € ð ×)œ<›>€HØ××ØØœ×0Ñ0Ó0ØØ×× U×%7Ñ%7×%=Ñ%=×%?Ñ%?ØØ×)Ñ)€FÞ�%×)Ñ)¨VÓ3ØØ6¸%×:LÑ:LÓLØÜ˜uÓ%¨TÐ1Ð1r"   )r5   Úbytesr6   r   r7   r   r$   r%   )rN   r   r   r   r$   r   )rA   r   r$   r   )N)rf   r   rg   úOptional[Settings]r$   r%   )rf   r   rr   zOptional[WorkflowState]rg   r¢   r$   r%   )r5   r   r$   r%   )rf   r   r$   r   )rf   r   r$   r   )#Ú__doc__Ú
__future__r   r1   r.   rv   Údataclassesr   Útypingr   r   r   Úpackages.configr   r	   Úpackages.db.modelsr
   r   r:   rO   rM   rj   rl   rt   rz   r   rƒ   rŠ   rŽ   r”   r—   r™   r›   r�   r    r#   r"   r   Ú<module>r©      s_  ðÙ 1å "ã Û Û 	Ý !ß &Ñ &ç 2Ý ,ð ÷Ið Ió ðIð"
;Ø
ð
;à#ð
;ð ð
;ð 
ô	
;ôô0ö2!ö+ð $(ðØ!ðà*ðð !ðð 
õ	ô*Pð $(ðØ!ðà*ðð !ðð 
õ	ô4ôôIôð $(ð8Ø!ð8à*ð8ð !ð8ð 
õ	8ô*ôIôð $(ð2Ø!ð2à*ð2ð !ð2ð 
ö	2r"   