
    +j9                        d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZ d dlmZ d dlmZmZmZ d dlmZ d dlmZ d dlZd dlmZ d d	lmZmZ d d
lmZ d dlZd Z de!de"e#e#e#f         fdZ$de!de%fdZ&d Z'g Z(d Z)d Z*dZ+ G d de          Z, G d de          Z-e	 G d d                      Z.de-de!ddfdZ/ G d d          Z0dS )    N)	dataclass)cached_property)Path)Dict	TypedDictOptional)webversion)NotRequired) get_missing_requirements_messageget_required_packages_versions)DEFAULT_VERSION_STRINGc                  J    dt                       d                                S )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/    !##   
EGG	r   r   returnc                 b    t          t          t           | j        d                              S )N.)tuplemapintsplitr
   s    r   parse_versionr       s&    SmgmC0011222r   c                 J    d}t          t          j        ||                     S )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                  F    t                                          dd           S )Nzcomfyui-frontend-packager   getr   r   r   get_required_frontend_versionr(   (   s    )++//0JDQQQr   c                  l   t           rt                                           S t           } t                      pi                                 D ]W\  }}|                    d          s	 t          |          }n# t          $ r d}Y nw xY w|                     |||d           X|                                 S )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J Q Qhw'' 		II 	 	 	III	

DyhOOPPPP88::s   &A66BBc                  j   ddl m} m} g }t                      D ]}|d         }|d         }|r|s	  ||           ||          k     }n2# | $ r*}t	          j        d|d          d|            Y d}~[d}~ww xY w|r|                    |d         ||f           t	          j        d	                    |d         |                     |red
	                    d |D                       }t          j                            d| dt                       d                                           dS dS )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   6   K   | ]\  }}}d | d| d| dV  dS )z
Installed z	 version z' is lower than the recommended version r   Nr   ).0r,   r-   r.   s       r   	<genexpr>z0check_comfy_packages_versions.<locals>.<genexpr>R   sY       %
 %
)i fee	eeZbeee%
 %
 %
 %
 %
 %
r   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_versionsrN   =   s   GGGGGGGG)++ N NK(: 	L 		#|M22\\,5O5OOHH 	 	 	MGS[GGAGGHHHHHHH	  	N$$c&k=,%OPPPPL)00VmLLMMMM 
99 %
 %
->%
 %
 %
 
 
 	
&& 	  "##   
EGG
	
 
	
 
	
 
	
 
	

 
s   A

A9 A44A9
   c                       e Zd ZU eed<   dS )AsseturlN)__name__
__module____qualname__str__annotations__r   r   r   rQ   rQ   f   s         	HHHHHr   rQ   c                   x    e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eed<   eee	                  ed<   d	S )
Releaseidtag_namer,   
prerelease
created_atpublished_atbodyassetsN)
rS   rT   rU   r   rW   rV   r    r   listrQ   r   r   r   rY   rY   j   sl         GGGMMM
IIIOOO
IIIU$$$$$$r   rY   c                       e Zd ZU eed<   eed<   edefd            Zedefd            Zede	e
         fd            Zede
fd            Zede
fd            Zd	ede
fd
ZdS )FrontEndProviderownerrepor   c                 $    | j          d| j         S )N_rd   re   selfs    r   folder_namezFrontEndProvider.folder_namez   s    ***ty***r   c                 (    d| j          d| j         dS )Nzhttps://api.github.com/repos//z	/releasesrh   ri   s    r   release_urlzFrontEndProvider.release_url~   s    PtzPPDIPPPPr   c                 
   g }| j         }|rwt          j        |t                    }|                                 |                    |                                           d|j        v r|j        d         d         }nd }|w|S )NtimeoutnextrR   )rn   requestsr'   REQUEST_TIMEOUTraise_for_statusextendjsonlinks)rj   releasesapi_urlresponses       r   all_releaseszFrontEndProvider.all_releases   s    " 	|G_EEEH%%'''OOHMMOO,,,''".07  	 r   c                     | j          d}t          j        |t                    }|                                 |                                S )Nz/latestrp   )rn   rs   r'   rt   ru   rw   )rj   latest_release_urlr{   s      r   latest_releasezFrontEndProvider.latest_release   sI     $ 0999< 2OLLL!!###}}r   c                 V    d | j         D             }|st          d          |d         S )zOGet the latest pre-release version - even if it's older than the latest releasec                 "    g | ]}|d          
|S )r\   r   )r;   releases     r   
<listcomp>z6FrontEndProvider.latest_prerelease.<locals>.<listcomp>   s"    UUUww|?TU7UUUr   zNo pre-releases foundr   )r|   
ValueError)rj   r   s     r   latest_prereleasez"FrontEndProvider.latest_prerelease   s>     VU$*;UUU 	64555 qzr   r   c                     |dk    r| j         S |dk    r| j        S | j        D ]}|d         |d| fv r|c S t          d| d          )Nlatestr\   r[   vzVersion z not found in releases)r   r   r|   r   )rj   r   r   s      r   get_releasezFrontEndProvider.get_release   s    h&&$$)), # #:&7MMM*BBB"NNN CGGGGHHHr   N)rS   rT   rU   rV   rW   propertyrk   rn   r   ra   rY   r|   r   r   r   r   r   r   rc   rc   u   s        JJJ
III+S + + + X+ QS Q Q Q XQ d7m    _     _ 7    _	I3 	I7 	I 	I 	I 	I 	I 	Ir   rc   r   destination_pathc                 .   d}|                      dg           D ]}|d         dk    r
|d         } n|st          d          t          j                    5 }ddi}t	          j         ||d	t
          
          }|                                 |                    |j                   |	                    d           t          j        |d          5 }|                    |           ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )z&Download dist.zip from github release.Nr`   r,   zdist.ziprR   z(dist.zip not found in the release assetsAcceptzapplication/octet-streamT)headersallow_redirectsrq   r   r)r'   r   tempfileTemporaryFilers   rt   ru   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E '  ECDDD 
		!	! 1X78<wo
 
 
 	!!### 	x'((( 	a _Xs++ 	1w/000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1s7   A:D
C2&D
2C6	6D
9C6	:D

DDc                      e Zd Z e ee          j        d         dz            Zedefd            Z	edefd            Z
edefd            Zed             Zedefd            Zedeeeef                  fd	            Zedee         fd
            Zedefd            Zededeeeef         fd            Ze	 ddedee         defd            Zededefd            Zed             ZdS )FrontendManager   web_custom_versionsr   c                     t                      S )z*Get the required frontend package version.)r(   clss    r   r(   z-FrontendManager.get_required_frontend_version   s     -...r   c                 H    	 t          d          }|S # t          $ r Y dS w xY w)z?Get the currently installed workflow templates package version.comfyui-workflow-templatesN)r   r3   )r   templates_version_strs     r   get_installed_templates_versionz/FrontendManager.get_installed_templates_version   s>    	$+,H$I$I!(( 	 	 	44	s    
!!c                 F    t                                          dd           S )Nr   r&   r   s    r   get_required_templates_versionz.FrontendManager.get_required_templates_version   s     -//334PRVWWWr   c                     t                      S )r*   )r6   r   s    r   r6   z*FrontendManager.get_comfy_package_versions   s     *+++r   c                     	 dd l }t          t          j                            |          dz            S # t
          $ rN t          j        dt                       d	                                           t          j        d           Y d S w xY w)Nr   staticzK
********** ERROR ***********

comfyui-frontend-package is not installed.



********** ERROR ***********
)comfyui_frontend_packagerV   	importlib	resourcesfilesImportErrorr>   r?   r   r   sysexit)r   r   s     r   default_frontend_pathz%FrontendManager.default_frontend_path   s    	++++y*001IJJXUVVV 	 	 	M
 "##   
EGG
 
 
 HRLLLLLL	s   25 ABBc                 (   	 ddl m}m} nG# t          $ r: t	          j        dt                       d                                           Y dS w xY w	 t           |                      }n/# t          $ r"}t	          j        d|            Y d}~dS d}~ww xY wi }	 |D ]*}|j
        D ] } ||j        |j                  ||j        <   !+n/# t          $ r"}t	          j        d|            Y d}~dS d}~ww xY w|st	          j        d           dS |S )	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   ra   r3   r`   template_idfilename)r   r   r   template_entriesexc	asset_mapentryr   s           r   template_asset_mapz"FrontendManager.template_asset_map   s   	          	 	 	M
 "##   
EGG
 
 
 44		#NN$4$455 	 	 	MJSJJKKK44444	 %'		)  "\  E0>)5>1 1Ien--
  	 	 	MJSJJKKK44444	  	Mbccc4s@    A AAA+ +
B5BB-C 
C7C22C7c                     	 ddl }t          t          j                            |          dz            S # t
          $ r: t          j        dt                       d	                                           Y dS w xY w)zFReturn the legacy templates directory shipped inside the meta package.r   N	templatesr   r   )
r   rV   r   r   r   r   r>   r?   r   r   )r   r   s     r   legacy_templates_pathz%FrontendManager.legacy_templates_path)  s    	----#))*DEES    	 	 	M
 "##   
EGG
 
 
 44	s   25 A A98A9c                     	 ddl }t          t          j                            |          dz            S # t
          $ r t          j        d           Y dS w xY w)z&Get the path to embedded documentationr   Ndocsz'comfyui-embedded-docs package not found)comfyui_embedded_docsrV   r   r   r   r   r>   r@   )r   r   s     r   embedded_docs_pathz"FrontendManager.embedded_docs_path@  st    	((((#))*?@@6I    	 	 	LBCCC44	s   25 AAvaluec                     d}t          j        ||          }|t          j        d|           |                    d          |                    d          |                    d          fS )a  
        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)$NzInvalid version string: r         )r!   r"   argparseArgumentTypeErrorgroup)r   r   VERSION_PATTERNmatch_results       r   parse_version_stringz$FrontendManager.parse_version_stringM  ss     Dx77,-O-O-OPPP!!!$$l&8&8&;&;\=O=OPQ=R=RRRr   Nversion_stringproviderc           	      V   |t           k    r"t                       |                                 S |                     |          \  }}} |j        d          rxt          t          | j                  | d| z   |j        d          z            }t          j
                            |          rt          j        d| d| d|            |S t          j        d| d| d| d           |pt          ||          }|                    |          }|d                             d          }t          t          | j                  |j        z  |z            }	t          j
                            |	          s	 t          j        |	d	
           t          j        d|j        ||	           t          j        |           t'          ||	           t          j        |	          st          j        |	           n.# t          j        |	          st          j        |	           w w xY w|	S )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   rg   z6Using existing copy of specific frontend version tag: rm   @zInitializing frontend: z+, requesting version details from GitHub...r[   T)exist_okz,Downloading frontend(%s) version(%s) to (%s))r   )r   rN   r   r   r2   rV   r   CUSTOM_FRONTENDS_ROOTlstripospathexistsr>   r@   rc   r   rk   makedirsdebugr   listdirrmdir)
r   r   r   
repo_owner	repo_namer   expected_pathr   semantic_versionweb_roots
             r   init_frontend_unsafez$FrontendManager.init_frontend_unsafe`  sk   $ 333)+++,,...),)A)A.)Q)Q&
Iw7c"" 
	%S.//--)--. '.%%& M
 w~~m,, %oZooZcoofmoo   %$sjss9sswsss	
 	
 	
 F/
IFF&&w//":.55c::*++h.BBEUU
 
 w~~h'' 	''Ht4444B($	   g&&&*7XNNNN z(++ 'HX&&& z(++ 'HX&&&&' s   ;AG; ;+H&c                     	 |                      |          S # t          $ rU}t          j        d|           t          j        d           t                       |                                 cY d}~S d}~ww xY w)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?   r@   rN   r   )r   r   rL   s      r   init_frontendzFrontendManager.init_frontend  s    	/++N;;; 	/ 	/ 	/M=qAAAL@AAA)+++,,........		/s    
A6A
A1+A61A6c                 t    |                                  sd S dt          j        dt          j        ffd}|S )Nrequestr   c                    K   | j                             dd          }                    |          }|t          j                    t          j        |          S )Nr    )
match_infor'   r	   HTTPNotFoundFileResponse)r   rel_pathtargetr`   s      r   serve_templatez>FrontendManager.template_asset_handler.<locals>.serve_template  sU      )--fb99HZZ))F~&(((#F+++r   )r   r	   RequestStreamResponse)r   r   r`   s     @r   template_asset_handlerz&FrontendManager.template_asset_handler  sZ    '')) 	4	,#+ 	,#:L 	, 	, 	, 	, 	, 	, r   )N)rS   rT   rU   rV   r   __file__parentsr   classmethodr(   r   r   r6   r   r   r   r   r   r   r   r   rc   r   r   r   r   r   r   r   r      sJ       CX 6q 9<Q QRR/c / / / [/     [ Xs X X X [X , , [, c    [& *8DcN#; * * * [*Z hsm    [, 
3 
 
 
 [
 S SsC}1E S S 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   rs   typing_extensionsr   utils.install_utilr   r   comfy.cli_argsr   
app.loggerrC   r   rV   r   r   r   r    r$   r(   r/   r6   rN   rt   rQ   rY   rc   r   r   r   r   r   <module>r     s     				 				 



       ! ! ! ! ! ! % % % % % %       , , , , , , , , , ,       & & & & & &  ) ) ) ) ) ) _ _ _ _ _ _ _ _ 1 1 1 1 1 1      33 35c3#7 3 3 3 3,c ,d , , , ,
R R R     #
 #
 #
L     I   % % % % %i % % % 6I 6I 6I 6I 6I 6I 6I 6Ir1 13 14 1 1 1 1<s s s s s s s s s sr   