
    LiP                        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$      Z%dZ&dZ'dZ(dZ) ejT                  e+      Z,e
 G d d             Z-e%j]                  dg d      	 dVdej^                  dee0 ejb                  d      f   dee2 ejf                  dd      f   d dfd!       Z4e%j]                  d"d#dd#d$d%d&g'      dej^                  d(ee0 ejb                  d)      f   d dfd*       Z5e%j]                  d+d,g      ejl                  dfd-ed.ed dfd/       Z7e%j]                  d0d1g      ejl                  dfd-ed.ed dfd2       Z8e%j]                  d3d4g      d(ee0 ejb                  d5      f   d dfd6       Z9d e:e-   fd7Z;d e:e<e0e0f      fd8Z=d9e:e0   d:e>e0   d ee?   fd;Z@d<e0d=e0d>e0d?e0d eAf
d@ZBd<e0d=e0d?e0dAedBeAd e-fdCZCd<e0d=e0d?e0dAed>e0d e-fdDZDd<e0d=e0d>e0dEee0   d ee0   f
dFZEd efdGZFd?e0d efdHZGd<e0d=e0d e<e0ee0   f   fdIZHd?e0d e0fdJZId?e0d efdKZJdLed efdMZKdLed?e0d efdNZL ej                  dO      ZNd?e0dPe0d e0fdQZOde0d e<e0e0e0f   fdRZPd(e0d e0fdSZQdTed9e:e0   d e?fdUZRy)Wz0Contains 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                       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       Zde
ddfdZy)ExtensionManifestownerreporepo_id
short_nameexecutable_nameexecutable_path)binarypythontypeinstalled_atsourceNdescriptionpathreturnc                     |t         z  }|j                         st        d| d      t        j                  |j                               }t        j                  |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datas       d/var/www/html/lcp-python-backend/venv/lib/python3.12/site-packages/huggingface_hub/cli/extensions.pyloadzExtensionManifest.loadB   sn    00$$&8Gijkkzz-1134'55d>6JK^ (4((    c                     |t         z  }|j                  j                  dd       t        |       }| j                  j                         |d<   |j                  t        j                  |dd             y )NTparentsexist_okr%      )indent	sort_keys)	r,   parentmkdirr   r%   	isoformat
write_textr.   dumps)selfr(   r3   r4   s       r5   savezExtensionManifest.saveK   sc    00""4$"?d|#00::<^  Dd!KLr7   )__name__
__module____qualname__str__annotations__r	   r   r'   r
   classmethodr   r6   rE   r+   r7   r5   r   r   5   s~    J
ILO
$
%%K!%K#%) )!4 ) )M M$ Mr7   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                    t        |      \  }}}| j                         }t        t        |j                  di       j                               }||v rt        d| d| d      t        |      }|j                         }	|	r|st        d| d      t        ||      \  }
}|	rt        j                  |       	 t        |||
|      }|.t        d
       t        |||||      }t        d| d| d       n-t        d       t!        |||||
      }t        d| d| d       t#        |||
|      }||_        |j'                  |       t        d|        y	# t        $ r d	}Y w xY w)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   rS   branchr   Nz/Binary found, installing as binary extension...)r   rS   r   extension_dirr"   z-Binary extension installed successfully from /.z:Binary not found, trying to install as Python extension...)r   rS   r   rU   rT   z-Python extension installed successfully from )r   rS   rT   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'   rE   )rN   r   rO   r   rS   r   root_ctxreserved_commandsrU   extension_existsrT   r'   r"   manifests                 r5   extension_installrn   S   s   * $6g#> E9j}}HGH$4$4j"EJJLM&&(4`ak`llvw
 	
 'z2M$++-ZL0abcc3%9UFKm$%EYvblm
 ?@,!'
 	=eWAi[PQRSJK,!'
 	=eWAi[PQRS 0y{K 'HMM- 	ZL
)*A  s   :E E*)E*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_settingsrM   namez.Extension name (with or without `hf-` prefix).c                     t        |      }t        |      }|j                         st        d| d      t	        |t        | j                              }t        j                  |      )zExecute an installed extension.rR   ' is not installed.r!   args)code)	_normalize_extension_name"_resolve_installed_executable_pathr-   r   _execute_extension_binarylistrx   typerExit)rN   rt   r   r!   	exit_codes        r5   extension_execr      sa      +40J8DO""$ZL0CDEE)/PTUXU]U]P^_I
**)
$$r7   z	list | lszhf extensions listformatquietc           	         t               D cg c]`  }d|j                   t        |j                        t        |j                        |j
                  j                  d      |j                  db }}t        || |d       yc c}w )z"List installed extension commands.zhf z%Y-%m-%d)r]   r&   r$   	installedr'   r]   )r   r   id_keyN)	_list_installed_extensionsr   rI   r   r$   r%   strftimer'   r   )r   r   rm   rowss       r5   extension_listr      s     34	  X0012(**+&!..77
C#//	
	D 	 d6yI	s   A%Bsearchzhf extensions searchc           	          t               j                  ddt         dddddt              }|j	                          |j                         }t               D ch c]  }|j                   }}g }|j                  d	g       D ]b  }|d
   }|j                  d      r|dd n|}	|j                  |	|d   |j                  dd      |j                  d      xs d|	|v rdndd       d t        || |dddi       yc c}w )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timeoutitemsrt   hf-   N	full_namestargazers_countr   r'    yes)rt   r   r   r'   r   r   right)r   r   r   
alignments)r   get_EXTENSIONS_GITHUB_TOPIC_EXTENSIONS_DOWNLOAD_TIMEOUTraise_for_statusr.   r   r   
startswithappendr   )
r   r   responser4   mr   r   r   rS   r   s
             r5   extension_searchr      s    }  4678'TZhkl,	 ! H ==?D'A'CD!DIDD"% 
L	&/&:&:5&AYqr]y
"[)"4a8#xx6<"&0I&=U2	

 d6vSZ\cRde! Es   C;zremove | rmzhf extensions remove claudez8Extension name to remove (with or without `hf-` prefix).c                     t        |       }t        |      }|j                         st        d| d      t	        j
                  |       t        d| d       y)zRemove an installed extension.rR   rv   zRemoved extension ''.N)rz   r_   is_dirr   rb   rc   rf   )rt   r   rU   s      r5   extension_remover      sW     +40J&z2M!ZL0CDEE
MM- 	
|2
./r7   c                     t         j                         } | j                         sg S g }t        | j	                               D ]S  }|j                         r|j
                  j                  d      s/	 |j                  t        j                  |             U |S # t        $ r/}t        j                  d|j
                   d|        Y d}~d}~ww xY w)zPReturn manifests for all validly-installed extensions, sorted by directory name.r   z'Failed to load manifest for extension '': N)EXTENSIONS_ROOT
expanduserr   sortediterdirrt   r   r   r   r6   re   loggerdebug)root_dir	manifestsrU   es       r5   r   r      s    ))+H??	I 0 0 23 ##%]-?-?-J-J5-Q	.33MBC	   	LLB=CUCUBVVYZ[Y\]^	s   2$B	C#%CCc                      g } t               D ]N  }d|j                   d}|j                  |j                   d| n|}| j                  |j                  |f       P | S )Nz[extension ] )r   r   r'   r   r   )entriesrm   tag	help_texts       r5   "list_installed_extensions_for_helpr     sq    G.0 9H,,-Q/7?7K7K7Wx++,AcU3]`	++Y789 Nr7   rx   known_commandsc                     | sy | d   }|j                  d      ry ||v ry |j                  d      r|dd  n|}|sy 	 t        |      }|j                         sy t	        |t        | dd              S # t        $ r Y y w xY w)Nr   -r   r   r   rw   )r   r{   re   r-   r|   r}   )rx   r   command_namer   r!   s        r5   $dispatch_unknown_top_level_extensionr     s    7Ls#~%%1%<%<U%Cab!J<ZH ""$$_4PTUVUWPX>ZZ  s   A1 1	A=<A=r   rS   rT   r   c                     t        |      }d|  d| d| d| }t               j                  |dt              }|j	                          |j
                  S )N"https://raw.githubusercontent.com/rV   /refs/heads/Tr   r   )_get_executable_namer   r   r   r   content)r   rS   rT   r   r    raw_urlr   s          r5   rd   rd   1  sa    *:6O25'9+\RXQYYZ[jZklG}  4Ie fHr7   rU   r"   c                 N   t        |      }|j                  dd       ||z  }|j                  |       t        j                  dk7  rt        j
                  |d       t        | ||  d| ||t        |      dt        j                  t        j                        d|  d| 		      S )
NTFr9   nti  rV   r"   https://github.com/	r   r   r   r   r    r!   r$   r%   r&   )r   r@   write_bytesosrt   chmodr   rI   r   nowr   utc)r   rS   r   rU   r"   r    r!   s          r5   rg   rg   9  s     +:6Ou5#o5O' 
ww$
%( '9+&'O,\\(,,/$UG1YK8
 
r7   c                    d|  d| d| d}|dz  }d}t               }	 |j                  d|        |j                         rt        j                  |d	       |j                  dd
       t        j                  d      }	t        |      }
|	rwt        j                  |	dt        |      gd       |j                  d|        |j                  d|        t        j                  |	dddt        |
      |gdt               nt        j                  d      j                  t        |             |j                  d|        |j                  d|        t        j                  t        |
      ddddd|gdt               |j                  d|        t!        |      }t#        ||      }|j%                         st'        d|  d| d| d      t)        | ||  d| ||t        |j+                               dt-        j.                  t0        j2                        d|  d| 	      }d}||st        j                  |d	       S S # t&        $ r  t        j4                  $ r}t7        dt         d|  d| d      |d }~wt        j8                  $ r%}t7        d |  d| d!|j:                   d"      |d }~wt<        $ r}t7        d#|  d| d$|       |d }~ww xY w# |st        j                  |d	       w w xY w)%Nr   rV   z/archive/refs/heads/z.zipvenvFz Creating virtual environment in T)ignore_errorsr9   uv)checkzVirtual environment created in zInstalling package from piprL   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   updater`   rb   rc   r@   which_get_venv_python_path
subprocessrunrI   done_EXTENSIONS_PIP_INSTALL_TIMEOUTr   
EnvBuildercreater   #_get_venv_extension_executable_pathr-   r   r   resolver   r   r   r   TimeoutExpiredr   CalledProcessError
returncodere   )r   rS   r   rU   rT   
source_urlvenv_dirr   statusuv_pathvenv_pythonr    venv_executablerm   r   s                  r5   rh   rh   T  sI    'ugQyk9MfXUYZJv%HI\FK=8
CD!MM-t<D59,,t$+H5NNGVS];4HKK9(DEMM4ZLABNN%JK8H*U7 OOT*11#h-@KK9(DEMM4ZLABNN$1  7 	-j\:;.z:=h
S&&(*5'9+ >#$B( 
 %gQyk*!+ 7 7 9:!hll3(q<

 	  MM-t<   $$ &*+J*K7SXRYYZ[dZe f0 0
 	 (( &25'9+]STS_S_R` a0 0
 	  q&)NugUVW`Vaadefdg'hioppq MM-t< s<   HI K)JK J99KKKK" "K>rX   c           
      ~   	 t               j                  d|  d| d| dt         d      }|j                          |j	                         }|j                  d      }t        |t              r|S 	 	 t               j                  d|  d| d| dd      }|j                          |j                  j                         D ]Y  }|j                         }|j                  d      s%|j                  d      \  }}}	|	j                         j                  d	      c S  	 |S # t        $ r Y w xY w# t        $ r Y |S w xY w)
zTry to fetch project description either from:
    - manifest.json
    - pyproject.toml

    Only best effort, no error handling.
    r   rV   r   T)r   r'   z/pyproject.toml=z"')r   r   r,   r   r.   
isinstancerI   re   text
splitlinesstripr   	partition)
r   rS   rT   rX   r   r4   r'   line_values
             r5   ri   ri     s[   =$$0q<PVxWXYjXkl! % 
 	!!#}}hh}-k3' (=$$0q<PVxWfg! % 
 	!!# MM,,. 	2D::<D}-"nnS11e{{}**511		2 ! +  "   ! 	s1   A-D  2A3D/ &5D/ D/  	D,+D,/	D<;D<c                  T    t         j                         } | j                  dd       | S )NTr9   )r   r   r@   )r   s    r5   _get_extensions_rootr     s%    ))+HNN4$N/Or7   c                     t        | |       }t               j                         }|d| z  j                         }||j                  vrt	        d|  d      |S )Noriginal_inputr   Invalid extension name 'r   )_validate_extension_short_namer   r   r:   r   )r   	safe_nameroottargets       r5   r_   r_     s_    .z*UI!))+Ds9+&&//1F6>>!1*R@AAMr7   c                     	 t               j                  d|  d| dt              }|j                          |j	                         }|d   |j                  d      fS # t
        $ r t        d fcY S w xY w)Nzhttps://api.github.com/repos/rV   Tr   default_branchr'   )r   r   r   r   r.   re   _EXTENSIONS_DEFAULT_BRANCH)r   rS   r   r4   s       r5   ra   ra     s    
0=$$+E7!I;?!0 % 

 	!!#}}$%txx'>>> 0)4//0s   AA A21A2c                 @    d|  }t         j                  dk(  r|dz  }|S )Nr   r   z.exer   rt   )r   rt   s     r5   r   r     s'    D	ww$Kr7   c                     t        |       }t        j                  |      }t        |j                        j                         S N)r_   r   r6   r   r!   r   )r   rU   rm   s      r5   r{   r{     s6    &z2M %%m4H(()4466r7   r   c                 H    t         j                  dk(  r| dz  dz  S | dz  dz  S )Nr   Scriptsz
python.exebinr#   r  )r   s    r5   r   r      s-    	ww$)#l22eh&&r7   c                 ^    t        |      }t        j                  dk(  r| dz  |z  S | dz  |z  S )Nr   r  r  )r   r   rt   )r   r   r    s      r5   r   r     s7    *:6O	ww$)#o55eo--r7   z^[A-Za-z0-9][A-Za-z0-9._-]*$r   c                    | j                         st        d      t        fddD              rt        d| d      dv sdv rt        d| d      t        j	                        st        d| d      S )	NExtension name cannot be empty.c              3   &   K   | ]  }|v  
 y wr	  r+   ).0seprt   s     r5   	<genexpr>z1_validate_extension_short_name.<locals>.<genexpr>  s     
.33$;
.s   )rV   \r   r   z..:z9'. Allowed characters: letters, digits, '.', '_' and '-'.)r   r   any_ALLOWED_EXTENSION_NAME	fullmatch)r   r   rt   s     @r5   r   r     s    D899

.+
..1.1ADEEt|sd{1.1ADEE",,T2&~&66op
 	
 Kr7   c                 Z   d| v rt        d      | j                  d      }t        |      dk(  rt        }|d   }n.t        |      dk(  rt	        |      r|\  }}nt        d|  d      |j                  d	      st        d
| d      |dd  }|st        d      t        ||        |||fS )Nz://zEOnly GitHub repositories in `[OWNER/]hf-<name>` format are supported.rV   r   r   r<   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   rS   r   s        r5   rY   rY     s    ^__MM#E
5zQ'!H		UqSZ y>wirJKK&OPY{Z\]^^12JABB":gF)Z''r7   c                     | j                         }|st        d      |j                  d      r|dd  n|}t        ||       S )Nr  r   r   r   )r   r   r   r   )rt   	candidate
normalizeds      r5   rz   rz   7  sC    

I899"+"6"6u"=129J)*TJJr7   r!   c                    	 t        j                  t        |       g|z         S # t        $ r^}t        j
                  dk(  s|j                  t        j                  k7  r t        j                  dt        |       g|z         cY d }~S d }~ww xY w)Nr   sh)r   callrI   OSErrorr   rt   errnoENOEXEC)r!   rx   r   s      r5   r|   r|   ?  sq    DO 45<== D77d?agg6c/&:;dBCCDs   !$ 	BAB BB)F)S__doc__r&  r.   r   rerb   r   r   dataclassesr   r   r   r   pathlibr   typingr   r	   r
   r~   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_loggerrF   r   r   r]   ContextrI   ArgumentboolOptionrn   r   tabler   r   r   r}   r   tupler   r[   intr   bytesrd   rg   rh   ri   r   r_   ra   r   r{   r   r   compiler  r   rY   rz   r|   r+   r7   r5   <module>r<     s   7   	 	    ) '  / /  E B B [ [ ( 56# + 
 O4# ) ! "% 			H	% M M M:    _dB+	B+XY	[B+ T<5<<	8YZZ[B+ 
B+B+J 
*.5lpq-9  %	%
LM	O% 
%%$ /C.DE'3'9'9U J9 J( JW[ J FJ ,B+CD)5););u fY fH fY] f Ef< 1N0OP0
VW	Y0
 
0 Q0(D):$; "DsCx,A [tCy [#c( [W_`cWd [2  S c V[ !/2CGQV6S=S=!S=/2S=CGS=QTS=S=l)!)!)!(+)!DLSM)!c])!Xd 3 4 0S 0S 0U3QTCU=V 0S S 73 74 7'D 'T '.$ .C .D . %"**%DE s s s ( (c3m(< (0KC KC KDt D49 D Dr7   