
    +j9                        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	  S SK
Jr  S SKJr  S SKJrJrJr  S SKJr  S SKJr  S SKrS SKJr  S S	KJrJr  S S
KJr  S SKrS r S\!S\"\#\#\#4   4S jr$S\!S\%4S jr&S r'/ r(S r)S r*Sr+ " S S\5      r, " S S\5      r-\	 " S S5      5       r.S\-S\!SS4S jr/ " S S5      r0g)    N)	dataclass)cached_property)Path)Dict	TypedDictOptional)webversion)NotRequired) get_missing_requirements_messageget_required_packages_versions)DEFAULT_VERSION_STRINGc                  :    S[        5        S3R                  5       $ )N
zo

The ComfyUI frontend is shipped in a pip package so it needs to be updated separately from the ComfyUI code.
)r   strip     7/home/wildlama/comfy/ComfyUI/app/frontend_management.py frontend_install_warning_messager      s(    !# $ % 
EG	r   r   returnc                 T    [        [        [        U R                  " S5      5      5      $ )N.)tuplemapintsplitr
   s    r   parse_versionr       s    SgmmC0122r   c                 D    Sn[        [        R                  " X5      5      $ )z@Validate if a string is a valid semantic version (X.Y.Z format).z^(\d+)\.(\d+)\.(\d+)$)boolrematch)r   patterns     r   is_valid_versionr$   #   s    &G*++r   c                  6    [        5       R                  SS 5      $ )Nzcomfyui-frontend-packager   getr   r   r   get_required_frontend_versionr(   (   s    )+//0JDQQr   c                  T   [         (       a  [         R                  5       $ [         n [        5       =(       d    0 R                  5        H=  u  pUR	                  S5      (       d  M   [        U5      nU R                  XUS.5        M?     U R                  5       $ ! [         a    Sn N6f = f)NList installed/required versions for every comfy* package in requirements.txt.comfyN)name	installedrequired)COMFY_PACKAGE_VERSIONScopyr   items
startswithr   	Exceptionappend)outr,   r.   r-   s       r   get_comfy_package_versionsr6   -   s    %**,,
 C9;ArHHJw''	I 	

DhOP K 88:  	I	s   %BB'&B'c                  B   SSK Jn Jn  / n[        5        Hw  nUS   nUS   nU(       a  U(       d  M   U" U5      U" U5      :  nU(       a  UR                  US   XE45        MN  [        R                  " S	R                  US   U5      5        My     U(       aU  S
R                  S U 5       5      n[        R                  R                  SU S[        5        S3R                  5       5        gg! U  a+  n[        R
                  " SUS    SU 35         SnAGM  SnAff = f)zPWarn for every comfy* package whose installed version is below requirements.txt.r   )InvalidVersionparser-   r.   zFailed to check r,   z
 version: Nz{} version: {}r   c              3   @   #    U  H  u  pnS U SU SU S3v   M     g7f)z
Installed z	 version z' is lower than the recommended version r   Nr   ).0r,   r-   r.   s       r   	<genexpr>0check_comfy_packages_versions.<locals>.<genexpr>R   s5      %
->) i	{2YZbYccde->s   zs
________________________________________________________________________
WARNING WARNING WARNING WARNING WARNING

z

zJ
________________________________________________________________________
)packaging.versionr8   r9   r6   loggingerrorr4   infoformatjoinapploggerlog_startup_warningr   r   )	r8   parse_pep440outdated_packagespkginstalled_strrequired_stroutdatedepackage_warningss	            r   check_comfy_packages_versionsrO   =   s!   G)+K(:L	#M2\,5OOH $$c&k=%OPLL)00VmLM , 99 %
->%
 
 	

&&   !# $ % 
EG
	
   	MM,S[MA3GH	s   C--D3DD
   c                        \ rS rSr% \\S'   Srg)Assetf   urlr   N)__name__
__module____qualname____firstlineno__str__annotations____static_attributes__r   r   r   rR   rR   f   s    	Hr   rR   c                   r    \ rS rSr% \\S'   \\S'   \\S'   \\S'   \\S'   \\S'   \\S'   \\	\
      \S	'   S
rg)Releasej   idtag_namer,   
prerelease
created_atpublished_atbodyassetsr   N)rU   rV   rW   rX   r   rZ   rY   r    r   listrR   r[   r   r   r   r]   r]   j   s6    GM
IO
IU$$r   r]   c                       \ rS rSr% \\S'   \\S'   \S\4S j5       r\S\4S j5       r\	S\
\   4S j5       r\	S\4S j5       r\	S\4S	 j5       rS
\S\4S jrSrg)FrontEndProvideru   ownerrepor   c                 8    U R                    SU R                   3$ )N_rj   rk   selfs    r   folder_nameFrontEndProvider.folder_namez   s    **Qtyyk**r   c                 <    SU R                    SU R                   S3$ )Nzhttps://api.github.com/repos//z	/releasesrn   ro   s    r   release_urlFrontEndProvider.release_url~   s    .tzzl!DII;iPPr   c                    / nU R                   nU(       av  [        R                  " U[        S9nUR	                  5         UR                  UR                  5       5        SUR                  ;   a  UR                  S   S   nOS nU(       a  Mv  U$ )NtimeoutnextrT   )ru   requestsr'   REQUEST_TIMEOUTraise_for_statusextendjsonlinks)rp   releasesapi_urlresponses       r   all_releasesFrontEndProvider.all_releases   su    ""||G_EH%%'OOHMMO,'"..07 g r   c                     U R                    S3n[        R                  " U[        S9nUR	                  5         UR                  5       $ )Nz/latestrx   )ru   r{   r'   r|   r}   r   )rp   latest_release_urlr   s      r   latest_releaseFrontEndProvider.latest_release   s?     $ 0 019<< 2OL!!#}}r   c                     U R                    Vs/ s H  oS   (       d  M  UPM     snnU(       d  [        S5      eUS   $ s  snf )zOGet the latest pre-release version - even if it's older than the latest releasera   zNo pre-releases foundr   )r   
ValueError)rp   releases     r   latest_prerelease"FrontEndProvider.latest_prerelease   sF     +/*;*;U*;w|?T7*;U455 qz Vs
   A A r   c                     US:X  a  U R                   $ US:X  a  U R                  $ U R                   H  nUS   USU 34;   d  M  Us  $    [        SU S35      e)Nlatestra   r`   vzVersion z not found in releases)r   r   r   r   )rp   r   r   s      r   get_releaseFrontEndProvider.get_release   sn    h&&&$))),,:&7ayM*BB"N - xy0FGHHr   r   N)rU   rV   rW   rX   rY   rZ   propertyrq   ru   r   rf   r]   r   r   r   r   r[   r   r   r   rh   rh   u   s    J
I+S + + QS Q Q d7m      7  	I3 	I7 	Ir   rh   r   destination_pathc                    SnU R                  S/ 5       H  nUS   S:X  d  M  US   n  O   U(       d  [        S5      e[        R                  " 5        nSS0n[        R                   " X%S	[
        S
9nUR                  5         UR                  UR                  5        UR                  S5        [        R                  " US5       nUR                  U5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       g= f)z&Download dist.zip from github release.Nre   r,   zdist.ziprT   z(dist.zip not found in the release assetsAcceptzapplication/octet-streamT)headersallow_redirectsry   r   r)r'   r   tempfileTemporaryFiler{   r|   r}   writecontentseekzipfileZipFile
extractall)r   r   	asset_urlassettmp_filer   r   zip_refs           r   download_release_asset_zipr      s    IXr*=J&eI +
 CDD 
			!X78<<o
 	!!# 	x''( 	a __Xs+w/0 , 
"	! ,+ 
"	!s%   A2C9C(C9(
C6	2C99
Dc                      \ rS rSr\" \" \5      R                  S   S-  5      r\	S\4S j5       r
\	S\4S j5       r\	S\4S j5       r\	S 5       r\	S\4S	 j5       r\	S\\\\4      4S
 j5       r\	S\\   4S j5       r\	S\4S j5       r\	S\S\\\\4   4S j5       r\	 SS\S\\   S\4S jj5       r\	S\S\4S j5       r\	S 5       rSrg)FrontendManager      web_custom_versionsr   c                     [        5       $ )z*Get the required frontend package version.)r(   clss    r   r(   -FrontendManager.get_required_frontend_version   s     -..r   c                 >     [        S5      nU$ ! [         a     gf = f)z?Get the currently installed workflow templates package version.comfyui-workflow-templatesN)r   r3   )r   templates_version_strs     r   get_installed_templates_version/FrontendManager.get_installed_templates_version   s+    	$+,H$I!(( 		s    
c                 6    [        5       R                  SS 5      $ )Nr   r&   r   s    r   get_required_templates_version.FrontendManager.get_required_templates_version   s    -/334PRVWWr   c                     [        5       $ )r*   )r6   r   s    r   r6   *FrontendManager.get_comfy_package_versions   s     *++r   c                     SS K n[        [        R                  R	                  U5      S-  5      $ ! [
         aI    [        R                  " S[        5        S3R                  5       5        [        R                  " S5         g f = f)Nr   staticzK
********** ERROR ***********

comfyui-frontend-package is not installed.



********** ERROR ***********
)comfyui_frontend_packagerY   	importlib	resourcesfilesImportErrorr?   r@   r   r   sysexit)r   r   s     r   default_frontend_path%FrontendManager.default_frontend_path   sw    	+y**001IJXUVV 	MM
 "# $ % 
EG
 HHRL	s   .1 ABBc                 F    SSK JnJn   [        U" 5       5      n0 n U H?  nUR                   H,  nU" UR                  UR                  5      XWR                  '   M.     MA     U(       d  [        R
                  " S5        gU$ ! [         a3    [        R
                  " S[        5        S3R                  5       5         gf = f! [         a#  n[        R
                  " SU 35         SnAgSnAff = f! [         a#  n[        R
                  " SU 35         SnAgSnAff = f)	zAReturn a mapping of template asset names to their absolute paths.r   )get_asset_pathiter_templatesM
********** ERROR ***********

comfyui-workflow-templates is not installed.

r   Nz(Failed to enumerate workflow templates: z(Failed to resolve template asset paths: zFNo workflow template assets found. Did the packages install correctly?)comfyui_workflow_templatesr   r   r   r?   r@   r   r   rf   r3   re   template_idfilename)r   r   r   template_entriesexc	asset_mapentryr   s           r   template_asset_map"FrontendManager.template_asset_map   s   	$	#N$45
 %'		)"\\E0>))5>>1Inn- * * MMbcG  	MM
 "# $ % 
EG
 	   	MMDSEJK	  	MMDSEJK	s@   B C AC3 :C ?C 
C0C++C03
D =DD c                      SSK n[        [        R                  R	                  U5      S-  5      $ ! [
         a3    [        R                  " S[        5        S3R                  5       5         gf = f)zFReturn the legacy templates directory shipped inside the meta package.r   N	templatesr   r   )
r   rY   r   r   r   r   r?   r@   r   r   )r   r   s     r   legacy_templates_path%FrontendManager.legacy_templates_path)  sv    	-##))*DES   	MM
 "# $ % 
EG
 	s   .1 :A.-A.c                      SSK n[        [        R                  R	                  U5      S-  5      $ ! [
         a    [        R                  " S5         gf = f)z&Get the path to embedded documentationr   Ndocsz'comfyui-embedded-docs package not found)comfyui_embedded_docsrY   r   r   r   r   r?   rA   )r   r   s     r   embedded_docs_path"FrontendManager.embedded_docs_path@  sR    	(##))*?@6I   	LLBC	s   .1  AAvaluec                     Sn[         R                  " X!5      nUc  [        R                  " SU 35      eUR	                  S5      UR	                  S5      UR	                  S5      4$ )z
Args:
    value (str): The version string to parse.

Returns:
    tuple[str, str]: A tuple containing provider name and version.

Raises:
    argparse.ArgumentTypeError: If the version string is invalid.
zf^([a-zA-Z0-9][a-zA-Z0-9-]{0,38})/([a-zA-Z0-9_.-]+)@(v?\d+\.\d+\.\d+[-._a-zA-Z0-9]*|latest|prerelease)$zInvalid version string: r         )r!   r"   argparseArgumentTypeErrorgroup)r   r   VERSION_PATTERNmatch_results       r   parse_version_string$FrontendManager.parse_version_stringM  sf     Dxx7,,/Gw-OPP!!!$l&8&8&;\=O=OPQ=RRRr   Nversion_stringproviderc           	      z   U[         :X  a  [        5         U R                  5       $ U R                  U5      u  p4nUR                  " S5      (       a~  [        [        U R                  5      U SU 3-  UR                  " S5      -  5      n[        R                  R                  U5      (       a!  [        R                  " SU SU SU 35        U$ [        R                  " SU SU SU S35        U=(       d    [        X45      nUR                  U5      nUS   R                  S5      n[        [        U R                  5      UR                   -  U-  5      n	[        R                  R                  U	5      (       d   [        R"                  " U	S	S
9  [        R                  " SUR                   UU	5        [        R$                  " U5        ['        XyS9  [        R(                  " U	5      (       d  [        R*                  " U	5        U	$ U	$ ! [        R(                  " U	5      (       d  [        R*                  " U	5        f f = f)a  
Initializes the frontend for the specified version.

Args:
    version_string (str): The version string.
    provider (FrontEndProvider, optional): The provider to use. Defaults to None.

Returns:
    str: The path to the initialized frontend.

Raises:
    Exception: If there is an error during the initialization process.
    main error source might be request timeout or invalid URL.
r   rm   z6Using existing copy of specific frontend version tag: rt   @zInitializing frontend: z+, requesting version details from GitHub...r`   T)exist_okz,Downloading frontend(%s) version(%s) to (%s))r   )r   rO   r   r   r2   rY   r   CUSTOM_FRONTENDS_ROOTlstripospathexistsr?   rA   rh   r   rq   makedirsdebugr   listdirrmdir)
r   r   r   
repo_owner	repo_namer   expected_pathr   semantic_versionweb_roots
             r   init_frontend_unsafe$FrontendManager.init_frontend_unsafe`  s   $ 33)+,,..),)A)A.)Q&
wc""S../L)-...%&M
 ww~~m,,LZLXYZcYddefmeno %$%j\9+QwiGrs	
 F/
F&&w/":.55c:**+h.B.BBEUU
 ww~~h'''Ht4B(($	 g&*7N zz(++HHX&x zz(++HHX& ,s   :AH 4H:c                      U R                  U5      $ ! [         aQ  n[        R                  " SU5        [        R                  " S5        [        5         U R                  5       s SnA$ SnAff = f)z
Initializes the frontend with the specified version string.

Args:
    version_string (str): The version string to initialize the frontend with.

Returns:
    str: The path of the initialized frontend.
z!Failed to initialize frontend: %sz%Falling back to the default frontend.N)r   r3   r?   r@   rA   rO   r   )r   r   rM   s      r   init_frontendFrontendManager.init_frontend  sY    	/++N;; 	/MM=qALL@A)+,,..		/s    
A.AA)#A.)A.c                    ^ U R                  5       mT(       d  g S[        R                  S[        R                  4U4S jjnU$ )Nrequestr   c                    >#    U R                   R                  SS5      nTR                  U5      nUc  [        R                  " 5       e[        R                  " U5      $ 7f)Nr    )
match_infor'   r	   HTTPNotFoundFileResponse)r  rel_pathtargetre   s      r   serve_template>FrontendManager.template_asset_handler.<locals>.serve_template  sQ     ))--fb9HZZ)F~&&((##F++s   AA)r   r	   RequestStreamResponse)r   r
  re   s     @r   template_asset_handler&FrontendManager.template_asset_handler  s<    '')	,#++ 	,#:L:L 	, r   r   )N)rU   rV   rW   rX   rY   r   __file__parentsr   classmethodr(   r   r   r6   r   r   r   r   r   r   r   r   rh   r   r   r  r[   r   r   r   r   r      s   X 6 6q 9<Q QR/c / /    Xs X X , , c  & *8DcN#; * *Z hsm  , 
3 
 
 S SsC}1E S S$ IM> >,45E,F>	> >@ /3 /3 / /"  r   r   )1r   r?   r   r!   r   r   r   r   dataclassesr   	functoolsr   pathlibr   typingr   r   r   aiohttpr	   importlib.metadatar   r{   typing_extensionsr   utils.install_utilr   r   comfy.cli_argsr   
app.loggerrD   r   rY   r   r   r   r    r$   r(   r/   r6   rO   r|   rR   r]   rh   r   r   r   r   r   <module>r     s      	 	 
    ! %  , ,  &  ) _ 1 33 35c3#7 3,c ,d ,
R   #
L I %i % 6I 6I 6Ir1 13 14 1<s sr   