o
    Ziu+                     @   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mZm	Z	 ddl
m
Z
mZ ddlmZ ddlmZ ddlmZmZ ddlZddlmZ dd	lmZmZ d
dlmZ dZedZdZdZeedZe	G dd dZ ej!dddgd	dQdej"dee#ej$ddf dee%ej&dddf ddfdd Z'ej!d!d"dd"d#d$d%gd&dej"d'ee#ej$d(df ddfd)d*Z(ej!d+d,gddRd-d.Z)ej!d/d0gdd'ee#ej$d1df ddfd2d3Z*d4e+e# d5e,e# dee- fd6d7Z.d8ed9ed:e ddfd;d<Z/defd=d>Z0d?e#defd@dAZ1d?e#de#fdBdCZ2d?e#defdDdEZ3e4dFZ5d?e#dGe#de#fdHdIZ6de#de7e#e#e#f fdJdKZ8d'e#de#fdLdMZ9dNed4e+e# de-fdOdPZ:dS )Sz0Contains helper utilities for hf CLI extensions.    N)asdict	dataclass)datetimetimezone)Path)TemporaryDirectory)	AnnotatedOptional)CLIError)get_sessiontabulate   )typer_factoryZhuggingfacez~/.local/share/hf/extensionszmanifest.jsonzyManage hf CLI extensions.

Security Warning: extensions are third-party executables. Install only from sources you trust.)helpc                   @   sV   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d< eed	< d
S )ExtensionManifestownerreporepo_id
short_nameexecutable_nameexecutable_pathtypeinstalled_atsourceN)__name__
__module____qualname__str__annotations__ r   r   U/home/app/Keep/.python/lib/python3.10/site-packages/huggingface_hub/cli/extensions.pyr   /   s   
 r   installzhf extensions install hf-claudez-hf extensions install hanouticelina/hf-claude)examplesFctxr   z:GitHub extension repository in `[OWNER/]hf-<name>` format.forcez--forcezOverwrite if already installed.returnc                 C   s  t |\}}}|  }tt|jdi  }||v r%td| d| dt|}| r<|s7td| dt	
| t|}	d| d| d	|	 }
zt j|
d
d}|  W n tyv } ztd|	 d| d| d| |d}~ww t H}t||	 }||j tjdkrt|d t||| d| ||	tt|dttj d| d| d	}t|||d W d   n1 sw   Y  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. 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.z"https://raw.githubusercontent.com//z/refs/heads/main/T)Zfollow_redirectszFailed to download 'z' from 'z': Nnt  binaryzhttps://github.com/)	r   r   r   r   r   r   r   r   r   )extension_dirsource_executablemanifestzInstalled extension ''.zRun it with: hf zOr with: hf extensions exec )!_normalize_repo_idZ	find_rootsetgetattrcommandkeysr
   _get_extension_direxistsshutilrmtree_get_executable_namer   getraise_for_status	Exceptionr   r   write_bytescontentosnamechmodr   r   _get_extension_executable_pathr   nowr   utc	isoformat_persist_installed_extensionprint)r#   r   r$   r   	repo_namer   Zroot_ctxZreserved_commandsr,   r   Zraw_urlresponseeZtmp_dirZtmp_executabler.   r   r   r    extension_install<   s\   
"

rK   execT)Zallow_extra_argsallow_interspersed_argsZignore_unknown_optionsz#hf extensions exec claude -- --helpz/hf extensions exec claude --model zai-org/GLM-5)Zcontext_settingsr"   r@   z.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.r'   ' is not installed.r   args)code)	_normalize_extension_namerB   is_filer
   _execute_extension_binarylistrP   typerZExit)r#   r@   r   r   	exit_coder   r   r    extension_exec   s   rX   rU   zhf extensions listc                  C   s   t  } |  std dS g }t|  D ]D}| r!|jds"q|jdd }|t }d}d}| rNt	
|jdd}t|dd}t|d	d}|d
| ||g q|sbtd dS tt|g dd dS )z"List installed extension commands.zNo extensions installed.Nhf-    utf-8encodingr   r   zhf )ZCOMMANDZ
REPOSITORYZINSTALLED_AT)headers)_get_extensions_rootis_dirrG   sortediterdirr@   
startswithMANIFEST_FILENAMErS   jsonloads	read_textr   r:   appendr   )root_dirrowsr,   r   manifest_path
repositoryr   datar   r   r    extension_list   s*   ro   removez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.r'   rN   zRemoved extension 'r/   N)rR   r5   ra   r
   r7   r8   rG   )r@   r   r,   r   r   r    extension_remove   s   
rq   rP   known_commandsc                 C   sx   | sd S | d }| drd S ||v rd S | dr |dd  n|}|s&d S t|}| s0d S t|t| dd  dS )Nr   -rY   rZ   r   rO   )rd   rB   rS   rT   rU   )rP   rr   Zcommand_namer   r   r   r   r    %_dispatch_unknown_top_level_extension   s   
rt   r,   r-   r.   c                 C   s   | |j  }| t }z,| jddd t|| tjdkr"t|d |jt	j
t|dddd d	d
 W d S  tyD   tj| dd  w )NTFparentsexist_okr)   r*      )indent	sort_keys
r\   r]   )ignore_errors)r   re   mkdirr7   copy2r?   r@   rA   
write_textrf   dumpsr   r<   r8   )r,   r-   r.   r   rl   r   r   r    rF      s   

(rF   c                  C   s   t  } | jddd | S )NTru   )EXTENSIONS_ROOT
expanduserr}   )rj   r   r   r    r`      s   r`   r   c                 C   sF   t | | d}t  }|d|   }||jvr!td|  d|S )Noriginal_inputrY   Invalid extension name 'r/   )_validate_extension_short_namer`   resolverv   r
   )r   	safe_nameroottargetr   r   r    r5      s   

r5   c                 C   s    d|  }t jdkr|d7 }|S )NrY   r)   z.exe)r?   r@   )r   r@   r   r   r    r9     s   

r9   c                 C   s   t | t|  S N)r5   r9   )r   r   r   r    rB   
  s   rB   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   ).0sepr@   r   r    	<genexpr>  s    z1_validate_extension_short_name.<locals>.<genexpr>)r(   \r   r/   z..:z9'. Allowed characters: letters, digits, '.', '_' and '-'.)stripr
   any_ALLOWED_EXTENSION_NAME	fullmatch)r   r   r   r   r    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.r(   r   r   rx   z%Expected `[OWNER/]REPO` format, got 'r/   rY   z6Extension repository name must start with 'hf-', got 'rZ   z(Invalid extension repository name 'hf-'.r   )r
   splitlenDEFAULT_EXTENSION_OWNERallrd   r   )r   partsr   rH   r   r   r   r    r0      s    




r0   c                 C   s:   |   }|s
td|dr|dd  n|}t|| dS )Nr   rY   rZ   r   )r   r
   rd   r   )r@   	candidate
normalizedr   r   r    rR   8  s
   rR   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)
subprocesscallr   OSErrorr?   r@   errnoZENOEXEC)r   rP   rJ   r   r   r    rT   @  s   "rT   )F)r%   N);__doc__r   rf   r?   rer7   r   dataclassesr   r   r   r   pathlibr   tempfiler   typingr   r	   rV   Zhuggingface_hub.errorsr
   Zhuggingface_hub.utilsr   r   Z
_cli_utilsr   r   r   re   ZEXTENSIONS_HELPZextensions_clir   r3   Contextr   ZArgumentboolOptionrK   rX   ro   rq   rU   r1   intrt   rF   r`   r5   r9   rB   compiler   r   tupler0   rR   rT   r   r   r   r    <module>   s   

>


"	
