o
    eiu+                     @   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_factory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    \/home/ubuntu/transcripts/venv/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)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_id	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   root_ctxreserved_commandsr.   r   raw_urlresponseetmp_dirtmp_executabler0   r    r    r!   extension_install<   s\   
"

rS   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_settingsr#   rC   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_namerE   is_filer
   _execute_extension_binarylistr[   typerExit)r$   rC   r   r   	exit_coder    r    r!   extension_exec   s   rd   r`   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 )COMMAND
REPOSITORYINSTALLED_AT)headers)_get_extensions_rootis_dirrJ   sortediterdirrC   
startswithMANIFEST_FILENAMEr^   jsonloads	read_textr   r=   appendr   )root_dirrowsr.   r   manifest_path
repositoryr   datar    r    r!   extension_list   s*   r~   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(   rY   zRemoved extension 'r1   N)r]   r8   rp   r
   r:   r;   rJ   )rC   r   r.   r    r    r!   extension_remove   s   
r   r[   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   -re   rf   r   rZ   )rs   rE   r^   r_   r`   )r[   r   command_namer   r   r    r    r!   %_dispatch_unknown_top_level_extension   s   
r   r.   r/   r0   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
rh   ri   )ignore_errors)r   rt   mkdirr:   copy2rB   rC   rD   
write_textru   dumpsr   r?   r;   )r.   r/   r0   r   r{   r    r    r!   rI      s   

(rI   c                  C   s   t  } | jddd | S )NTr   )EXTENSIONS_ROOT
expanduserr   )ry   r    r    r!   ro      s   ro   r   c                 C   sF   t | | d}t  }|d|   }||jvr!td|  d|S )Noriginal_inputre   Invalid extension name 'r1   )_validate_extension_short_namero   resolver   r
   )r   	safe_nameroottargetr    r    r!   r8      s   

r8   c                 C   s    d|  }t jdkr|d7 }|S )Nre   r+   z.exe)rB   rC   )r   rC   r    r    r!   r<     s   

r<   c                 C   s   t | t|  S N)r8   r<   )r   r    r    r!   rE   
  s   rE   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rC   r    r!   	<genexpr>  s    z1_validate_extension_short_name.<locals>.<genexpr>)r)   \r   r1   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   r   z%Expected `[OWNER/]REPO` format, got 'r1   re   z6Extension repository name must start with 'hf-', got 'rf   z(Invalid extension repository name 'hf-'.r   )r
   splitlenDEFAULT_EXTENSION_OWNERallrs   r   )r   partsr   rK   r   r    r    r!   r2      s    




r2   c                 C   s:   |   }|s
td|dr|dd  n|}t|| dS )Nr   re   rf   r   )r   r
   rs   r   )rC   	candidate
normalizedr    r    r!   r]   8  s
   r]   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   OSErrorrB   rC   errnoENOEXEC)r   r[   rP   r    r    r!   r_   @  s   "r_   )F)r&   N);__doc__r   ru   rB   rer:   r   dataclassesr   r   r   r   pathlibr   tempfiler   typingr   r	   ra   huggingface_hub.errorsr
   huggingface_hub.utilsr   r   
_cli_utilsr   r   r   rt   EXTENSIONS_HELPextensions_clir   r6   Contextr   ArgumentboolOptionrS   rd   r~   r   r`   r4   intr   rI   ro   r8   r<   rE   compiler   r   tupler2   r]   r_   r    r    r    r!   <module>   s   

>


"	
