
    -:j/V                     ~   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 ddlZddlmZmZmZ ddlmZmZ d	d
lmZ d	dlmZ dZ ed      ZdZ dZ! ee!      Z"dZ#dZ$dZ%dZ& ejN                  e(      Z)e
 G d d             Z*e"jW                  dg d      	 dYdejX                  dee- ej\                  d      f   dee/ ej`                  dd       f   d!dfd"       Z1e"jW                  d#d$dd$d%d&d'g(      dejX                  d)ee- ej\                  d*      f   d!dfd+       Z2e"jW                  d,d-g      dZd.       Z3e"jW                  d/d0g      dZd1       Z4e"jW                  d2d3g      d)ee- ej\                  d4      f   d!dfd5       Z5d!e6e*   fd6Z7d!e6e8e-e-f      fd7Z9d8e6e-   d9e:e-   d!e;dz  fd:Z<d;e-d!edz  fd<Z=dd=d>e-d?e-d;e-d@edAe-dBe-dz  d!e*fdCZ>d>e-d?e-dAe-d;e-d!e?f
dDZ@d>e-d?e-d;e-d@edEe?d!e*fdFZAd>e-d?e-d;e-d@edAe-d!e*fdGZBd>e-d?e-dAe-dHe-dz  d!e-dz  f
dIZCd!efdJZDd;e-d!efdKZEd>e-d?e-d!e8e-e-dz  f   fdLZFd;e-d!e-fdMZGd;e-d!efdNZHdOed!efdPZIdOed;e-d!efdQZJ ej                  dR      ZLd;e-dSe-d!e-fdTZMde-d!e8e-e-e-f   fdUZNd)e-d!e-fdVZOdWed8e6e-   d!e;fdXZPy)[z0Contains helper utilities for hf CLI extensions.    N)asdict	dataclass)datetimetimezone)Path)	AnnotatedLiteral)CLIErrorCLIExtensionInstallErrorConfirmationError)get_sessionlogging   )typer_factory)out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dz  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       `/var/www/html/tokenscope/api/venv/lib/python3.12/site-packages/huggingface_hub/cli/extensions.pyloadzExtensionManifest.loadC   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$   r/   r0   s       r1   savezExtensionManifest.saveL   sc    00""4$"?d|#00::<^  Dd!KLr3   )__name__
__module____qualname__str__annotations__r	   r   r#   classmethodr   r2   rA   r'   r3   r1   r   r   6   s~    J
ILO
$
%%K"Kt") )!4 ) )M M$ Mr3   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        |||||
|      }|j                  j                         }t        j                   | d	| d
| d|        t        j"                  d|        y)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   rO   r   extension_dirbranchr#   z extension installed/hf )r"   commandzRun it with: hf N)_normalize_repo_id	find_rootsetgetattrrT   keysr
   _get_extension_direxists_resolve_github_repo_infoshutilrmtree_install_extension_from_githubr    
capitalizer   resulthint)rJ   r   rK   r   rO   r   root_ctxreserved_commandsrP   extension_existsrQ   r#   manifestext_types                 r1   extension_installrh   T   s9   * $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$-#H }}'')HJJ*())%j\"
 HH
|,-r3   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_settingsrI   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.rN   ' is not installed.r   args)code)	_normalize_extension_name"_resolve_installed_executable_pathr)   r
   _execute_extension_binarylistrr   typerExit)rJ   rn   r   r   	exit_codes        r1   extension_execr{      sa      +40J8DO""$ZL0CDEE)/PTUXU]U]P^_I
**)
$$r3   z	list | lszhf extensions listc            	      "   t               D  cg c]`  } d| j                   t        | j                        t        | j                        | j
                  j                  d      | j                  db }} t        j                  |d       yc c} w )z"List installed extension commands.rS   z%Y-%m-%d)rT   r"   r    	installedr#   rT   id_keyN)
_list_installed_extensionsr   rE   r   r    r!   strftimer#   r   table)rf   rowss     r1   extension_listr      s     34	  X0012(**+&!..77
C#//	
	D 	 IId9%	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        j                  |d       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itemsrn   hf-   N	full_namestargazers_countr   r#    yes)rn   r   r   r#   r}   r   r~   )r   get_EXTENSIONS_GITHUB_TOPIC_EXTENSIONS_DOWNLOAD_TIMEOUTraise_for_statusr*   r   r   
startswithappendr   r   )responser0   mr}   r   r   rO   r   s           r1   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	

 IId6"! Es   D 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        j                  d|       y)zRemove an installed extension.rN   rp   zExtension removed)rn   N)rt   rZ   is_dirr
   r]   r^   r   ra   )rn   r   rP   s      r1   extension_remover      sT     +40J&z2M!ZL0CDEE
MM- JJ"4r3   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iterdirrn   r   r   r   r2   	Exceptionloggerdebug)root_dir	manifestsrP   es       r1   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   )entriesrf   tag	help_texts       r1   "list_installed_extensions_for_helpr      sq    G.0 9H,,-Q/7?7K7K7Wx++,AcU3]`	++Y789 Nr3   rr   known_commandsc                    | sy | d   }|j                  d      ry |D ch c](  }|j                  d      D ]  }|j                          * }}}||v ry |j                  d      r|dd  n|}|sy d }	 t        |      }||j                         sy t        |t        | dd              S c c}}w # t        $ r t        |      }Y Hw xY w)Nr   -|r   r   r   rq   )	r   splitstripru   r    _auto_install_official_extensionr)   rv   rw   )rr   r   command_namecmda	all_knownr   r   s           r1   $dispatch_unknown_top_level_extensionr     s    7Ls#&4MsciinMMMIMy %1%<%<U%Cab!J#'OG<ZH o&=&=&?$_4PTUVUWPX>ZZ# N  G::FGs   -B*3B0 0CCr   c           	      T   t         d|  }}	 t        |       }|j                         ry	 t	               j                  d| d| dt              }|j                  dk(  ry|j                          |j                         d   }	 t        j                  d	|  d
| d| d       	 t        ||| ||      }t        |j                        j!                         S # t        $ r Y yw xY w# t        $ r Y yw xY w# t        $ r Y yw xY w# t        $ r t#        j$                  |d       Y yw xY w)zKTry to auto-install huggingface/hf-<name>. Returns executable path or None.r   Nhttps://api.github.com/repos/rR   Tr   r   i  default_branch'z)' is an official Hugging Face extension (z). Install it?r   rO   r   rP   rQ   ignore_errors)DEFAULT_EXTENSION_OWNERrZ   r   r[   r   r   r   status_coder   r*   r   confirmr   r_   r   r   r   r]   r^   )r   r   rO   rP   r   rQ   rf   s          r1   r   r     sR   .#j\0B9E*:6 =$$+E7!I;?!0 % 

 3&!!#!12a
|#LUGSTU^T__mno19S`io
 H,,-88::1        m48sL   C 5C&  #C& C5 $2D 	C#"C#&	C21C25	D D D'&D')r#   r   rO   rP   rQ   r#   c                     	 t        | |||      }|t        | ||||      }nt        | ||||      }t	        | |||      |_        |j                  |       |S # t        $ r d}Y Ww xY w)zLFetch, install (binary or Python), and save manifest for a GitHub extension.)r   rO   rQ   r   N)r   rO   r   rP   r   r   )r   rO   rQ   candidate_description)_fetch_remote_binaryr   _install_binary_extension_install_python_extension_try_fetch_remote_descriptionr#   rA   )r   rO   r   rP   rQ   r#   r   rf   s           r1   r_   r_   B  s    %EYvblm ,9S`io
 -9S`io
 9y{H MM- O  s   A A)(A)c                     t        |      }d|  d| d| d| }t               j                  |dt              }|j	                          |j
                  S )N"https://raw.githubusercontent.com/rR   /refs/heads/Tr   )_get_executable_namer   r   r   r   content)r   rO   rQ   r   r   raw_urlr   s          r1   r   r   _  sa    *:6O25'9+\RXQYYZ[jZklG}  4Ie fHr3   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 )
NTFr5   nti  rR   r   https://github.com/	r   r   r   r   r   r   r    r!   r"   )r   r<   write_bytesosrn   chmodr   rE   r   nowr   utc)r   rO   r   rP   r   r   r   s          r1   r   r   g  s     +:6Ou5#o5O' 
ww$
%( '9+&'O,\\(,,/$UG1YK8
 
r3   c                    d|  d| d| d}|dz  }d}t        j                         }	 |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/        j0                  t2        j4                        d|  d| 	      }d}||st	        j
                  |d	       S S # t(        $ r  t        j6                  $ r}t9        dt         d|  d| d      |d }~wt        j:                  $ r%}t9        d |  d| d!|j<                   d"      |d }~wt>        $ r}t9        d#|  d| d$|       |d }~ww xY w# |st	        j
                  |d	       w w xY w)%Nr   rR   z/archive/refs/heads/z.zipvenvFz Creating virtual environment in Tr   r5   uv)checkzVirtual environment created in zInstalling package from piprH   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   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   statusupdater[   r]   r^   r<   which_get_venv_python_path
subprocessrunrE   done_EXTENSIONS_PIP_INSTALL_TIMEOUTr   
EnvBuildercreater   #_get_venv_extension_executable_pathr)   r
   r   resolver   r   r   r   TimeoutExpiredr   CalledProcessError
returncoder   )r   rO   r   rP   rQ   
source_urlvenv_dirr}   r   uv_pathvenv_pythonr   venv_executablerf   r   s                  r1   r   r     sM    'ugQyk9MfXUYZJv%HIZZ\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)3JK)# KK)K$$K))K, ,Lr   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   rR   r   T)r   r#   z/pyproject.toml=z"')r   r   r(   r   r*   
isinstancerE   r   text
splitlinesr   r   	partition)
r   rO   rQ   r   r   r0   r#   line_values
             r1   r   r     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 )NTr5   )r   r   r<   )r   s    r1   _get_extensions_rootr    s%    ))+HNN4$N/Or3   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   r6   r
   )r   	safe_nameroottargets       r1   rZ   rZ   
  s_    .z*UI!))+Ds9+&&//1F6>>!1*R@AAMr3   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)Nr   rR   Tr   r   r#   )r   r   r   r   r*   r   _EXTENSIONS_DEFAULT_BRANCH)r   rO   r   r0   s       r1   r\   r\     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   rn   )r   rn   s     r1   r   r   !  s'    D	ww$Kr3   c                     t        |       }t        j                  |      }t        |j                        j                         S N)rZ   r   r2   r   r   r   )r   rP   rf   s      r1   ru   ru   (  s6    &z2M %%m4H(()4466r3   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    r1   r   r   .  s-    	ww$)#l22eh&&r3   c                 ^    t        |      }t        j                  dk(  r| dz  |z  S | dz  |z  S )Nr   r  r  )r   r   rn   )r   r   r   s      r1   r   r   4  s7    *:6O	ww$)#o55eo--r3   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seprn   s     r1   	<genexpr>z1_validate_extension_short_name.<locals>.<genexpr>B  s     
.33$;
.s   )rR   \r  r   z..:z9'. Allowed characters: letters, digits, '.', '_' and '-'.)r   r
   any_ALLOWED_EXTENSION_NAME	fullmatch)r   r  rn   s     @r1   r  r  >  s    D899

.+
..1.1ADEEt|sd{1.1ADEE",,T2&~&66op
 	
 Kr3   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.rR   r   r   r8   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
   r   lenr   allr   r  )r   partsr   rO   r   s        r1   rU   rU   M  s    ^__MM#E
5zQ'!H		UqSZ y>wirJKK&OPY{Z\]^^12JABB":gF)Z''r3   c                     | j                         }|st        d      |j                  d      r|dd  n|}t        ||       S )Nr  r   r   r
  )r   r
   r   r  )rn   	candidate
normalizeds      r1   rt   rt   e  sC    

I899"+"6"6u"=129J)*TJJr3   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   callrE   OSErrorr   rn   errnoENOEXEC)r   rr   r   s      r1   rv   rv   m  sq    DO 45<== D77d?agg6c/&:;dBCCDs   !$ 	BAB BB)F)r%   N)Q__doc__r1  r*   r   rer]   r   r   dataclassesr   r   r   r   pathlibr   typingr   r	   rx   huggingface_hub.errorsr
   r   r   huggingface_hub.utilsr   r   
_cli_utilsr   _outputr   r   r   r(   EXTENSIONS_HELPextensions_clir  r   r   r   
get_loggerrB   r   r   rT   ContextrE   ArgumentboolOptionrh   r{   r   r   r   rw   r   tupler   rW   intr   r   r_   bytesr   r   r   r   r  rZ   r\   r   ru   r   r   compiler$  r  rU   rt   rv   r'   r3   r1   <module>rG     s   7   	 	    ) '  %  X X 6 %  ( 56# + 
 O4# ) ! "% 			H	% M M M:    _d-.	-.XY	[-. T<5<<	8YZZ[-. 
-.-.` 
*.5lpq-9  %	%
LM	O% 
%%$ /C.DE& F& ,B+CD# E#< 1N0OP5
VW	Y5
 
5 Q5(D):$; "DsCx,A [tCy [#c( [WZ]aWa [6     T #  	
   t :  S c V[ !/2CGQV6S=S=!S=/2S=CGS=QTS=S=l)!)!)!(+)!DG$J)!4Z)!Xd 3 4 0S 0S 0U3d
?=S 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r3   