ó
    :x«j�J  ã                  ó.  • % S r SSKJr  SSKrSSKJrJr  SSKJrJ	r	J
r
JrJr  SSKrSSKJrJr  SSKJr  \ " S S	5      5       r " S
 S\5      r " S S5      r " S S5      r\R.                  " S5      r\R.                  " S5      r\R.                  " S5      r\R.                  " S5      r\R.                  " S5      rSSS.       S$S jjrSSS.       S%S jjrS&S jrS'S jr S(S jr!S)S jr"S*S jr#S+S jr$S+S jr%Sq&S \'S!'   S,S-S" jjr(S.S# jr)g)/z+Jira client interfaces and implementations.é    )ÚannotationsN)Ú	dataclassÚfield)ÚAnyÚDictÚListÚOptionalÚProtocol)ÚSettingsÚget_settings)Úsanitize_textc                  óÊ   • \ rS rSr% S\S'   S\S'   S\S'   S\S'   S\S'   \" \S9rS	\S
'   \" \S9rS	\S'   \" \S9r	S\S'   \" \S9r
S\S'   SrS\S'   SrS\S'   SrS\S'   Srg)Ú	JiraIssueé   ÚstrÚkeyÚsummaryÚdescriptionÚstatusÚ
issue_type)Údefault_factoryú	List[str]ÚlabelsÚacceptance_criteriaúList[Dict[str, Any]]ÚcommentsÚattachmentsÚ Úproject_keyÚassignee_account_idÚassignee_display_name© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__annotations__r   Úlistr   r   r   r   r   r    r!   Ú__static_attributes__r"   ó    Ú2/var/www/html/gaurav/packages/integrations/jira.pyr   r      s{   ‡ à	ƒHØƒLØÓØƒKØƒOÙ¨dÑ3€FˆIÓ3Ù%*¸4Ñ%@Ð˜Ó@Ù%*¸4Ñ%@€HÐ"Ó@Ù(-¸dÑ(C€KÐ%ÓCØ€K�ÓØ!Ð˜Ó!Ø!#Ð˜3Ö#r*   r   c                  óD   • \ rS rSrS
S jrSS jrSS jrSS.SS jjrSrg	)Ú
JiraClienté   c              ƒ  ó   #   • g 7f©Nr"   ©Úselfr   s     r+   Ú	get_issueÚJiraClient.get_issue    s   é € °cùó   ‚c              ƒ  ó   #   • g 7fr0   r"   )r2   r   Úbodys      r+   Úadd_commentÚJiraClient.add_comment"   s   é € ¸cùr5   c              ƒ  ó   #   • g 7fr0   r"   )r2   r   Útarget_status_names      r+   Útransition_issueÚJiraClient.transition_issue$   s   é € ÐQTùr5   é   ©Úmax_resultsc             ƒ  ó   #   • g 7fr0   r"   )r2   Újqlr@   s      r+   Úsearch_issuesÚJiraClient.search_issues&   s   é € ÐZ]ùr5   r"   N©r   r   Úreturnr   ©r   r   r7   r   rF   ÚNone©r   r   r;   r   rF   Úbool©rB   r   r@   ÚintrF   zList[JiraIssue])	r#   r$   r%   r&   r3   r8   r<   rC   r)   r"   r*   r+   r-   r-      s   † Ü9äAäTàBD×]Ò]r*   r-   c                  ó\   • \ rS rSrSrSS jrSS jrSS jrSS jrSS jr	SS	.SS
 jjr
Srg)ÚMockJiraClienté)   z,In-memory Jira used for local/dev and tests.c                óX   • 0 U l         / U l        / U l        SU l        SU l        SU l        g )NFr   )ÚissuesÚcomments_postedÚtransitions_postedÚfail_transitionsÚblock_transitionsÚlast_search_jql)r2   s    r+   Ú__init__ÚMockJiraClient.__init__,   s1   € Ø,.ˆŒØ57ˆÔØ8:ˆÔØ&+ˆÔØ',ˆÔØ$&ˆÕr*   c                ó4   • XR                   UR                  '   g r0   )rQ   r   )r2   Úissues     r+   ÚseedÚMockJiraClient.seed4   s   € Ø!&�‰�E—I‘IÒr*   c              ƒ  ób   #   • XR                   ;  a  [        SU 35      eU R                   U   $ 7f)NúIssue not found: )rQ   ÚKeyErrorr1   s     r+   r3   ÚMockJiraClient.get_issue7   s1   é € Ø—k‘kÓ!ÜÐ.¨s¨eÐ4Ó5Ð5Ø�{‰{˜3ÑÐùs   ‚-/c              ƒ  ó^  #   • XR                   ;  a  [        SU 35      eU R                   U   n[        UUR                  UR                  S9nU R
                  R                  UUUR                  =(       d    SS.5        U R                   U   R                  R                  SUSS.5        g 7f)Nr^   ©Ú
account_idÚdisplay_namer   )r   r7   Úmentioned_account_idz
agent-novaÚbot)Úauthorr7   rc   )rQ   r_   Úprepend_assignee_mention_textr    r!   rR   Úappendr   )r2   r   r7   rZ   Ú
final_bodys        r+   r8   ÚMockJiraClient.add_comment<   s§   é € Ø—k‘kÓ!ÜÐ.¨s¨eÐ4Ó5Ð5Ø—‘˜CÑ ˆÜ2ØØ×0Ñ0Ø×4Ñ4ñ
ˆ
ð
 	×Ñ×#Ñ#àØ"Ø(-×(AÑ(A×(GÀRñô	
ð 	�‰�CÑ×!Ñ!×(Ñ(Ø#¨ZÀuÑMõ	
ùs   ‚B+B-c              ƒ  ó`  #   • XR                   ;  a  [        SU 35      eU R                  (       a  [        S5      eU R                   U   nUR                  R                  5       UR                  5       :X  a  gU R                  (       a  gX#l        U R                  R                  XS.5        g7f)Nr^   zmock jira transition failureTF)r   r   )	rQ   r_   rT   ÚRuntimeErrorr   ÚlowerrU   rS   ri   )r2   r   r;   rZ   s       r+   r<   ÚMockJiraClient.transition_issueP   s’   é € Ø—k‘kÓ!ÜÐ.¨s¨eÐ4Ó5Ð5Ø× × ÜÐ=Ó>Ð>Ø—‘˜CÑ ˆØ�<‰<×ÑÓÐ#5×#;Ñ#;Ó#=Ó=ØØ×!×!ØØ)ŒØ×Ñ×&Ñ&¨sÑ'QÔRØùs   ‚B,B.r>   r?   c             ƒ  óÆ  #   • Xl         [        R                  " SU[        R                  5      n[        R                  " SU[        R                  5      nU(       a  UR	                  S5      OSR                  5       nU(       a  UR	                  S5      OSR                  5       n/ nU R                  R                  5        Hš  nU(       a   UR                  R                  5       U:X  a  M*  UR                  =(       d    UR                  R                  S5      S   R                  5       n	U(       a  X•:w  a  Mw  UR                  U5        [        U5      U:¼  d  M™    U$    U$ 7f)z8Minimal JQL support for tests: project = X AND key != Y.z"project\s*=\s*"?([A-Z][A-Z0-9]+)"?zkey\s*!=\s*([A-Z][A-Z0-9]+-\d+)é   r   Ú-r   )rV   ÚreÚsearchÚIÚgroupÚupperrQ   Úvaluesr   r   Úsplitri   Úlen)
r2   rB   r@   Ú	project_mÚ	exclude_mÚprojectÚexcludeÚresultsrZ   Úpks
             r+   rC   ÚMockJiraClient.search_issues^   sÿ   é € à"ÔÜ—I’IÐCÀSÌ"Ï$É$ÓOˆ	Ü—I’IÐ@À#ÄrÇtÁtÓLˆ	Þ)2�9—?‘? 1Ô%¸×AÑAÓCˆÞ)2�9—?‘? 1Ô%¸×AÑAÓCˆØ#%ˆØ—[‘[×'Ñ'Ö)ˆEÞ˜5Ÿ9™9Ÿ?™?Ó,°Ó7ÙØ×#Ñ#×> u§y¡y§¡°sÓ';¸AÑ'>×EÑEÓGˆBÞ˜2›=ÙØ�N‰N˜5Ô!Ü�7‹|˜{Õ*ØØˆñ *ð ˆùs   ‚EE!ÅE!)rU   rR   rT   rQ   rV   rS   N)rF   rH   )rZ   r   rF   rH   rE   rG   rI   rK   )r#   r$   r%   r&   Ú__doc__rW   r[   r3   r8   r<   rC   r)   r"   r*   r+   rN   rN   )   s/   † Ù6ô'ô'ô ô

ô(ð CE÷ ò r*   rN   c                  óf   • \ rS rS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 jr	S	S
.SS jjr
Srg)ÚHttpJiraClientér   Nc                ó–   • U=(       d
    [        5       U l        U R                  R                  U R                  R                  4U l        g r0   )r   ÚsettingsÚ
jira_emailÚjira_api_tokenÚ_auth)r2   r‡   s     r+   rW   ÚHttpJiraClient.__init__s   s0   € Ø ×2¤L£NˆŒØ—m‘m×.Ñ.°·±×0LÑ0LÐMˆ�
r*   c                óV   • U R                   R                  R                  S5       SU 3$ )NÚ/z/rest/api/3)r‡   Újira_base_urlÚrstrip)r2   Úpaths     r+   Ú_urlÚHttpJiraClient._urlw   s)   € Ø—-‘-×-Ñ-×4Ñ4°SÓ9Ð:¸+ÀdÀVÐLÐLr*   c              ƒ  ó,  #   • [         R                  " SS9 IS h  v•N nUR                  U R                  SU 35      U R                  SS0S9I S h  v•N nUR                  5         UR                  5       nS S S 5      IS h  v•N   WR                  S0 5      n[        UR                  S5      5      n/ nUR                  S0 5      R                  S	/ 5       Hw  nUR                  UR                  S
0 5      R                  S5      UR                  S
0 5      R                  S5      [        [        UR                  S5      5      5      S.5        My     UR                  S/ 5      =(       d    /  V	s/ sH&  n	U	R                  S5      U	R                  S5      S.PM(     n
n	UR                  S5      =(       d    0 n[        US   [        UR                  S5      =(       d    S5      [        U5      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U
UR                  S5      =(       d    0 R                  S5      =(       d    S[        U5      UR                  S5      =(       d    S[        UR                  S5      =(       d    S5      S9$  GNÐ GNœ GNo! , IS h  v•N  (       d  f       GN…= fs  sn	f 7f)Nç      >@©Útimeoutú/issue/ÚfieldszOsummary,description,status,issuetype,labels,attachment,comment,project,assignee©ÚauthÚparamsr   Úcommentr   rg   ÚdisplayNameÚ	accountIdr7   )rg   rc   r7   Ú
attachmentÚfilenameÚid)r    r¡   Úassigneer   r   r   r   ÚnameÚ	issuetyper   r}   )r   r   r   r   r   r   r   r   r   r   r    r!   )ÚhttpxÚAsyncClientÚgetr‘   rŠ   Úraise_for_statusÚjsonÚ_adf_to_textri   r   r   r(   Ú_extract_ac)r2   r   ÚclientÚrespÚdatar˜   r   r   ÚcÚar   r¢   s               r+   r3   ÚHttpJiraClient.get_issuez   sv  é € Ü×$Ò$¨T×2Ò2°fØŸ™Ø—	‘	˜G C 5˜/Ó*Ø—Z‘ZàÐoðð $ð ÷ ˆDð ×!Ñ!Ô#Ø—9‘9“;ˆD÷ 3×2ð —‘˜( BÓ'ˆÜ" 6§:¡:¨mÓ#<Ó=ˆØˆØ—‘˜I rÓ*×.Ñ.¨z¸2Ö>ˆAØ�O‰OàŸe™e H¨bÓ1×5Ñ5°mÓDØ"#§%¡%¨°"Ó"5×"9Ñ"9¸+Ó"FÜ)¬,°q·u±u¸V³}Ó*EÓFñöñ ?ð —Z‘Z ¨bÓ1×7°RÐ7ó
á7�ð Ÿ™˜zÓ*°!·%±%¸³+Ô>Ù7ð 	ð 
ð —:‘:˜jÓ)×/¨RˆÜØ�U‘Ü! &§*¡*¨YÓ"7×"=¸2Ó>Ü% kÓ2Ø—J‘J˜xÓ(×.¨B×3Ñ3°FÓ;×A¸rØŸ
™
 ;Ó/×5°2×:Ñ:¸6ÓB×HÀbÜ˜Ÿ
™
 8Ó,×2°Ó3ØØ#ØŸ™ IÓ.×4°"×9Ñ9¸%Ó@×FÀBÜ +¨KÓ 8Ø (§¡¨[Ó 9× ?¸RÜ"/°·±¸]Ó0K×0QÈrÓ"Rñ
ð 	
ò5 3ò÷ 3×2×2Ò2üò*
ùsd   ‚L›K+œLŸ3K4ÁK.Á$K4Á7LÂK1ÂC,LÅ/,LÆELË.K4Ë1LË4LË:K=Ë;LÌLc              ƒ  ó†  #   • U R                  U5      I S h  v•N u  p4S[        UUUS90n[        R                  " SS9 IS h  v•N nUR	                  U R                  SU S35      U R                  US9I S h  v•N nUR                  5         S S S 5      IS h  v•N   g  N‡ N] N) N! , IS h  v•N  (       d  f       g = f7f)Nr7   rb   r”   r•   r—   z/comment©rš   r©   )Ú_get_assigneeÚ!comment_adf_with_assignee_mentionr¥   r¦   Úpostr‘   rŠ   r¨   )r2   r   r7   rc   rd   Úpayloadr¬   r­   s           r+   r8   ÚHttpJiraClient.add_comment¤   s¹   é € Ø)-×);Ñ);¸CÓ)@×#@Ñ ˆ
àÔ5ØØ%Ø)ñð
ˆô ×$Ò$¨T×2Ò2°fØŸ™Ø—	‘	˜G C 5¨Ð1Ó2Ø—Z‘ZØð %ð ÷ ˆDð
 ×!Ñ!Ô#÷ 3×2Ð2ñ $Añ 3ñ÷ 3×2×2Ð2üsi   ‚C—B˜+CÁB!ÁCÁ2B'Á9B#Á:B'ÂCÂB%ÂCÂ!CÂ#B'Â%CÂ'B>Â-B0Â.B>Â:Cc              ƒ  ó,  #   • [         R                  " SS9 IS h  v•N nUR                  U R                  SU 35      U R                  SS0S9I S h  v•N nUR                  5         UR                  5       R                  S5      =(       d    0 R                  S5      =(       d    0 nS S S 5      IS h  v•N   WR                  S5      =(       d    S[        UR                  S	5      =(       d    S5      4$  NØ N£ NE! , IS h  v•N  (       d  f       NZ= f7f)
Nr”   r•   r—   r˜   r¢   r™   rž   r   r�   )r¥   r¦   r§   r‘   rŠ   r¨   r©   r   )r2   r   r¬   r­   r¢   s        r+   r´   ÚHttpJiraClient._get_assigneeµ   s×   é € Ü×$Ò$¨T×2Ò2°fØŸ™Ø—	‘	˜G C 5˜/Ó*Ø—Z‘ZØ  *Ð-ð $ð ÷ ˆDð
 ×!Ñ!Ô#ØŸ	™	›Ÿ™¨Ó1×7°R×<Ñ<¸ZÓH×NÈBˆH÷ 3×2ð �|‰|˜KÓ(×.¨B´¸h¿l¹lÈ=Ó>Y×>_Ð]_Ó0`Ð`Ð`ñ 3ñ÷ 3×2×2Ð2üsX   ‚D›C4œDŸ3C:ÁC6ÁAC:Â'DÂ2C8Â3ADÃ6C:Ã8DÃ:DÄ DÄDÄDc              ƒ  ó–  ^
#   • U=(       d    SR                  5       m
T
(       d  g[        R                  " SS9 ISh  v•N nUR                  U R	                  SU 35      U R
                  SS0S	9I Sh  v•N nUR                  5         UR                  5       R                  S5      =(       d    0 R                  S5      =(       d    0 R                  S
5      =(       d    SnUR                  5       T
R                  5       :X  a   SSS5      ISh  v•N   gUR                  U R	                  SU S35      U R
                  S9I Sh  v•N nUR                  5         UR                  5       =(       d    0 R                  S5      =(       d    / n[        U
4S jU 5       S5      nUc   SSS5      ISh  v•N   gUR                  U R	                  SU S35      U R
                  SS[        US   5      00S9I Sh  v•N n	U	R                  5          SSS5      ISh  v•N   g GNá GN­ GN Ná Nx N3 N! , ISh  v•N  (       d  f       g= f7f)zSMove issue to target status by name. Returns True if already there or transitioned.r   Fr”   r•   Nr—   r˜   r   r™   r£   Tz/transitions)rš   Útransitionsc              3  óÎ   >#   • U H[  nUR                  S 5      =(       d    0 R                  S5      =(       d    SR                  5       TR                  5       :X  d  MW  Uv •  M]     g7f)Útor£   r   N)r§   rn   )Ú.0ÚtÚtargets     €r+   Ú	<genexpr>Ú2HttpJiraClient.transition_issue.<locals>.<genexpr>Ú   sN   øé € ð á(˜ØŸ™˜t›×*¨×/Ñ/°Ó7×=¸2×DÑDÓFÈ&Ï,É,Ë.ÑX÷ ‘AÚ(ùs   ƒAA%Á	A%Ú
transitionr¡   r³   )Ústripr¥   r¦   r§   r‘   rŠ   r¨   r©   rn   Únextr¶   r   )r2   r   r;   r¬   Ú
issue_respÚcurrentÚ
trans_respr¼   ÚmatchÚ	post_resprÁ   s             @r+   r<   ÚHttpJiraClient.transition_issueÀ   s  øé € à$×*¨×1Ñ1Ó3ˆÞØä×$Ò$¨T×2Ò2°fØ%Ÿz™zØ—	‘	˜G C 5˜/Ó*Ø—Z‘ZØ  (Ð+ð  *ð  ÷ ˆJð
 ×'Ñ'Ô)à—/‘/Ó#×'Ñ'¨Ó1×7°R×<Ñ<¸XÓF×LÈ"×QÑQÐRXÓY×_Ð]_ð ð �}‰}‹ &§,¡,£.Ó0Ø÷ 3×2Ð2ð  &Ÿz™zØ—	‘	˜G C 5¨Ð5Ó6Ø—Z‘Zð  *ð  ÷ ˆJð ×'Ñ'Ô)Ø%Ÿ?™?Ó,×2°×7Ñ7¸ÓF×LÈ"ˆKÜôá(óð
 óˆEð ‰}Ø÷9 3×2Ð2ð< %Ÿk™kØ—	‘	˜G C 5¨Ð5Ó6Ø—Z‘ZØ" T¬3¨u°T©{Ó+;Ð$<Ð=ð *ð ÷ ˆIð
 ×&Ñ&Ô(Ø÷I 3×2Ó2òò 3ññ 3ñ<÷= 3×2×2Ð2üsº   ƒ:I	½H¾I	Á3H/Á4H!Á5BH/ÄI	ÄH$ÄI	Ä0H/ÅH'ÅAH/Æ%I	Æ0H)Æ1I	Æ6AH/Ç7H+Ç8H/ÈI	ÈH-ÈI	È!H/È$I	È'H/È)I	È+H/È-I	È/IÈ5H8È6IÉI	r>   r?   c             ƒ  óö  #   • / SQn[         R                  " SS9 IS h  v•N nUR                  U R                  S5      U R                  UUUS.S9I S h  v•N nUR                  5         UR                  5       nS S S 5      IS h  v•N   / nWR                  S5      =(       d    /  GH¨  nUR                  S5      =(       d    0 n	[        U	R                  S	5      5      n
U	R                  S
5      =(       d    0 nUR                  [        UR                  S5      =(       d    S[        U	R                  S5      =(       d    S5      [        U
5      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	R                  S5      =(       d    0 R                  S5      =(       d    S[        U
5      UR                  S5      =(       d    S[        UR                  S5      =(       d    S5      S9
5        GM«     U$  GN6 GN GNÖ! , IS h  v•N  (       d  f       GNì= f7f)N)r   r   r   r¤   r   r}   r¢   r”   r•   z/search/jql)rB   Ú
maxResultsr˜   r³   rQ   r˜   r   r¢   r   r   r   r   r£   r¤   r   r}   rž   r�   )
r   r   r   r   r   r   r   r   r    r!   )r¥   r¦   r¶   r‘   rŠ   r¨   r©   r§   rª   ri   r   r   r(   r«   )r2   rB   r@   r˜   r¬   r­   r®   r   ÚitemÚissue_fieldsr   r¢   s               r+   rC   ÚHttpJiraClient.search_issuesì   sð  é € ò
ˆô ×$Ò$¨T×2Ò2°fØŸ™Ø—	‘	˜-Ó(Ø—Z‘ZàØ"-Ø$ñð %ð ÷ ˆDð ×!Ñ!Ô#Ø—9‘9“;ˆD÷ 3×2ð $&ˆØ—H‘H˜XÓ&×,¨"Ó,ˆDØŸ8™8 HÓ-×3°ˆLÜ& |×'7Ñ'7¸Ó'FÓGˆKØ#×'Ñ'¨
Ó3×9°rˆHØ�N‰NÜØŸ™ ›×-¨2Ü)¨,×*:Ñ*:¸9Ó*E×*KÈÓLÜ -¨kÓ :Ø(×,Ñ,¨XÓ6×<¸"×AÑAÀ&ÓI×OÈRØ ,× 0Ñ 0°Ó =× CÀ×HÑHÈÓP×VÐTVÜ × 0Ñ 0°Ó :× @¸bÓAØ!-×!1Ñ!1°)Ó!<×!BÀ× GÑ GÈÓ N× TÐRTÜ(3°KÓ(@Ø(0¯©°[Ó(A×(GÀRÜ*7¸¿¹À]Ó8S×8YÐWYÓ*Zñ÷ñ	 -ð$ ˆò? 3ò÷ 3×2×2Ò2üsW   ‚I9ŸI I9£2IÁIÁ$IÁ:I9ÂIÂGI9ÉIÉI9ÉI6É$I'É%I6É1I9)rŠ   r‡   r0   )r‡   úOptional[Settings]rF   rH   )r�   r   rF   r   rE   rG   )r   r   rF   ztuple[str, str]rI   rK   )r#   r$   r%   r&   rW   r‘   r3   r8   r´   r<   rC   r)   r"   r*   r+   r„   r„   r   s6   † öNôMô(
ôT$ô"	aô*ðX CE÷ +ò +r*   r„   zhttps?://[^\s<>\[\]()]+z^(\d+)\.\s+(.*)$u   ^[-â€¢]\s+(.*)$z^##\s+(.*)$z*^([A-Za-z][A-Za-z0-9 /&_-]{0,40}):\s*(.*)$r   rb   c               ó–   • U=(       d    SR                  5       (       d  U $ U=(       d    UR                  5       =(       d    UnSU SU  3$ )z@Plain-text equivalent of assignee mention (used by mock / logs).r   Ú@z

)rÅ   )r7   rc   rd   Úlabels       r+   rh   rh   !  sH   € ð ×˜"×#Ñ#×%Ñ%ØˆØ×'˜Z×.Ñ.Ó0×>°J€EØˆuˆg�T˜$˜Ð Ð r*   c               ó  • [        U 5      nU=(       d    SR                  5       (       d  U$ U=(       d    UR                  5       =(       d    UnSSUSU 3SS.S./S.n[        UR                  S5      =(       d    / 5      nU/UQUS'   U$ )	zABuild comment ADF, optionally starting with a real Jira @mention.r   Ú	paragraphÚmentionrÔ   )r¡   ÚtextÚaccessLevel©ÚtypeÚattrs©rÜ   Úcontentrß   )Útext_to_adfrÅ   r(   r§   )r7   rc   rd   ÚdocrÕ   Úmention_pararß   s          r+   rµ   rµ   .  sœ   € ô �dÓ
€CØ×˜"×#Ñ#×%Ñ%Øˆ
Ø×'˜Z×.Ñ.Ó0×>°J€Eàð "à$Ø ˜w˜KØ#%ññð	
ñ$€Lô �3—7‘7˜9Ó%×+¨Ó,€GØ"Ð- WÐ-€Cˆ	�NØ€Jr*   c           
     ó  • U =(       d    SR                  SS5      R                  S5      n/ nSnU[        U5      :  Ga  X   nUR                  5       (       d  US-  nM0  [        R                  UR                  5       5      nU(       aD  UR                  SSS0[        UR                  S5      R                  5       5      S	.5        US-  nMž  / nU[        U5      :  ac  [        R                  X   R                  5       5      nU(       d  O6UR                  UR                  S
5      5        US-  nU[        U5      :  a  Mc  U(       a3  UR                  SSS0U Vs/ sH  n[        U5      PM     snS	.5        GML  / n	U[        U5      :  ac  [        R                  X   R                  5       5      nU(       d  O6U	R                  UR                  S5      5        US-  nU[        U5      :  a  Mc  U	(       a0  UR                  SU	 Vs/ sH  n[        U5      PM     snS.5        GM÷  UR                  S[        U5      S.5        US-  nU[        U5      :  a  GM  U(       d  UR                  SSSS./S.5        SSUS.$ s  snf s  snf )uù   Convert Agent Nova plain-text comments into readable Jira ADF.

Supports:
- ``## Heading`` â†’ heading level 3
- blank lines â†’ paragraph breaks
- ``1. item`` / ``- item`` â†’ lists
- ``Label: value`` â†’ bold label
- bare URLs â†’ clickable links
r   z
Ú
r   rq   ÚheadingÚlevelé   )rÜ   rÝ   rß   é   ÚorderedListÚorderÚ
bulletListrÞ   r×   rÙ   Ú ©rÜ   rÙ   rá   )rÜ   Úversionrß   )Úreplacery   rz   rÅ   Ú_HEADING_RErÊ   ri   Ú_inline_nodesrv   Ú_ORDERED_REÚ
_list_itemÚ
_BULLET_REÚ_paragraph_inlines)
r7   Úlinesrß   ÚiÚlinerå   Úordered_itemsÚmrÙ   Úbullet_itemss
             r+   rà   rà   K  sB  € ð �Z�R× Ñ  ¨Ó.×4Ñ4°TÓ:€EØ$&€GØ	€AØ
Œc�%‹jŒ.Ø‰xˆØ�z‰z�|‰|Ø�‰FˆAÙä×#Ñ# D§J¡J£LÓ1ˆÞØ�N‰Nà%Ø% q˜\Ü,¨W¯]©]¸1Ó-=×-CÑ-CÓ-EÓFñôð �‰FˆAÙà#%ˆØ”#�e“*‹nÜ×!Ñ! %¡(§.¡.Ó"2Ó3ˆAÞØØ× Ñ  §¡¨£Ô,Ø�‰FˆAð ”#�e“*�nö Ø�N‰Nà)Ø% q˜\Ù=JÓK¹]°T¤
¨4Ö 0¹]ÑKñôò à"$ˆØ”#�e“*‹nÜ× Ñ  ¡§¡Ó!1Ó2ˆAÞØØ×Ñ §¡¨£
Ô+Ø�‰FˆAð ”#�e“*�nö Ø�N‰Nà(Ù=IÓJ¹\°T¤
¨4Ö 0¹\ÑJñôò à�‰ Ô8JÈ4Ó8PÑQÔRØ	ˆQ‰ˆði Œc�%‹jŽ.öl Ø�‰ À&ÐRUÑ9VÐ8WÑXÔYØ a°GÑ<Ð<ùò5  Lùò   Ks   ÅI?ÈJ
c                ó&   • SS[        U 5      S./S.$ )NÚlistItemr×   rÞ   )rõ   )rÙ   s    r+   ró   ró   “  s    € àØ(Ô5GÈÓ5MÑNÐOñð r*   c                ó   • U R                  5       n[        R                  U5      (       d½  [        R                  U5      nU(       ai  UR	                  S5      S:w  aT  SUR	                  S5       S3SS0/S./nUR                  [        UR	                  S5      5      5        U=(       d    SS	S
./$ U(       a1  UR	                  S5      S:X  a  SUR	                  S5       S3SS0/S./$ [        U5      =(       d    SS	S
./$ )Nrè   r   rÙ   rq   z: rÜ   Ústrong©rÜ   rÙ   Úmarksrì   rí   Ú:)rÅ   Ú_URL_RErÊ   Ú	_LABEL_RErv   Úextendrñ   )rø   ÚstrippedrÕ   Únodess       r+   rõ   rõ   š  s÷   € Ø�z‰z‹|€Hä�=‰=˜×"Ñ"Ü—‘ Ó)ˆÞ�U—[‘[ “^ rÓ)ð #Ø$Ÿ{™{¨1›~Ð.¨bÐ1Ø% xÐ0Ð1ñð+ˆEð �L‰Lœ u§{¡{°1£~Ó6Ô7Ø×; f°cÑ:Ð;Ð;Þ�U—[‘[ “^ rÓ)ð #Ø$Ÿ{™{¨1›~Ð.¨aÐ0Ø% xÐ0Ð1ñðð ô ˜Ó"×E°ÀÑ'DÐ&EÐEr*   c                óì  • / nSn[         R                  U 5       H±  nUR                  5       U:”  a$  UR                  SXUR                  5        S.5        UR	                  S5      nUR                  S5      nU[        U5      S  nUR                  SUSSU0S./S.5        U(       a  UR                  SUS.5        UR                  5       nM³     U[        U 5      :  a  UR                  SXS  S.5        U$ )	Nr   rÙ   rí   z.,);]ÚlinkÚhrefrÛ   r   )r  ÚfinditerÚstartri   rv   r�   rz   Úend)rÙ   r  ÚposrÊ   ÚrawÚurlÚtrailings          r+   rñ   rñ   ´  sã   € Ø"$€EØ
€CÜ×!Ñ! $Ö'ˆØ�;‰;‹=˜3ÓØ�L‰L &°$¸U¿[¹[»]Ð2KÑLÔMØ�k‰k˜!‹nˆØ�j‰j˜Ó!ˆØ”s˜3“x�z�?ˆØ�‰àØØ#)°V¸S°MÑBÐCñô	
ö Ø�L‰L &°(Ñ;Ô<Ø�i‰i‹kŠñ (ð  ŒS�‹YƒØ�‰˜f¨d°4¨jÑ9Ô:Ø€Lr*   c                ó¤  • U c  g[        U [        5      (       a  U $ [        U [        5      (       aî  U R                  S5      S:X  a  U R                  S5      =(       d    S$ U R                  S5      S:X  aO  U R                  S5      =(       d    0 nUR                  S5      =(       d    SUR                  S5      =(       d    S 3$ U R                  S/ 5       Vs/ sH  n[	        U5      PM     nnU R                  S5      S	;   a  S
OSnUR                  S U 5       5      $ [        U [        5      (       a  S
R                  S U  5       5      $ gs  snf )Nr   rÜ   rÙ   rØ   rÝ   rÔ   r¡   rß   >   rå   rý   r×   rä   c              3  ó4   #   • U H  o(       d  M  Uv •  M     g 7fr0   r"   )r¿   Úps     r+   rÂ   Ú_adf_to_text.<locals>.<genexpr>Ù  s   é € Ð.¡5˜a«AŸ™¢5ùs   ‚	�	c              3  ó6   #   • U H  n[        U5      v •  M     g 7fr0   )rª   )r¿   Úns     r+   rÂ   r  Û  s   é € Ð7±$¨Qœ aŸ˜²$ùs   ‚)Ú
isinstancer   Údictr§   rª   Újoinr(   )ÚnoderÝ   r¯   ÚpartsÚseps        r+   rª   rª   Ì  s  € Ø�|ØÜ�$œ×ÑØˆÜ�$œ×ÑØ�8‰8�FÓ˜vÓ%Ø—8‘8˜FÓ#×) rÐ)Ø�8‰8�FÓ˜yÓ(Ø—H‘H˜WÓ%×+¨ˆEØ—9‘9˜VÓ$×C¨!¨E¯I©I°d«O×,A¸rÐ+BÐ(CÐCØ*.¯(©(°9¸bÔ*AÓBÑ*A Q”˜a–Ñ*AˆÐBØ—h‘h˜vÓ&Ð*NÓN‰dÐTVˆØ�x‰xÑ.¡5Ó.Ó.Ð.Ü�$œ×ÑØ�y‰yÑ7±$Ó7Ó7Ð7Øùò Cs   ÃEc                ó�  • / nSnU R                  5        H›  nUR                  5       R                  5       nSU;   a  SnM+  U(       d  M4  UR                  5       (       d  U(       a    OMMT  UR                  5       R                  S5      R                  5       nU(       d  MŠ  UR	                  U5        M�     U(       a  U$ [        U 5      $ )NFúacceptance criteriaTõ   -*â€¢0123456789. )Ú
splitlinesrn   rÅ   Úlstripri   Ú_extract_ac_fallback)r   rö   Úcapturerø   rn   Úcleaneds         r+   r«   r«   ß  s¢   € Ø€EØ€GØ×&Ñ&Ö(ˆØ—
‘
“×"Ñ"Ó$ˆØ  EÓ)ØˆGÙßˆ7Ø—:‘:—<‘<ÞÙÙØ—j‘j“l×)Ñ)Ð*=Ó>×DÑDÓFˆGßˆwØ—‘˜WÖ%ñ )ö ØˆÜ Ó,Ð,r*   c                óv  ^• / nU R                  5        H¡  nUR                  5       nU(       d  M  UR                  5       mTR                  S5      (       a  MD  UR	                  S5      R                  5       n[        U5      S::  a  Mt  [        U4S jS 5       5      (       d  M�  UR                  U5        M£     U$ )zKInfer AC from substantive numbered/bulleted lines when no AC header exists.r  r   r>   c              3  ó,   >#   • U H
  nUT;   v •  M     g 7fr0   r"   )r¿   Úkwrn   s     €r+   rÂ   Ú'_extract_ac_fallback.<locals>.<genexpr>  s    øé € ð 
ñ�ð �%ŽKòùs   ƒ)
ÚpicklistÚ
validationzpermission setr   ÚmustÚshouldÚblocksÚrequiresÚgrantsz	exists on)r!  rÅ   rn   Ú
startswithr"  rz   Úanyri   )r   Ú
candidatesrø   r  r%  rn   s        @r+   r#  r#  ô  s¨   ø€ à€JØ×&Ñ&Ö(ˆØ—:‘:“<ˆÞÙØ—‘Ó ˆØ×ÑÐ1×2Ñ2ÙØ—/‘/Ð"5Ó6×<Ñ<Ó>ˆÜˆw‹<˜2ÓÙÜô 
ñó
÷ 
ó 
ð ×Ñ˜gÖ&ñ3 )ð4 Ðr*   zOptional[MockJiraClient]Ú_mock_singletonc                óŒ   • U =(       d
    [        5       n U R                  S:X  a  [        c
  [        5       q[        $ [	        U 5      $ )NÚmock)r   Újira_providerr4  rN   r„   )r‡   s    r+   Úget_jira_clientr8    s;   € à×)œ<›>€HØ×Ñ Ó'ÜÑ"Ü,Ó.ˆOÜÐÜ˜(Ó#Ð#r*   c                 ó"   • [        5       q[        $ r0   )rN   r4  r"   r*   r+   Úreset_mock_jirar:  !  s   € ä$Ó&€OÜÐr*   )r7   r   rc   r   rd   r   rF   r   )r7   r   rc   r   rd   r   rF   úDict[str, Any])r7   r   rF   r;  )rÙ   r   rF   r;  )rø   r   rF   r   )rÙ   r   rF   r   )r  r   rF   r   )r   r   rF   r   r0   )r‡   rÒ   rF   r-   )rF   rN   )*r‚   Ú
__future__r   rs   Údataclassesr   r   Útypingr   r   r   r	   r
   r¥   Úpackages.configr   r   Úpackages.integrations.sanitizer   r   r-   rN   r„   Úcompiler  rò   rô   rð   r  rh   rµ   rà   ró   rõ   rñ   rª   r«   r#  r4  r'   r8  r:  r"   r*   r+   Ú<module>rB     sQ  ðÚ 1å "ã 	ß (ß 6Õ 6ã ç 2Ý 8ð ÷$ð $ó ð$ô^�ô ^÷Fñ F÷Reñ eðP �*Š*Ð/Ó
0€Ø�jŠjÐ,Ó-€Ø�ZŠZÐ*Ó+€
Ø�jŠj˜Ó(€Ø�JŠJÐDÓE€	ð Øñ	
!Ø
ð
!ð ð
!ð ð	
!ð
 	õ
!ð  Øñ	Ø
ðð ðð ð	ð
 õô:E=ôPôFô4ô0ô&-ô*ð@ -1€Ð)Ó 0ö$õr*   