
    Cj                        S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	J
r
Jr  S SKJr  S SKJr  S SKJrJr  S SKJr  S SKJrJr  S SKrS SKJrJr  S S	KJr  S S
KJr  S SK J!r!  S SK"J#r#  S\$S\$4S jr%S\&S\$4S jr'S\&S-  S\$4S jr(S\)\$\4   S\!4S jr*S\!S\SS4S jr+S\S\)\$\4   4S jr,S\)\$\4   S\$S\-4S jr.S\)\$\4   S\$S\&4S jr/S\)\$\4   S\$S\$S\-4S  jr0S!S".S\!S\S#\1SS4S$ jjr2S\S\!4S% jr3S\S\!4S& jr4S\S\!4S' jr5SS(\$S)\-S\$4S* jjr6S+\7\)\$\4      S-  S\$4S, jr8SS+\7\)\$\4      S-  S\$4S- jjr91 S.kr:S/r;\
 " S0 S15      5       r<\
 " S2 S35      5       r=\
 " S4 S55      5       r> SS6\S7\7\$   S8\1S\R~                  \$   4S9 jjr@ SS6\S7\7\$   S8\1S\R~                  \A   4S: jjrBS;\)\$\$4   S\14S< jrCS;\)\$\$4   S\14S= jrDS6\S\14S> jrES6\S\14S? jrFS6\S@\$S\14SA jrGS6\S\$S-  4SB jrHS@\$S-  S\$S-  4SC jrIS;\)\$\$4   S\$S-  4SD jrJS6\S;\)\$\$4   S\$S-  4SE jrKS6\SF\$S-  S;\)\$\$4   S\$4SG jrLS6\S\$S-  4SH jrMSI\AS\7\<   4SJ jrNSK\7\$   SL\O\$   SM\$SS4SN jrPSO\7\<   S\)\$\4   4SP jrQ\;4SQ\7\$   SR\-S\R\7\$   \14   4SS jjrSST\7\=   S\$4SU jrTSV\7\)\$\$4      SW\1S;\)\$\$4   S\14SX jrUSY\)\$\$4   SF\$S-  S;\)\$\$4   S\=4SZ jrV SSV\7\)\$\$4      S[\$SF\$S-  SW\1S;\)\$\$4   S-  S\>4S\ jjrWS]\$S\14S^ jrXS_\$S\R\$\)\$\$4   4   4S` jrYSa\$S\$4Sb jrZSc\$S\$4Sd jr[Se\$S\$4Sf jr\S+\7\)\$\4      SS4Sg jr]S+\7\)\$\4      S\14Sh jr^S+\7\)\$\4      S\7\)\$\$4      4Si jr_Sj\$S\14Sk jr`S+\7\)\$\4      Sl\$SS4Sm jraSSc\$Sn\$So\$S-  S\$4Sp jjrbS\4Sq jrcSr\Ss\$S\14St jrdSu\)\$\$4   Sv\$Sw\$SS4Sx jreSy\)\$\4   Su\)\$\$4   Sz\S{\$S\$4
S| jrfS}\$S\4S~ jrgg)    N)	dataclassfield)Path)Any)	HTTPErrorURLError)urlparse)Requesturlopen)DockerExceptionImageNotFound)Console)Panel)Text)load_settingsseverityreturnc                 6    SSSSSS.nUR                  U S5      $ )N#dc2626#ea580c#d97706#65a30dz#0284c7criticalhighmediumlowinfo#6b7280get)r   severity_colorss     g/home/rurouni/.local/share/pipx/venvs/strix-agent/lib/python3.13/site-packages/strix/interface/utils.pyget_severity_colorr$      s-    O x33    
cvss_scorec                 <    U S:  a  gU S:  a  gU S:  a  gU S:  a  gg	)
Ng      "@r   g      @r   g      @r   g?r   r    )r&   s    r#   get_cvss_colorr)   %   s1    SSSSr%   countc                 |    [        U =(       d    S5      nUS:  a	  US-  S S3$ US:  a	  US-  S S3$ [        U5      $ )Nr   i@B .1fMi  K)intstr)r*   values     r#   format_token_countr2   1   sQ    
OE	)#C(**~%-$A&&u:r%   reportc                    Sn[        5       nU R                  SS5      nU(       aB  UR                  SSS9  UR                  S5        UR                  SUS9  UR                  U5        U R                  S	S5      nU(       a[  UR                  S5        UR                  S
US9  [        UR	                  5       5      nUR                  UR                  5       SU 3S9  U R                  S5      nUbA  UR                  S5        UR                  SUS9  [        U5      nUR                  US SU 3S9  U R                  S5      nU(       a2  UR                  S5        UR                  SUS9  UR                  U5        U R                  S5      n	U	(       a2  UR                  S5        UR                  SUS9  UR                  U	5        U R                  S5      n
U
(       a2  UR                  S5        UR                  SUS9  UR                  U
5        U R                  S5      nU(       a2  UR                  S5        UR                  SUS9  UR                  U5        U R                  S0 5      nU(       Ga  UR                  S5        / nUR                  S5      (       a  UR                  SUS    35        UR                  S5      (       a  UR                  SUS    35        UR                  S5      (       a  UR                  SUS    35        UR                  S5      (       a  UR                  SUS    35        UR                  S 5      (       a  UR                  S!US     35        UR                  S"5      (       a  UR                  S#US"    35        UR                  S$5      (       a  UR                  S%US$    35        UR                  S&5      (       a  UR                  S'US&    35        U(       a/  UR                  S(US9  UR                  S)R                  U5      S*S9  U R                  S+5      nU(       aC  UR                  S5        UR                  S,US9  UR                  S-5        UR                  U5        U R                  S.5      nU(       aC  UR                  S5        UR                  S/US9  UR                  S-5        UR                  U5        U R                  S05      nU(       aC  UR                  S5        UR                  S1US9  UR                  S-5        UR                  U5        U R                  S25      nU(       aC  UR                  S5        UR                  S3US9  UR                  S-5        UR                  U5        U R                  S45      nU(       aB  UR                  S5        UR                  S5US9  UR                  S-5        UR                  US*S9  U R                  S65      nU(       Ga  UR                  S5        UR                  S7US9  [        U5       GH  u  nnUR                  S5        UR                  S8US9-    S:3S*S9  UR                  UR                  S;S<5      S=S9  UR                  S>5      nUR                  S?5      nUb9  U(       a  UU:w  a  UR                  S@U SAU 35        OUR                  S@U 35        UR                  SB5      (       a  UR                  SCUSB    3SDS9  UR                  SE5      (       a$  UR                  SC5        UR                  USE   S*S9  UR                  SF5      (       d  UR                  SG5      (       d  GMB  UR                  SH5        UR                  SF5      (       a#  UR                  SIS*S9  UR                  USF   S*S9  UR                  SG5      (       d  GM  UR                  SJS*S9  UR                  USG   S*S9  GM     U R                  SK5      nU(       aC  UR                  S5        UR                  SLUS9  UR                  S-5        UR                  U5        U$ )MNzbold #4ade80title zVulnerability Reportzbold #ea580cstyle

zTitle: r   z
Severity: bold cvsszCVSS Score: r,   targetzTarget: endpointz
Endpoint: methodzMethod: cvezCVE: cvss_breakdownattack_vectorzAV:attack_complexityzAC:privileges_requiredzPR:user_interactionzUI:scopezS:confidentialityzC:	integrityzI:availabilityzA:zCVSS Vector: /dimdescriptionDescription
impactImpacttechnical_analysiszTechnical Analysispoc_descriptionzPoC Descriptionpoc_script_codezPoC Codecode_locationszCode Locationsz  Location    : fileunknownbold
start_lineend_line:-labelz
  z
italic dimsnippet
fix_before	fix_afterz
  Fix:z
  - z
  + remediation_stepsRemediation)	r   r!   appendr$   lowerupperr)   join	enumerate)r3   field_styletextr5   r   severity_colorr;   
cvss_colorr<   r=   r>   r?   r@   
cvss_partsrK   rN   rP   rQ   rR   rS   ilocstartendra   s                            r#   format_vulnerability_reportrq   :   s$    K6DJJw#E*.AFI[1Ezz*b)HFL4+HNN,<=HNN$eN3C,DE::fDFN+6#D)
tCj5)=>ZZ!FFJk2Fzz*%HFL4HZZ!FFJk2F
**U
C
FG;/CZZ 0"5NF
o..N?$C#DEF122N3F$G#HIJ344N3H$I#JKL011N3E$F#GHIg&&>'#:";<=/00>2C#D"EFGk**>+#>"?@An-->.#A"BCDKK{K;KK,EK:**]+KFM5DK ZZ!FFHK0DF$89F(<D&'jj!23OF%[9DO$jj!23OFJk2DO51ZZ 01NF$K8/FAsKKKK+a!eWB/uK=KK	2&KAGGL)E''*%C 3%<KK!E7!C5 12KK!E7,wwwd3w<.1Fwwy!!F#C	N%8ww|$$(<(<J'77<((KKK6KKL 1K?77;''KKK6KKK 0K>/ 02 

#67FM5D%&Kr%   
stats_textreport_statec                    [        UR                  5      nUS:  Gal  SSSSSS.nUR                   H6  nUR                  SS5      R                  5       nXS;   d  M*  X5==   S-  ss'   M8     U R	                  SSS9  / nS Hr  nX5   nUS:  d  M  [        U5      n[        5       n	U	R	                  UR                  5        S	3US9  U	R	                  [        U5      S
U 3S9  UR	                  U	5        Mt     [        U5       H:  u  pU R	                  U5        U
[        U5      S-
  :  d  M*  U R	                  SSS9  M<     U R	                  SSS9  U R	                  [        U5      SS9  U R	                  SSS9  U R	                  S5        g U R	                  SSS9  U R	                  SSS9  U R	                  SSS9  U R	                  S5        g )Nr   r   r   r6   rT   zVulnerabilities  bold redr7   rU   r:    | 	dim whitez	 (Total: zbold yellow)rM   zbold #22c55e0
bold whitez* (No exploitable vulnerabilities detected)z	dim green)
lenvulnerability_reportsr!   rd   rc   r$   r   re   r0   rg   )rr   rs   
vuln_countseverity_countsr3   r   severity_partsr*   rj   severity_textrm   parts               r#   _build_vulnerability_statsr      s   \778JA~'(!qTUV"88Fzz*b1779H*)Q.) 9
 	-Z@EH#-Eqy!3H!= $$$(8'9%<N$S$$SZ~>N7O$P%%m4 F !0GAd#3~&**!!%{!; 1
 	+[9#j/?#[1$-^D#\2FkZ$r%   c                     [        U S5      (       a)  U R                  5       n[        U[        5      (       a  U$ 0 $ [	        U S0 5      R                  S5      n[        U[        5      (       a  U$ 0 $ )Nget_total_llm_usage
run_record	llm_usage)hasattrr   
isinstancedictgetattrr!   )rs   usages     r#   
_llm_usager      se    |233002"5$//u7R7L,377DEud++533r%   r   keyc                      [        S[        U R                  U5      =(       d    S5      5      $ ! [        [        4 a     gf = fNr   )maxr/   r!   	TypeError
ValueError)r   r   s     r#   	_int_statr      s=    1c%))C.-A.//z" s   ,/ AAc                      [        U R                  U5      =(       d    S5      nUS:  a  U$ S$ ! [        [        4 a     gf = f)Ng        r   )floatr!   r   r   )r   r   r1   s      r#   _float_statr     sJ    eiin+, AI5&3& z" s   #/ AA
detail_key	value_keyc                     U R                  U5      n[        U[        5      (       a&  U(       a  [        US   [        5      (       a  US   O0 n[        U[        5      (       d  g[	        X25      $ r   )r!   r   listr   r   )r   r   r   detailss       r#   _detail_valuer     sU    ii
#G'4   'Jwqz4,H,H'!*bgt$$W((r%   Fliver   c                z   [        U5      nU(       a  [        US5      S::  ab  U R                  S5        U R                  SSS9  U R                  SSS9  U R                  S	S
S9  U R                  SSS9  U R                  SSS9  g [        US5      n[        US5      n[        USS5      n[	        US5      nU R                  S5        U R                  SSS9  U R                  [        U5      SS9  U(       d  US:  a9  U R                  SS
S9  U R                  SSS9  U R                  [        U5      SS9  U(       a  SOSnU R                  US
S9  U R                  SSS9  U R                  [        U5      SS9  U(       d  US:  a5  U R                  SS
S9  U R                  SSS9  U R                  SUS 3SS9  g g )Nrequestsr   rM   zCost rJ   r7   z$0.0000 z#fbbf24u   · rw   zTokens ry   whiteinput_tokensoutput_tokensinput_tokens_detailscached_tokenscostzInput Tokens u     ·  zCached Tokens zOutput Tokens $z.4f)r   r   rc   r   r   r2   )	rr   rs   r   r   r   r   r   r   	separators	            r#   _build_llm_usage_statsr     s    |$EIeZ0A5$'/*I6%{3)51#W-UN3Le_5M!%)?QMuf%DdoU3(6gF}q (+6*%8,];7K(Ii{3&e4(7wGtax(+6'/Ad3Z.	: r%   c                 X    [        5       nU (       d  U$ [        X5        [        X5        U$ N)r   r   r   )rs   rr   s     r#   build_final_stats_textr   =  s(    Jz8:4r%   c                    [        5       nU (       d  U$ [        5       R                  R                  =(       d    SnUR	                  SSS9  UR	                  [        U5      SS9  UR	                  S5        [        U R                  5      nUR	                  SSS9  UR	                  U SS9  UR	                  S5        US:  Ga"  SSSSSS	.nU R                   H6  nUR                  S
S5      R                  5       nXd;   d  M*  XF==   S-  ss'   M8     / nS	 Hr  nXF   nUS:  d  M  [        U5      n	[        5       n
U
R	                  UR                  5        S3U	S9  U
R	                  [        U5      SU	 3S9  UR	                  U
5        Mt     [        U5       H:  u  pUR	                  U5        U[        U5      S-
  :  d  M*  UR	                  SSS9  M<     UR	                  S5        [        XSS9  U$ )NrW   zModel rJ   r7   r   rM   zVulnerabilities r   r   r   r6   rT   rU   r:   rv   rw   Tr   )r   r   llmmodelrc   r0   r{   r|   r!   rd   r$   re   rg   r   )rs   rr   r   r}   r~   r3   r   r   r*   rj   r   rm   r   s                r#   build_live_stats_textr   H  s   JO%%2Ehe,c%j0d\778J(6W5dA~'(!qTUV"88Fzz*b1779H*)Q.) 9
 EH#-Eqy!3H!= $$$(8'9%<N$S$$SZ~>N7O$P%%m4 F !0GAd#3~&**!!%{!; 1
 	$:$?r%   c                 T   [        5       nU (       d  U$ [        5       R                  R                  =(       d    SnUR	                  [        U5      SS9  [        U 5      nU(       a}  [        US5      S:  am  UR	                  S5        UR	                  [        [        US5      5       S3SS9  [        US5      nUS:  a$  UR	                  S	SS9  UR	                  S
US 3SS9  [        U SS 5      nU(       a1  UR	                  S5        UR	                  SSS9  UR	                  USS9  U$ )NrW   r   r7   total_tokensr   rM   z tokensr   u    · r   z.2f	caido_urlzCaido: rz   )r   r   r   r   rc   r0   r   r   r2   r   r   )rs   rr   r   r   r   r   s         r#   build_tui_stats_textr   s  s%   JO%%2Ec%j0|$E5.1A5$!)E>"BCDGL 	 	
 5&)!8fG4$snG<k48I$)<8)73r%   ri   
max_lengthc                     U R                  5       R                  5       n [        R                  " SSU 5      n U R                  S5      n [	        U 5      U:  a  U S U R                  S5      n U =(       d    S$ )Nz
[^a-z0-9]+r\   pentest)rd   stripresubr{   rstrip)ri   r   s     r#   _slugify_for_run_namer     sc    ::<D66-d+D::c?D
4y:KZ '',9r%   targets_infoc                    U (       d  gU S   nUR                  S5      nUR                  S0 5      =(       d    0 nUR                  SS5      =(       d    SnUS:X  aO  UR                  SU5      n [        U5      n[        UR                  =(       d    UR                  =(       d    U5      $ US	:X  a  UR                  S
U5      n[        U5      nUR                  =(       d    UnUR                  S5      R                  S5      S   =(       d    Un	U	R                  S5      (       a  U	S S n	[        U	5      $ US:X  a:  UR                  SU5      n
 [        [        U
5      R                  =(       d    U
5      $ US:X  a$  [        UR                  SU5      =(       d    U5      $ [        U=(       d    S5      $ ! [
         a    [        U5      s $ f = f! [
         a    [        U
5      s $ f = f)Nr   r   typer   originalr6   web_application
target_url
repositorytarget_reporI   .git
local_codetarget_path
ip_address	target_ip)r!   r	   r0   netlocpath	Exceptionr   splitendswithr   name)r   firsttarget_typer   r   urlparsedrepor   r   path_strs              r#   !_derive_target_label_for_run_namer     s   OE))F#Kii	2&,"GyyR(.BH''kk,1	c]Fv}}::s;; l"{{=(3${{"d{{3%%c*2.6$==  9D4yl";;}h7	!tH~**6h77 l"7;;{H5ABBx$9%%-  	s8O	   	!x= 	!s$   .;F2 &G 2G
	G
G%$G%c                 h    [        U 5      n[        U5      n[        R                  " S5      nU SU 3$ )N   _)r   r   secrets	token_hex)r   
base_labelslugrandom_suffixs       r#   generate_run_namer     s7    2<@J ,D%%a(MV1]O$$r%   >   autodifffullx   c                   R    \ rS rSr% \\S'   \\S'   Sr\S-  \S'   Sr\S-  \S'   Sr	g)	DiffEntryi  statusr   Nold_path
similarityr(   )
__name__
__module____qualname____firstlineno__r0   __annotations__r   r   r/   __static_attributes__r(   r%   r#   r   r     s(    K
IHcDj!Jd
!r%   r   c                       \ rS rSr% \\S'   \S-  \S'   \\S'   \\S'   \\   \S'   \\   \S'   \\\\4      \S	'   \\   \S
'   \\   \S'   \	" \S9r
\\\4   \S'   S\\\4   4S jrSrg)RepoDiffScopei  source_pathNworkspace_subdirbase_ref
merge_baseadded_filesmodified_filesrenamed_filesdeleted_filesanalyzable_filesdefault_factorytruncated_sectionsr   c                    U R                   U R                  U R                  U R                  U R                  U R
                  U R                  U R                  U R                  [        U R                  5      [        U R
                  5      [        U R                  5      [        U R                  5      [        U R                  5      U R                  S.$ )N)r   r   r   r   r   r   r   r   r   added_files_countmodified_files_countrenamed_files_countdeleted_files_countanalyzable_files_countr   )r   r   r   r   r   r   r   r   r   r{   r   )selfs    r#   to_metadataRepoDiffScope.to_metadata  s    ++ $ 5 5//++"11!//!// $ 5 5!$T%5%5!6$'(;(;$<#&t'9'9#:#&t'9'9#:&)$*?*?&@"&"9"9
 	
r%   r(   )r   r   r   r   r0   r   r   r   r   r   r   boolr  r   r(   r%   r#   r   r     s    Dj MOcIS#X''93i*/*ES$YE
T#s(^ 
r%   r   c                   X    \ rS rSr% \\S'   \\S'   Sr\\S'   \" \	S9r
\	\\4   \S'   Srg	)
DiffScopeResulti  activemoder6   instruction_blockr   metadatar(   N)r   r   r   r   r  r   r0   r  r   r   r  r   r   r(   r%   r#   r
  r
    s.    L
Is$T:Hd38n:r%   r
  	repo_pathargscheckc                 L    [         R                  " SS[        U 5      /UQSSUS9$ )Ngit-CTcapture_outputri   r  
subprocessrunr0   r  r  r  s      r#   _run_git_commandr    s1     >>	c)n,t,	 r%   c                 J    [         R                  " SS[        U 5      /UQSUS9$ )Nr  r  T)r  r  r  r  s      r#   _run_git_command_rawr  	  s.     >>	c)n,t, r%   envc                 .   ^  [        U 4S jS 5       5      $ )Nc              3   F   >#    U  H  nTR                  U5      v   M     g 7fr   r    .0r   r  s     r#   	<genexpr>%_is_ci_environment.<locals>.<genexpr>  s&      

C 	
   !)CIGITHUB_ACTIONS	GITLAB_CIJENKINS_URL	BUILDKITECIRCLECIanyr  s   `r#   _is_ci_environmentr/    s     


 
 
r%   c                 .   ^  [        U 4S jS 5       5      $ )Nc              3   F   >#    U  H  nTR                  U5      v   M     g 7fr   r    r!  s     r#   r#  %_is_pr_environment.<locals>.<genexpr>"  s&      	
C 	
r%  )GITHUB_BASE_REFGITHUB_HEAD_REF#CI_MERGE_REQUEST_TARGET_BRANCH_NAME'GITLAB_MERGE_REQUEST_TARGET_BRANCH_NAMESYSTEM_PULLREQUEST_TARGETBRANCHr,  r.  s   `r#   _is_pr_environmentr8  !  s     	
	 	 	r%   c                     [        U SS/SS9nUR                  S:H  =(       a+    UR                  R                  5       R	                  5       S:H  $ )N	rev-parsez--is-inside-work-treeFr  r   true)r  
returncodestdoutr   rd   )r  results     r#   _is_git_repor@  .  sH    i+7N)OW\]F!Mfmm&9&9&;&A&A&Cv&MMr%   c                 @   [        U SS/SS9nUR                  S:X  a3  UR                  R                  5       R	                  5       nUS;   a  US:H  $ U S-  nUR                  5       (       a  US	-  R                  5       $ UR                  5       (       a|   UR                  S
S9R                  5       nUR                  S5      (       aH  UR                  SS5      S   R                  5       nX-  R                  5       nUS	-  R                  5       $ g! [         a     gf = f)Nr:  z--is-shallow-repositoryFr;  r   >   r<  falser<  r   shallowutf-8encodingzgitdir:r[   rT   )r  r=  r>  r   rd   is_direxistsis_file	read_textOSError
startswithr   resolve)r  r?  r1   git_metacontentgit_dirresolveds          r#   _is_repo_shallowrR  3  s   i+7P)QY^_FA##%++-%%F?"6!H9$,,..	(('(:@@BG i((mmC+A.446G!+446Hy(0022  		s   D 
DDrefc                 >    [        U SSSU/SS9nUR                  S:H  $ )Nr:  z--verify--quietFr;  r   )r  r=  )r  rS  r?  s      r#   _git_ref_existsrV  I  s+    i+z9c)RZ_`F!!r%   c                     [        U / SQSS9nUR                  S:w  a  g UR                  R                  5       nU=(       d    S $ )N)zsymbolic-refrU  zrefs/remotes/origin/HEADFr;  r   r  r=  r>  r   )r  r?  rS  s      r#   _resolve_origin_head_refrY  N  sD    JRWF A
--


C;$r%   c                 j    U (       d  g U R                  5       nU(       d  g UR                  S5      S   $ )NrI   r   )r   r   )rS  r1   s     r#   _extract_branch_namer[  X  s-    IIKE;;sBr%   c                    U R                  SS5      R                  5       nU(       d  g [        U5      nUR                  5       (       d  g  [        R
                  " UR                  SS95      nUR                  S0 5      R                  S0 5      R                  S5      n[        U[        5      (       a%  UR                  5       (       a  UR                  5       $ g ! [        R                  [        4 a     g f = f)NGITHUB_EVENT_PATHr6   rD  rE  pull_requestbasesha)r!   r   r   rH  jsonloadsrJ  JSONDecodeErrorrK  r   r0   )r  
event_pathr   payloadbase_shas        r#   _extract_github_base_sharg  a  s    ,b1779J
D;;==**T^^W^=> {{>2.2262>BB5IH(C  X^^%5%5~~   '* s   #C C76C7c                     UR                  SS5      R                  5       nU(       a  U$ [        U 5      nU(       a  [        U5      nU(       a  U$ [	        U S5      (       a  g[	        U S5      (       a  gg )Nr3  r6   refs/remotes/origin/mainmainrefs/remotes/origin/mastermaster)r!   r   rY  r[  rV  )r  r  github_base_reforigin_headbranchs        r#   _resolve_default_branch_namerp  u  si    gg/4::<O*95K%k2My"<==y">??r%   	diff_basec                    U(       a%  UR                  5       (       a  UR                  5       $ UR                  SS5      R                  5       nU(       a  SU 3n[        X5      (       a  U$ [        U5      nU(       a  [        X5      (       a  U$ [	        U 5      nU(       a  [        X5      (       a  U$ [        U S5      (       a  g[        U S5      (       a  g[        S5      e)Nr3  r6   zrefs/remotes/origin/ri  rk  zpUnable to resolve a base ref for diff-scope. Pass --diff-base explicitly (for example: --diff-base origin/main).)r   r!   rV  rg  rY  r   )r  rq  r  rm  github_candidategithub_base_sharn  s          r#   _resolve_base_refru    s    Y__&&  gg/4::<O1/1BC977##.s3O?9FF*95Ky>>y"<==)y">??+
	2 r%   c                     [        U / SQSS9nUR                  S:w  a  g UR                  R                  5       nU(       a  US:X  a  g U$ )N)r:  z--abbrev-refHEADFr;  r   rw  rX  )r  r?  branch_names      r#   _get_current_branch_namery    sH    i)NV[\FA--%%'K+/r%   
raw_outputc           	      B   U (       d  / $ U R                  S5       Vs/ s H  o(       d  M  UR                  SSS9PM     nn/ nSnU[        U5      :  a  X$   nUnUS S nS n[        U5      S:  a&  USS  R                  5       (       a  [	        USS  5      nUS;   aB  US-   [        U5      :  a0  X$S-      nX$S-      n	UR                  [        UU	UUS	95        US
-  nM  US-   [        U5      :  a'  X$S-      n
UR                  [        XjUS95        US-  nM   U$ U$ s  snf )N    rD  replaceerrorsr   rT   >   CRr   )r   r   r   r      )r   r   r   )r   decoder{   isdigitr/   rc   r   )rz  tokentokensentriesindex
status_rawstatus_coder   r   new_pathr   s              r#   _parse_name_status_zr    sV   	 >H=M=Mg=V=VEZ_/WY/=V    "GE
#f+

 !n!%
z?Q:ab>#9#9#;#;Z^,J*$S[)@ai(Hai(HNN&!%)	 QJE19s6{"!)$DNN9KzZ[QJEN7NIs
   
DD	containerseenr   c                 d    U(       a)  X!;  a#  UR                  U5        U R                  U5        g g g r   )addrc   )r  r  r   s      r#   _append_uniquer    s*      !tr%   r  c                    / n/ n/ n/ n/ n[        5       n[        5       nU  GHI  nUR                  n	U	(       d  M  UR                  S:X  a  UR                  U	5        M<  UR                  S:X  a  UR                  U	5        [	        XVU	5        Mk  UR                  S:X  a  [	        X'U	5        [	        XVU	5        M  UR                  S:X  aa  UR                  UR
                  U	UR                  S.5        [	        XVU	5        UR                  b  UR                  S:  a  [	        X'U	5        GM  UR                  S:X  a  [	        X'U	5        [	        XVU	5        GM1  [	        X'U	5        [	        XVU	5        GML     UUUUUS.$ )	NDAr-   r  )r   r  r   d   r  )r   r   r   r   r   )setr   r   rc   r  r   r   )
r  r   r   r   r   r   analyzable_seenmodified_seenentryr   s
             r#   _classify_diff_entriesr    sg   K "N!M*,M"$ #O!eMzz<<3  &<<3t$+dC<<3>$?+dC<<3   % $"'"2"2 +dC'5+;+;c+A~dC<<3>$?+dC~d;'$?M R #(&&, r%   files	max_filesc                 6    [        U 5      U::  a  U S4$ U S U S4$ )NFT)r{   )r  r  s     r#   _truncate_file_listr    s,     5zYe|)d""r%   scopesc                    / SQnU  GH  nUR                   =(       d(    [        UR                  5      R                  =(       d    SnUR	                  S5        UR	                  SU 35        UR	                  SUR
                   35        UR	                  SUR                   35        [        UR                  5      u  pEXRR                  S'   U(       ae  UR	                  S5        UR                  S	 U 5       5        U(       a4  UR	                  S
[        UR                  5      [        U5      -
   S35        OUR	                  S5        [        UR                  5      u  pgXrR                  S'   U(       ad  UR	                  S5        UR                  S U 5       5        U(       a4  UR	                  S
[        UR                  5      [        U5      -
   S35        [        UR                  5      u  pXR                  S'   U(       ad  UR	                  S5        UR                  S U 5       5        U	(       a4  UR	                  S
[        UR                  5      [        U5      -
   S35        UR                  (       a  / n
UR                   H  nUR                  S5      =(       d    SnUR                  S5      =(       d    SnUR                  S5      n[!        U["        5      (       a  U
R	                  SU SU SU S35        Mz  U
R	                  SU SU 35        M     UR	                  S5        UR                  U
5        [        UR$                  5      u  nnUUR                  S'   U(       d  GMi  UR	                  S5        UR                  S U 5       5        U(       d  GM  UR	                  S
[        UR$                  5      [        U5      -
   S35        GM     SR'                  U5      R)                  5       $ ) N)z2The user is requesting a review of a Pull Request.zInstruction: Direct your analysis primarily at the changes in the listed files. You may reference other files in the repository for context (imports, definitions, usage), but report findings only if they relate to the listed changes.z0For Added files, review the entire file content.z9For Modified files, focus primarily on the changed areas.r   r6   zRepository Scope: zBase reference: zMerge base: r   z)Primary Focus (changed files to analyze):c              3   ,   #    U  H
  nS U 3v   M     g7f- Nr(   r"  r   s     r#   r#  /build_diff_scope_instruction.<locals>.<genexpr>8       =2dV   z- ... (z more files)z4Primary Focus: No analyzable changed files detected.r   z!Added files (review entire file):c              3   ,   #    U  H
  nS U 3v   M     g7fr  r(   r  s     r#   r#  r  B  r  r  r   z"Modified files (focus on changes):c              3   ,   #    U  H
  nS U 3v   M     g7fr  r(   r  s     r#   r#  r  J  s     @2dVr  r   rW   r  r   r  z -> z (similarity z%)zRenamed files:r   z>Note: These files were deleted (context only, not analyzable):c              3   ,   #    U  H
  nS U 3v   M     g7fr  r(   r  s     r#   r#  r  a  s     ?2dVr  rM   )r   r   r   r   rc   r   r   r  r   r   extendr{   r   r   r   r!   r   r/   r   rf   r   )r  linesrE   	repo_namefocus_filesfocus_truncatedr   added_truncatedr   modified_truncatedrename_linesrenamer   r  r   r   deleted_truncateds                    r#   build_diff_scope_instructionr  #  sK   E **Zd53D3D.E.J.JZl	R))56''789|E$4$4#567':5;Q;Q'R$7F  !34LLDELL===ws5+A+A'BSEU'U&VVbcdLLOP':5;L;L'M$2A  /LL<=LL===ws5+<+<'=K@P'P&QQ]^_-@AUAU-V*5G  !12LL=>LL@@@!c%"6"67#n:MMNl[ L--!::j1>Y!::j1>Y#ZZ5
j#.. ''"XJd8*MR\Q]]_(`a ''"XJd8*(EF . LL)*LL&+>u?R?R+S((4E  1=LLYZLL???  ws5+>+>'?#mBT'T&UUabcm p 99U!!##r%   local_sourcesnon_interactivec                 F   U (       d  gU(       d  g[        U5      (       d  g[        U5      (       a  gU  Hi  nUR                  S5      nU(       d  M  [        U5      n[	        U5      (       d  M:  [        U5      n[        XR5      nU(       d  MY  U(       d  Mb  Xg:w  d  Mi    g   g)NFTr   )r/  r8  r!   r   r@  ry  rp  )r  r  r  sourcer   r  current_branchdefault_branchs           r#   _should_activate_auto_scoper  h  s     c""#jj/%	I&&1)<5iE>nn1Q   r%   r  c                 D   U R                  SS5      nU R                  S5      n[        U5      n[        U5      (       d  [        SU 35      e[	        U5      (       a  [        S5      e[        XQU5      n[        USUS/SS	9nUR                  S
:w  a7  UR                  R                  5       n[        SU SU SU=(       d    S 35      eUR                  R                  5       n	U	(       d  [        SU SU S35      e[        USSSSSU	 S3/SS	9n
U
R                  S
:w  aB  U
R                  R                  SSS9R                  5       n[        SU SU=(       d    S 35      e[        U
R                  5      n[        U5      n[        UUUU	US   US   US   US   US   S 9	$ )!Nr   r6   r   z Source is not a git repository: z\Strix requires full git history for diff-scope. Please set fetch-depth: 0 in your CI config.z
merge-baserw  Fr;  r   z&Unable to compute merge-base against 'z' for 'z'. z8Ensure the base branch history is fetched and reachable.z;'. Ensure the base branch history is fetched and reachable.r   z--name-statusz-zz--find-renamesz--find-copiesz...HEADrD  r}  r~  z%Unable to resolve changed files for 'z8Ensure the repository has enough history for diff-scope.r   r   r   r   r   )	r   r   r   r   r   r   r   r   r   )r!   r   r@  r   rR  ru  r  r=  stderrr   r>  r  r  r  r  r   )r  rq  r  r   r   r  r   merge_base_resultr  r   diff_resultr  
classifieds                r#   _resolve_repo_diff_scoper    s    **]B/Kzz"45[!I	"";K=IJJ	""!
 	

 !s;H(\8V4T\ab##q("))//14XJgk]RUSSTV
 	

 #))//1J4XJgk] SG G
 	

 'l'"	
 K "##**79*EKKM3K=SSTV
 	

 #;#5#56G'0J)}-!"23 1 1#$67
 
r%   
scope_modec           	         U[         ;  a  [        SU 35      e[        Uc  [        R                  OU5      nUS:X  a  [        SUSUS.S9$ US:X  a!  [        XU5      nU(       d  [        SUSUS.S9$ U (       d  [        S5      e/ n/ n/ n	U  He  n
U
R                  S5      nU(       d  M  [        [        U5      5      (       d  UR                  U5        MI   UR                  [        XU5      5        Mg     U(       d6  US:X  a%  SUS.nU(       a  XS'   U	(       a  XS'   [        SXS9$ [        S5      e[        U5      nSUU Vs/ s H  oR                  5       PM     sn[        U5      [        S U 5       5      [        S U 5       5      S.nU(       a  XS'   U	(       a  XS'   [        SUUUS9$ ! [         a*  nUS:X  a  U	R                  U S	U S
35         S nAGMQ  e S nAff = fs  snf )NzUnsupported scope mode: r   F)r  r  )r  r  r  r   zDDiff-scope is active, but no local repository targets were provided.r   z (diff-scope skipped: rx   skipped_non_git_sourcesskipped_diff_scope_sourceszsDiff-scope is active, but no Git repositories were found. Use --scope-mode full to disable diff-scope for this run.Tc              3   L   #    U  H  n[        UR                  5      v   M     g 7fr   )r{   r   r"  rE   s     r#   r#  -resolve_diff_scope_context.<locals>.<genexpr>
  s     %[{ec%*@*@&A&A{   "$c              3   L   #    U  H  n[        UR                  5      v   M     g 7fr   )r{   r   r  s     r#   r#  r    s     "U3u':':#;#;r  )r  r  repostotal_repositoriestotal_analyzable_filestotal_deleted_files)r  r  r  r  )_SUPPORTED_SCOPE_MODESr   r   osenvironr
  r  r!   r@  r   rc   r  r  r  r{   sum)r  r  rq  r  r  env_mapshould_activaterepo_scopesskipped_non_gitskipped_diff_scoper  r   er  r  rE   s                   r#   resolve_diff_scope_contextr    s$    //3J<@AA2::#6GV %z:
 	
 V5mV]^"$):>  _``')K!#O$&jj/D-.."";/	77ST   27'LH6E23!9K56"%jTTH
 	

 5[A3>?;%##%;?!+."%%[{%["[""U"UUH .=*+1C-.+	 E  	V#"))[M9OPQsRS*TU		0 @s$   F/G&/
G#9GGG#r   c                 D   U R                  S5       S3n [        USS0S9n[        USS9 nSUR                  R	                  S	S
5      ;   sS S S 5        $ ! , (       d  f       g = f! [
         a  nUR                  S:H  s S nA$ S nAf[        [        [        4 a     gf = f)NrI   z"/info/refs?service=git-upload-packz
User-Agentz	git/strix)headers
   )timeoutzx-git-upload-pack-advertisementzContent-Typer6   i  F)
r   r
   r   r  r!   r   coder   rK  r   )r   	check_urlreqrespr  s        r#   _is_http_git_repor    s    ::c?##EFIi,)DES"%48H8HY[8\\ &%% vv}gz* s@   A& A	A& 
A#A& #A& &
B0B>BBBr<   c                 ^   U (       a  [        U [        5      (       d  [        S5      eU R                  5       n U R	                  S5      (       a  SSU 04$ U R	                  S5      (       a  SSU 04$ [        U 5      nUR                  S;   a  UR                  (       d  UR                  (       a  SSU 04$ UR                  R                  S5      R                  S5      (       a  SSU 04$ UR                  (       d  UR                  (       a  S	S
U 04$ UR                  R                  S5       Vs/ s H  o"(       d  M  UPM     nn[        U5      S:  a  [!        U 5      (       a  SSU 04$ S	S
U 04$  ["        R$                  " U 5      nSS[        U5      04$ s  snf ! [         a     Of = f['        U 5      R)                  5       n UR+                  5       (       a@  UR-                  5       (       a  SS[        UR/                  5       5      04$ [        SU  35      eO+! [0        [2        4 a  n[        SU  SU< 35      UeS nAff = fU R                  S5      (       a  SSU 04$ SU ;   aX  U R5                  S5      u  pxn	SU;   a>  UR	                  S5      (       d(  U	(       a!  SU  3n
[!        U
5      (       a  SSU
04$ S	S
U
04$ SU ;   a\  SU ;  aV  U R	                  S5      (       d@  U R                  S5      n[        U5      S:  a   [7        S U 5       5      (       a	  S	S
SU  304$ [        SU  S35      e)Nz!Target must be a non-empty stringgit@r   r   zgit://)httphttpsrI   r   r   r   r   r   r   r   r   z$Path exists but is not a directory: zInvalid path: z - .zhttps://c              3   R   #    U  H  o=(       a    UR                  5       v   M     g 7fr   )r   )r"  ps     r#   r#  $infer_target_type.<locals>.<genexpr>\  s     "BEq??Es   %'zInvalid target: z
Target must be one of:
- A valid URL (http:// or https://)
- A Git repository URL (https://host/org/repo or git@host:org/repo.git)
- A local directory path
- A domain name (e.g., example.com)
- An IP address (e.g., 192.168.1.10))r   r0   r   r   rL  r	   schemeusernamepasswordr   r   r   queryfragmentr   r{   r  	ipaddressr   r   
expanduserrH  rG  rM  rK  RuntimeError	partitionall)r<   r   spath_segmentsip_objr   r  	host_partr   	path_partfull_urlpartss               r#   infer_target_typer  &  s/   FC00<==\\^F  mV444""mV444fF}}))??foo-!888;;c"++F33-!888<<6??$|V&<<<$*KK$5$5c$:@$:qa$:@}"'8'@'@-!888 <"8888%%f- k3v;777 A  
 <""$DC;;=={{}}#mS5H%IIICF8LMM  \" C>&QE:;BC vmV444
f}"("2"23"7	i)I$8$8$=$=)!&*H **#mX%>>>$|X&>>>
f}F*63D3DS3I3IS!u:?s"BE"BBB$|xx5H&III

6( #/ 	/ s=   -
F;F/F 
F&%F&AH 
H I)H<<Ir   c                 d    [         R                  " SSU R                  5       5      nU=(       d    S$ )Nz[^A-Za-z0-9._-]r\   r<   )r   r   r   )r   	sanitizeds     r#   sanitize_namer   j  s&    )3

=I  r%   repo_urlc                 ^   U R                  S5      (       a  U S S n SU ;   a,  U R                  S5      (       a  U R                  SS5      S   nO[        U 5      R                  =(       d    U nUR                  S5      S   nUR                  S5      (       a  US S n[        U=(       d    S5      $ )	NrI   r   r[   r  rT   r   r   r   )r   rL  r   r	   r   r   )r  r  	candidates      r#   derive_repo_base_namer  o  s    CR=
h8..v66NN3*1-	X&++7x	$R(I&!!crN	2l33r%   r   c                      [        U 5      R                  5       R                  n[        U=(       d    S5      $ ! [        [        4 a    [        U 5      R                  n N;f = f)N	workspace)r   rM  r   rK  r  r   )r   r_  s     r#   derive_local_base_namer    sV    #H~%%',, ,-- \" #H~""#s   #9 %A! A!c                     0 nU  Hv  nUS   nUS   nS nUS:X  a  [        US   5      nO!US:X  a  [        UR                  SS5      5      nUc  MJ  UR                  US5      S	-   nXaU'   US	:X  a  UOU S
U 3nXtS'   Mx     g )Nr   r   r   r   r   r   localr   rT   r\   r   )r  r  r!   )r   name_countsr<   r   r   	base_namer*   r   s           r#   assign_workspace_subdirsr    s    "$KVn# $	,&-gm.DEIL(.w{{='/RSI	1-1!&I(-
99+Qug8N&6"#% r%   c                 8    [        S U =(       d    /  5       5      $ )zETrue iff any target is a local source tree (whitebox / source-aware).c              3   H   #    U  H  oR                  S 5      S:H  v   M     g7f)r   r   Nr    )r"  ts     r#   r#  #is_whitebox_scan.<locals>.<genexpr>  s     I6HuuV},6Hs    "r,  )r   s    r#   is_whitebox_scanr    s    Il6Hb6HIIIr%   c                     / nU  Hk  nUS   nUR                  S5      nUS   S:X  a  SU;   a  UR                  US   US.5        MA  US   S:X  d  ML  SU;   d  MT  UR                  US   US.5        Mm     U$ )	Nr   r   r   r   r   )r   r   r   cloned_repo_path)r!   rc   )r   r  target_infor   r   s        r#   collect_local_sourcesr    s    *,M#i(";;'9:v,.=G3K  #*=#9(8  L05G75R  #*+=#>(8 $( r%   hostc                 L   U R                  5       R                  S5      nUS;   a  g [        R                  " U5      n[	        U[        R
                  5      (       a  UR                  $ [	        U[        R                  5      (       a  UR                  $  g! [         a     gf = f)Nz[])	localhostz0.0.0.0z::1TF)	rd   r   r  r   r   IPv4Addressis_loopbackIPv6Addressr   )r  
host_lowerips      r#   _is_localhost_hostr    s    ##D)J44!!*-b)//00>>!b)//00>>! 1
   s   A B )*B 
B#"B#host_gatewayc                    SSK Jn  U  H  nUR                  S5      nUR                  S0 5      nUS:X  ai  UR                  SS5      n U" U5      nUR
                  (       a;  [        UR
                  5      (       a  [        UR                  U5      5      US'   M  M  M  US:X  d  M  UR                  S	S5      nU(       d  M  [        U5      (       d  M  XS	'   M     g ! [        [        4 a     M  f = f)
Nr   )URLr   r   r   r   r6   r   r   )	yarlr!  r!   r   r   r  r  r0   	with_host)	r   r  r!  r  r   r   r   r   r   s	            r#   rewrite_localhost_targetsr$    s    #!oof-//)R0++ \26J*o xx.sxx88(+CMM,,G(H% 9x L(K4Iy/	::'3$# $ 	* s   CC0/C0run_name	dest_namec           	         [        5       n[        R                  " S5      nUc  [        S5      e[	        [
        R                  " 5       5      S-  U-  nUR                  SSS9  U(       a  UnO@U R                  S5      (       a  [	        U 5      R                  O[	        U 5      R                  nXV-  nUR                  5       (       a  [        R                  " U5         UR                  SU  S3S	S
9   [        R                  " USU [!        U5      /SSSS9  S S S 5        [!        UR#                  5       5      $ ! , (       d  f       N'= f! [        R$                   a  n['        5       n	U	R)                  SSS9  U	R)                  SSS9  U	R)                  SU  S3SS9  U	R)                  S[+        US5      (       a  UR,                  (       a  UR,                  O
[!        U5       3SS9  [/        U	SSSSS9n
UR1                  S5        UR1                  U
5        UR1                  5         [2        R4                  " S5         S nAg S nAf[         a    ['        5       n	U	R)                  SSS9  U	R)                  SSS9  U	R)                  SSS9  U	R)                  SSS9  [/        U	SSSSS9n
UR1                  S5        UR1                  U
5        UR1                  5         [2        R4                  " S5         g f = f) Nr  z Git executable not found in PATHstrix_reposT)parentsexist_okr   z[bold cyan]Cloning repository z...dots)spinnercloner  zREPOSITORY CLONE FAILEDru   r7   r9   r   zCould not clone repository: rM   zError: r  zdim red[bold white]STRIXleftredrT   r   r5   title_alignborder_stylepaddingrT   zGIT NOT FOUNDz/Git is not installed or not available in PATH.
z*Please install Git to clone repositories.
)r   shutilwhichFileNotFoundErrorr   tempfile
gettempdirmkdirr   stemr   rH  rmtreer   r  r  r0   absoluteCalledProcessErrorr   rc   r   r  r   printsysexit)r  r%  r&  consolegit_executabletemp_dirr  
clone_pathr  
error_textpanels              r#   clone_repositoryrI    s   iG\\%(N BCCH'')*]:XEHNN4$N/	+3+<+<V+D+DDN''$x.J]J]	%Jj!5^^<XJcJTZ^[NN"
O	  $
 \ :&&()) \[ (( V
3:F&08
"EWU'!X"6"6188ahhQPQYb 	 	
 %
 	de V
/<&0LT[\GwW%
 	de#s8   E 1%D7 E 7
EE K-CH>>B,K-,K-c            	      J    [         R                  " 5       $ ! [         a    [        5       n [	        5       nUR                  SSS9  UR                  SSS9  UR                  SSS9  UR                  SSS9  [        USS	S
SS9nU R                  SUS5        [        S5      S ef = f)NzDOCKER NOT AVAILABLEru   r7   r9   r   z!Cannot connect to Docker daemon.
zTPlease ensure Docker Desktop is installed and running, and try running strix again.
r.  r/  r0  r1  r2  rM   zDocker not available)	dockerfrom_envr   r   r   rc   r   r@  r  )rC  rG  rH  s      r#   check_docker_connectionrM  3  s    =   =)V
0
C&0>gNc 	 	

 %
 	dE4(12<'=s
    BB"client
image_namec                 \     U R                   R                  U5        g! [         a     gf = f)NTF)imagesr!   r   )rN  rO  s     r#   image_existsrR  L  s2    *%   s    
++layers_infolayer_idlayer_statusc                 p    SU;   d  SU;   a  SX'   g SU;   a  SX'   g SU;   a  SX'   g SU;   a  S	X'   g S
X'   g )NzPull completezAlready exists   ✓Downloadingu   ↓
Extractingu   📦Waitingu   ⏳u   •r(   )rS  rT  rU  s      r#   update_layer_statusr[  U  sR    ,&*:l*J %	,	& %		% &	l	" % %r%   liner   last_updatec                    SU ;   an  SU ;   ah  U S   n[        XU S   5        [        S UR                  5        5       5      n[        U5      nUS:  a!  SU SU S3nXs:w  a  UR	                  U5        U$ U$ SU ;   aT  SU ;  aN  U S   nSU;   a  UR	                  S	5        U$ S
U;   a  UR	                  S5        U$ SU;   a  UR	                  S5        U$ )Nidr   c              3   4   #    U  H  oS :X  d  M
  Sv   M     g7f)rW  rT   Nr(   )r"  vs     r#   r#  $process_pull_line.<locals>.<genexpr>i  s     F#7a:#7s   		r   z[bold cyan]Progress: rI   z layers completezPulling fromz%[bold cyan]Fetching image manifest...zDigest:z[bold cyan]Verifying image...zStatus:z[bold cyan]Finalizing...)r[  r  valuesr{   update)	r\  rS  r   r]  rT  	completedtotal
update_msgglobal_statuss	            r#   process_pull_lineri  b  s     t|D(:K4>BF;#5#5#7FF	K 1901UGCSTJ(j)!!  
T	d$.X]*MMAB  -'MM9:  -'MM45r%   config_pathc                 N   [        5       n[        U 5      nUR                  5       (       d*  UR                  SU  35        [        R
                  " S5        UR                  S:w  a'  UR                  S5        [        R
                  " S5         UR                  SSS9 n[        R                  " U5      nS S S 5        [        W[        5      (       d'  UR                  S	5        [        R
                  " S5        S
U;  d$  [        UR                  S
5      [        5      (       d'  UR                  S5        [        R
                  " S5        U$ ! , (       d  f       N= f! [        R                   a4  nUR                  SU 35        [        R
                  " S5         S nANS nAff = f)Nz+[bold red]Error:[/] Config file not found: rT   z.jsonz4[bold red]Error:[/] Config file must be a .json filerrD  rE  z1[bold red]Error:[/] Invalid JSON in config file: z:[bold red]Error:[/] Config file must contain a JSON objectr  z9[bold red]Error:[/] Config file must have an 'env' object)r   r   rH  r@  rA  rB  suffixopenra  loadrc  r   r   r!   )rj  rC  r   fdatar  s         r#   validate_config_filerr  ~  s)   iGD;;==CK=QR{{gLMYYsWY-99Q<D . dD!!RSD
488E?D A AQRK .- I!MNs6   E E4E 
EE E F$0*FF$)    r   )T)hr  ra  r  r   r   r6  r  rA  r9  dataclassesr   r   pathlibr   typingr   urllib.errorr   r   urllib.parser	   urllib.requestr
   r   rK  docker.errorsr   r   rich.consoler   
rich.panelr   	rich.textr   strix.configr   r0   r$   r   r)   r2   r   rq   r   r   r/   r   r   r   r  r   r   r   r   r   r   r   r   r  _MAX_FILES_PER_SECTIONr   r   r
  CompletedProcessr  bytesr  r/  r8  r@  rR  rV  rY  r[  rg  rp  ru  ry  r  r  r  r  tupler  r  r  r  r  r  r  r   r  r  r  r  r  r  r$  rI  rM  rR  r[  ri  rr  r(   r%   r#   <module>r     s     	 	    
  (   , ! +  8     &4 4 4	u 	 	edl s QS#X Q4 Qh# 4 # s # t # L4S 4T#s(^ 4T#s(^ # # 'tCH~ 'C 'E ')c3h )S )S )S ) 	&;&;&; 	&;
 
&;R  ( ( (Vs t :  c $&Dc3h4H44O $&TW $&N%Dc3h$84$? %3 % 2   " " " 
 
 
@ ; ; ; 599-1  % 599-1  'DcN t 
DcN 
t 
ND NT N
  ,"t "# "$ "
 t  cDj  S4Z  $sCx. S4Z (D tCH~ #PT* & #* 4S> VY < t (U (tI (Vd3i s3x s t 7DO 7S#X 7v (>#9#!$#
49d?#B$m)< B$ B$JS#X':>EI#s(^	4@cN@'*Tz@8<S#X@@P "&RS#X'RR TzR 	R
 
c3h$	R Rj	3 	4 	Ac AeCc3h,?&@ AH! ! !
4C 4C 4 .S .S .74S#X+? 7D 70J4S#X#7 JD J
T#s(^(< d3PS8nAU 4S T $4Dc3h,@ 4PS 4X\ 4.Is Ic IcDj ITW IX= =2 # $ 
&T#s(^ 
&s 
&RU 
&Z^ 
&
sCx.'+CH~?BQT8c d r%   