o
    i7                     @  sZ  d dl m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	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d Z"d+ddZ#d,ddZ$dd Z%dd Z&dd Z'dZ(G dd deZ)G d d! d!eZ*eG d"d# d#Z+d-d'd(Z,G d)d* d*Z-dS ).    )annotationsN)	dataclass)cached_property)Path)Dict	TypedDictOptional)webversion)NotRequired) get_missing_requirements_messageget_required_packages_versions)DEFAULT_VERSION_STRINGc                   C  s   dt   d S )N
z

This error is happening because the ComfyUI frontend is no longer shipped as part of the main repo but as a pip package instead.
)r   strip r   r   5/mnt/c/Users/fbmor/ComfyUI/app/frontend_management.py frontend_install_warning_message   s
   r   r   strreturntuple[int, int, int]c                 C  s   t tt| dS )N.)tuplemapintsplitr
   r   r   r   parse_version!   s   r   boolc                 C  s   d}t t|| S )z@Validate if a string is a valid semantic version (X.Y.Z format).z^(\d+)\.(\d+)\.(\d+)$)r   rematch)r   patternr   r   r   is_valid_version$   s   r"   c                  C  s   t d} | S )z5Get the currently installed frontend package version.comfyui-frontend-packager
   )frontend_version_strr   r   r   get_installed_frontend_version)   s   r%   c                   C     t  dd S )Nr#   r   getr   r   r   r   get_required_frontend_version/   s   r)   c               
   C  s   z?t  } t| }t }t|}||k r5tjddtt| ddtt| dt	  d
  W dS td|  W dS  tyZ } ztd|  W Y d}~dS d}~ww )	z,Check if the frontend version is up to date.z
________________________________________________________________________
WARNING WARNING WARNING WARNING WARNING

Installed frontend version r   z' is lower than the recommended version z.

zJ
________________________________________________________________________
zComfyUI frontend version: {}z"Failed to check frontend version: N)r%   r   r)   apploggerlog_startup_warningjoinr   r   r   r   logginginfoformat	Exceptionerror)r$   frontend_versionrequired_frontend_strrequired_frontender   r   r   check_frontend_version3   s*   
r7   
   c                   @  s   e Zd ZU ded< dS )Assetr   urlN__name__
__module____qualname____annotations__r   r   r   r   r9   P   s   
 r9   c                   @  sN   e Zd ZU ded< ded< ded< ded< ded< ded	< ded
< ded< dS )Releaser   idr   tag_namenamer   
prerelease
created_atpublished_atbodyzNotRequired[list[Asset]]assetsNr;   r   r   r   r   r@   T   s   
 r@   c                   @  sn   e Zd ZU ded< ded< edddZedddZedd
dZedddZ	edddZ
dddZdS )FrontEndProviderr   ownerrepor   c                 C  s   | j  d| j S )N_rJ   rK   selfr   r   r   folder_named   s   zFrontEndProvider.folder_namec                 C  s   d| j  d| j dS )Nzhttps://api.github.com/repos//z	/releasesrM   rN   r   r   r   release_urlh   s   zFrontEndProvider.release_urllist[Release]c                 C  sX   g }| j }|r*tj|td}|  ||  d|jv r&|jd d }nd }|s|S )Ntimeoutnextr:   )rR   requestsr(   REQUEST_TIMEOUTraise_for_statusextendjsonlinks)rO   releasesapi_urlresponser   r   r   all_releasesl   s   
	zFrontEndProvider.all_releasesr@   c                 C  s*   | j  d}tj|td}|  | S )Nz/latestrT   )rR   rW   r(   rX   rY   r[   )rO   latest_release_urlr_   r   r   r   latest_release{   s   zFrontEndProvider.latest_releasec                 C  s$   dd | j D }|std|d S )zOGet the latest pre-release version - even if it's older than the latest releasec                 S  s   g | ]}|d  r|qS )rD   r   ).0releaser   r   r   
<listcomp>   s    z6FrontEndProvider.latest_prerelease.<locals>.<listcomp>zNo pre-releases foundr   )r`   
ValueError)rO   rd   r   r   r   latest_prerelease   s   z"FrontEndProvider.latest_prereleaser   c                 C  sV   |dkr| j S |dkr| jS | jD ]}|d |d| fv r"|  S qtd| d)NlatestrD   rB   vzVersion z not found in releases)rb   rg   r`   rf   )rO   r   rd   r   r   r   get_release   s   
zFrontEndProvider.get_releaseNr   r   )r   rS   )r   r@   )r   r   r   r@   )r<   r=   r>   r?   propertyrP   rR   r   r`   rb   rg   rj   r   r   r   r   rI   _   s   
 
rI   rd   destination_pathNonec              	   C  s   d}|  dg D ]}|d dkr|d } nq|stdt H}ddi}tj ||d	td
}|  ||j |	d t
|d}|| W d   n1 sTw   Y  W d   dS W d   dS 1 slw   Y  dS )z&Download dist.zip from github release.NrH   rC   zdist.zipr:   z(dist.zip not found in the release assetsAcceptzapplication/octet-streamT)headersallow_redirectsrU   r   r)r(   rf   tempfileTemporaryFilerW   rX   rY   writecontentseekzipfileZipFile
extractall)rd   rm   	asset_urlassettmp_filerp   r_   zip_refr   r   r   download_release_asset_zip   s,   

"r   c                   @  s   e Zd Zeeejd d Zed#ddZ	ed#ddZ
ed#d	d
Zed#ddZed$ddZed%ddZed#ddZed&ddZe	d'd(ddZed)dd Zed!d" ZdS )*FrontendManager   web_custom_versionsr   r   c                 C  s   t  S )z*Get the required frontend package version.)r)   clsr   r   r   r)      s   z-FrontendManager.get_required_frontend_versionc                 C  s$   zt d}|W S  ty   Y dS w )z?Get the currently installed workflow templates package version.comfyui-workflow-templatesN)r   r1   )r   templates_version_strr   r   r   get_installed_templates_version   s   z/FrontendManager.get_installed_templates_versionc                 C  r&   )Nr   r'   r   r   r   r   get_required_templates_version   s   z.FrontendManager.get_required_templates_versionc                 C  sV   zdd l }ttj|d W S  ty*   tdt  d	  t
d Y d S w )Nr   staticzK
********** ERROR ***********

comfyui-frontend-package is not installed.



********** ERROR ***********
)comfyui_frontend_packager   	importlib	resourcesfilesImportErrorr.   r2   r   r   sysexit)r   r   r   r   r   default_frontend_path   s   z%FrontendManager.default_frontend_pathOptional[Dict[str, str]]c              
   C  s  z
ddl m}m} W n ty    tdt  d  Y dS w zt| }W n t	yC } ztd|  W Y d}~dS d}~ww i }z|D ]}|j
D ]}||j|j||j< qNqIW n t	yx } ztd|  W Y d}~dS d}~ww |st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.   r2   r   r   listr1   rH   template_idfilename)r   r   r   template_entriesexc	asset_mapentryr|   r   r   r   template_asset_map   sH   

z"FrontendManager.template_asset_mapOptional[str]c                 C  sL   zddl }ttj|d W S  ty%   tdt  d	  Y dS w )zFReturn the legacy templates directory shipped inside the meta package.r   N	templatesr   r   )
r   r   r   r   r   r   r.   r2   r   r   )r   r   r   r   r   legacy_templates_path  s   z%FrontendManager.legacy_templates_pathc                 C  s>   zddl }ttj|d W S  ty   td Y dS w )z&Get the path to embedded documentationr   Ndocsz'comfyui-embedded-docs package not found)comfyui_embedded_docsr   r   r   r   r   r.   r/   )r   r   r   r   r   embedded_docs_path%  s   
z"FrontendManager.embedded_docs_pathvaluetuple[str, str, str]c                 C  sD   d}t ||}|du rt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_resultr   r   r   parse_version_string2  s
   z$FrontendManager.parse_version_stringNversion_stringproviderOptional[FrontEndProvider]c           
   	   C  sX  |t krt  |  S | |\}}}|drAtt| j| d|  |d }t	j
|rAtd| d| d|  |S td| d| d| d |pVt||}||}|d d}tt| j|j | }	t	j
|	sz(t	j|	d	d
 td|j||	 t| t||	d W t	|	st	|	 |	S t	|	st	|	 w 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.
        ri   rL   z6Using existing copy of specific frontend version tag: rQ   @zInitializing frontend: z+, requesting version details from GitHub...rB   T)exist_okz,Downloading frontend(%s) version(%s) to (%s))rm   )r   r7   r   r   
startswithr   r   CUSTOM_FRONTENDS_ROOTlstripospathexistsr.   r/   rI   rj   rP   makedirsdebugr   listdirrmdir)
r   r   r   
repo_owner	repo_namer   expected_pathrd   semantic_versionweb_rootr   r   r   init_frontend_unsafeE  sX   





z$FrontendManager.init_frontend_unsafec              
   C  sV   z|  |W S  ty* } ztd| td t  |  W  Y d}~S d}~w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   r1   r.   r2   r/   r7   r   )r   r   r6   r   r   r   init_frontend  s   
zFrontendManager.init_frontendc                   s"   |     sd S d fdd}|S )Nrequestweb.Requestr   web.StreamResponsec                   s4   | j dd} |}|d u rt t|S )Nr    )
match_infor(   r	   HTTPNotFoundFileResponse)r   rel_pathtargetrH   r   r   serve_template  s   

z>FrontendManager.template_asset_handler.<locals>.serve_template)r   r   r   r   )r   )r   r   r   r   r   template_asset_handler  s
   z&FrontendManager.template_asset_handlerrk   )r   r   )r   r   )r   r   r   r   )N)r   r   r   r   r   r   )r   r   r   r   )r<   r=   r>   r   r   __file__parentsr   classmethodr)   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s2    -@r   )r   r   r   r   )r   r   r   r   )rd   r@   rm   r   r   rn   ).
__future__r   r   r.   r   r   r   rs   rx   r   dataclassesr   	functoolsr   pathlibr   typingr   r   r   aiohttpr	   importlib.metadatar   rW   typing_extensionsr   utils.install_utilr   r   comfy.cli_argsr   
app.loggerr*   r   r   r"   r%   r)   r7   rX   r9   r@   rI   r   r   r   r   r   r   <module>   sB    


9