o
    ~riP                     @   s  d 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	m
Z
 ddlmZmZ ddlmZ ddlmZmZmZ ddlZddlmZmZ ddlmZmZmZ d	d
lmZmZmZmZm Z  dZ!edZ"dZ#dZ$e e$dZ%dZ&dZ'dZ(dZ)e*e+Z,e
G dd dZ-e%j.dg dd	dmdej/dee0ej1ddf dee2ej3dddf d dfd!d"Z4e%j.d#d$dd$d%d&d'gd(dej/d)ee0ej1d*df d dfd+d,Z5e%j.d-d.gdej6dfd/ed0ed dfd1d2Z7e%j.d3d4gdej6dfd/ed0ed dfd5d6Z8e%j.d7d8gdd)ee0ej1d9df d dfd:d;Z9d e:e- fd<d=Z;d e:e<e0e0f  fd>d?Z=d@e:e0 dAe>e0 d ee? fdBdCZ@dDe0dEe0dFe0dGe0d eAf
dHdIZBdDe0dEe0dGe0dJedKeAd e-fdLdMZCdDe0dEe0dGe0dJedFe0d e-fdNdOZDdDe0dEe0dFe0dPee0 d ee0 f
dQdRZEd efdSdTZFdGe0d efdUdVZGdDe0dEe0d e<e0ee0 f fdWdXZHdGe0d e0fdYdZZIdGe0d efd[d\ZJd]ed efd^d_ZKd]edGe0d efd`daZLeMdbZNdGe0dce0d e0fdddeZOde0d e<e0e0e0f fdfdgZPd)e0d e0fdhdiZQdjed@e:e0 d e?fdkdlZRdS )nz0Contains helper utilities for hf CLI extensions.    N)asdict	dataclass)datetimetimezone)Path)	AnnotatedLiteralOptional)CLIErrorCLIExtensionInstallError)
StatusLineget_sessionlogging   )	FormatOptOutputFormatQuietOptprint_list_outputtyper_factoryhuggingfacez~/.local/share/hf/extensionszmanifest.jsonzManage hf CLI extensions.

Security Warning: extensions are third-party executables or Python packages. Install only from sources you trust.)helpmainzhf-extension
   i,  c                   @   s   e Zd ZU eed< eed< eed< eed< eed< eed< ed ed< eed	< eed
< dZee ed< e	de
dd fddZde
ddfddZdS )ExtensionManifestownerreporepo_id
short_nameexecutable_nameexecutable_path)binarypythontypeinstalled_atsourceNdescriptionpathreturnc                 C   sN   |t  }| std| dt| }t|d |d< tdi |S )NzManifest file not found at z". Your extension may be corrupted.r#    )	MANIFEST_FILENAMEis_filer
   jsonloads	read_textr   fromisoformatr   )clsr&   manifest_pathdatar(   r(   l/lsinfo/ai/hellotax_ai/llm_service/venv_embed/lib/python3.10/site-packages/huggingface_hub/cli/extensions.pyloadB   s   zExtensionManifest.loadc                 C   sH   |t  }|jjddd t| }| j |d< |tj|ddd d S )NTparentsexist_okr#      )indent	sort_keys)	r)   parentmkdirr   r#   	isoformat
write_textr+   dumps)selfr&   r0   r1   r(   r(   r2   saveK   s
   zExtensionManifest.save)__name__
__module____qualname__str__annotations__r   r   r%   r	   classmethodr   r3   r@   r(   r(   r(   r2   r   5   s   
 r   install)zhf extensions install hf-claudez-hf extensions install hanouticelina/hf-claudez(hf extensions install alvarobartt/hf-mem)examplesFctxr   z:GitHub extension repository in `[OWNER/]hf-<name>` format.forcez--forcezOverwrite if already installed.r'   c                 C   sX  t |\}}}|  }tt|jdi  }||v r%td| d| dt|}| }	|	r9|s9td| dt	||d\}
}|	rHt
| z
t|||
|d}W n ty]   d	}Y nw |d	ur{td
 t|||||d}td| d| d ntd t|||||
d}td| d| d t|||
|d}||_|| td|  d	S )zInstall an extension from a public GitHub repository.

    Security warning: this installs a third-party executable or Python package.
    Install only from sources you trust.
    commandszCannot install extension 'z,' because it conflicts with an existing `hf z
` command.Extension 'z1' is already installed. Use --force to overwrite.)r   	repo_name)r   rM   branchr   Nz/Binary found, installing as binary extension...)r   rM   r   extension_dirr    z-Binary extension installed successfully from /.z:Binary not found, trying to install as Python extension...)r   rM   r   rO   rN   z-Python extension installed successfully from )r   rM   rN   candidate_descriptionzRun it with: hf )_normalize_repo_id	find_rootsetgetattrcommandkeysr
   _get_extension_direxists_resolve_github_repo_infoshutilrmtree_fetch_remote_binary	Exceptionprint_install_binary_extension_install_python_extension_try_fetch_remote_descriptionr%   r@   )rI   r   rJ   r   rM   r   root_ctxreserved_commandsrO   extension_existsrN   r%   r    manifestr(   r(   r2   extension_installS   sX   

rh   execT)allow_extra_argsallow_interspersed_argsignore_unknown_optionsz#hf extensions exec claude -- --helpz/hf extensions exec claude --model zai-org/GLM-5)context_settingsrH   namez.Extension name (with or without `hf-` prefix).c                 C   sF   t |}t|}| std| dt|t| jd}tj|d)zExecute an installed extension.rL   ' is not installed.r   args)code)	_normalize_extension_name"_resolve_installed_executable_pathr*   r
   _execute_extension_binarylistrq   typerExit)rI   rn   r   r   	exit_coder(   r(   r2   extension_exec   s   rz   z	list | lszhf extensions listformatquietc                 C   s$   dd t  D }t|| |dd dS )z"List installed extension commands.c                 S   s:   g | ]}d |j  t|jt|j|jd|jdqS )zhf z%Y-%m-%d)rW   r$   r"   	installedr%   )r   rD   r   r"   r#   strftimer%   ).0rg   r(   r(   r2   
<listcomp>   s    

z"extension_list.<locals>.<listcomp>rW   )r{   r|   id_keyN)_list_installed_extensionsr   )r{   r|   rowsr(   r(   r2   extension_list   s   
r   searchzhf extensions searchc           	   	   C   s   t  jddt dddddtd}|  | }d	d
 t D }g }|dg D ]/}|d }|dr;|dd n|}|||d |dd|dpNd||v rTdndd q*t	|| |dddid dS )zISearch extensions available on GitHub (tagged with 'hf-extension' topic).z*https://api.github.com/search/repositoriesztopic:starsdescd   )qsortorderper_pageT)paramsfollow_redirectstimeoutc                 S   s   h | ]}|j qS r(   )r   )r   mr(   r(   r2   	<setcomp>   s    z#extension_search.<locals>.<setcomp>itemsrn   hf-   N	full_namestargazers_countr   r%    yes)rn   r   r   r%   r}   r   right)r{   r|   r   
alignments)
r   get_EXTENSIONS_GITHUB_TOPIC_EXTENSIONS_DOWNLOAD_TIMEOUTraise_for_statusr+   r   
startswithappendr   )	r{   r|   responser1   r}   r   r   rM   r   r(   r(   r2   extension_search   s,   

r   zremove | rmzhf extensions remove claudez8Extension name to remove (with or without `hf-` prefix).c                 C   sF   t | }t|}| std| dt| td| d dS )zRemove an installed extension.rL   ro   zRemoved extension ''.N)rs   rY   is_dirr
   r\   r]   r`   )rn   r   rO   r(   r(   r2   extension_remove   s   
r   c                  C   s   t  } |  s
g S g }t|  D ]5}| r|jdsqz
|t	| W q t
yG } ztd|j d|  W Y d}~qd}~ww |S )zPReturn manifests for all validly-installed extensions, sorted by directory name.r   z'Failed to load manifest for extension '': N)EXTENSIONS_ROOT
expanduserr   sortediterdirrn   r   r   r   r3   r_   loggerdebug)root_dir	manifestsrO   er(   r(   r2   r      s   r   c                  C   sP   g } t  D ] }d|j d}|jd ur|j d| n|}| |j|f q| S )Nz[extension ] )r   r   r%   r   r   )entriesrg   tag	help_textr(   r(   r2   "list_installed_extensions_for_help  s   
r   rq   known_commandsc                 C   s   | sd S | d }| drd S ||v rd S | dr |dd  n|}|s&d S zt|}W n
 ty6   Y d S w | s=d S t|t| dd  dS )Nr   -r   r   r   rp   )r   rt   r_   r*   ru   rv   )rq   r   command_namer   r   r(   r(   r2   $dispatch_unknown_top_level_extension  s$   
r   r   rM   rN   r   c                 C   sD   t |}d|  d| d| d| }t j|dtd}|  |jS )N"https://raw.githubusercontent.com/rP   /refs/heads/Tr   r   )_get_executable_namer   r   r   r   content)r   rM   rN   r   r   raw_urlr   r(   r(   r2   r^   1  s
   r^   rO   r    c                 C   sz   t |}|jddd || }|| tjdkrt|d t| ||  d| ||t|dt	t
jd|  d| d		S )
NTFr4   nti  rP   r    https://github.com/	r   r   r   r   r   r   r"   r#   r$   )r   r;   write_bytesosrn   chmodr   rD   r   nowr   utc)r   rM   r   rO   r    r   r   r(   r(   r2   ra   9  s"   


ra   c                 C   s  d|  d| d| d}|d }d}t  }z-z|d|  | r+tj|dd	 |jddd
 td}	t|}
|	rjtj	|	dt
|gdd |d|  |d|  tj	|	dddt
|
|gdtd n,tjddt
| |d|  |d|  tj	t
|
ddddd|gdtd |d|  t|}t||}| std|  d| d| dt| ||  d| ||t
| dttjd|  d| d	}d}|W W |stj|dd	 S S  ty     tjy } ztdt d|  d| d|d }~w tjy) } ztd |  d| d!|j d"|d }~w tyC } ztd#|  d| d$| |d }~ww |sOtj|dd	 w w )%Nr   rP   z/archive/refs/heads/z.zipvenvFz Creating virtual environment in T)ignore_errorsr4   uv)checkzVirtual environment created in zInstalling package from piprG   z--python)r   r   )with_pipz-mz--disable-pip-version-checkz
--no-inputzPackage installed from zInstalled package from 'z/' does not expose the required console script 'r   r!   r   zPip install timed out after zs for 'z$'. See pip output above for details.z$Failed to install pip package from 'z' (exit code z$). See pip output above for details.z%Failed to set up pip extension from 'r   )r   updaterZ   r\   r]   r;   which_get_venv_python_path
subprocessrunrD   done_EXTENSIONS_PIP_INSTALL_TIMEOUTr   
EnvBuildercreater   #_get_venv_extension_executable_pathr*   r
   r   resolver   r   r   r   TimeoutExpiredr   CalledProcessError
returncoder_   )r   rM   r   rO   rN   
source_urlvenv_dirr}   statusuv_pathvenv_pythonr   venv_executablerg   r   r(   r(   r2   rb   T  s   
	


rb   rR   c           
   	   C   s   z+t  jd|  d| d| dt dd}|  | }|d}t|tr*|W S W n	 ty4   Y nw z<t  jd|  d| d| ddd}|  |j	 D ]}|
 }|drn|d\}}}	|	
 
d	  W S qQW |S  ty{   Y |S w )
zTry to fetch project description either from:
    - manifest.json
    - pyproject.toml

    Only best effort, no error handling.
    r   rP   r   T)r   r%   z/pyproject.toml=z"')r   r   r)   r   r+   
isinstancerD   r_   text
splitlinesstripr   	partition)
r   rM   rN   rR   r   r1   r%   line_valuer(   r(   r2   rc     s@   



	rc   c                  C   s   t  } | jddd | S )NTr4   )r   r   r;   )r   r(   r(   r2   _get_extensions_root  s   r   c                 C   sF   t | | d}t  }|d|   }||jvr!td|  d|S )Noriginal_inputr   Invalid extension name 'r   )_validate_extension_short_namer   r   r5   r
   )r   	safe_nameroottargetr(   r(   r2   rY     s   

rY   c                 C   s^   z!t  jd|  d| dtd}|  | }|d |dfW S  ty.   td f Y S w )Nzhttps://api.github.com/repos/rP   Tr   default_branchr%   )r   r   r   r   r+   r_   _EXTENSIONS_DEFAULT_BRANCH)r   rM   r   r1   r(   r(   r2   r[     s   r[   c                 C   s    d|  }t jdkr|d7 }|S )Nr   r   z.exer   rn   )r   rn   r(   r(   r2   r     s   

r   c                 C   s    t | }t|}t|j S N)rY   r   r3   r   r   r   )r   rO   rg   r(   r(   r2   rt     s   
rt   r   c                 C   s"   t jdkr| d d S | d d S )Nr   Scriptsz
python.exebinr!   r   )r   r(   r(   r2   r      s   
r   c                 C   s*   t |}tjdkr| d | S | d | S )Nr   r   r   )r   r   rn   )r   r   r   r(   r(   r2   r     s   
r   z^[A-Za-z0-9][A-Za-z0-9._-]*$r   c                   sx   |     s
tdt fdddD rtd| dd v s%d v r-td| dt s:td| d	 S )
NExtension name cannot be empty.c                 3   s    | ]}| v V  qd S r   r(   )r   seprn   r(   r2   	<genexpr>  s    z1_validate_extension_short_name.<locals>.<genexpr>)rP   \r   r   z..:z9'. Allowed characters: letters, digits, '.', '_' and '-'.)r   r
   any_ALLOWED_EXTENSION_NAME	fullmatch)r   r   r(   r   r2   r     s   

r   c                 C   s   d| v rt d| d}t|dkrt}|d }nt|dkr)t|r)|\}}nt d|  d|d	s>t d
| d|dd  }|sJt dt|| d |||fS )Nz://zEOnly GitHub repositories in `[OWNER/]hf-<name>` format are supported.rP   r   r   r7   z%Expected `[OWNER/]REPO` format, got 'r   r   z6Extension repository name must start with 'hf-', got 'r   z(Invalid extension repository name 'hf-'.r   )r
   splitlenDEFAULT_EXTENSION_OWNERallr   r   )r   partsr   rM   r   r(   r(   r2   rS     s    




rS   c                 C   s:   |   }|s
td|dr|dd  n|}t|| dS )Nr   r   r   r   )r   r
   r   r   )rn   	candidate
normalizedr(   r(   r2   rs   7  s
   rs   r   c              
   C   sj   zt t| g| W S  ty4 } ztjdks|jtjkr t dt| g| W  Y d }~S d }~ww )Nr   sh)r   callrD   OSErrorr   rn   errnoENOEXEC)r   rq   r   r(   r(   r2   ru   ?  s   "ru   )F)S__doc__r  r+   r   rer\   r   r   dataclassesr   r   r   r   pathlibr   typingr   r   r	   rw   huggingface_hub.errorsr
   r   huggingface_hub.utilsr   r   r   
_cli_utilsr   r   r   r   r   r  r   r)   EXTENSIONS_HELPextensions_clir   r   r   r   
get_loggerrA   r   r   rW   ContextrD   ArgumentboolOptionrh   rz   tabler   r   r   rv   r   tupler   rU   intr   bytesr^   ra   rb   rc   r   rY   r[   r   rt   r   r   compiler   r   rS   rs   ru   r(   r(   r(   r2   <module>   s  


E

  
"	

V
,"	
