
    %i<              	       `   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mZ ddlmZ ddlmZ dZe                    d	          \  ZZd
ZdZdZdZdZed         Z ed           G d d                      Z ed           G d d                      Z ed           G d d                      Z de!e         fdZ"de#defdZ$dIdedede%defd Z&	 dJd!e!e         de#dz  de!e          fd"Z'	 dJd!e!e         de#dz  de!e          fd#Z(d$ede)edz  e#dz  f         fd%Z*d$ed&eddfd'Z+de,e#ef         fd(Z-d)e!e         de#dedz  fd*Z.d+e#de#fd,Z/ded-eddfd.Z0d$eddfd/Z1d0e#d1e#d-eddfd2Z2d3e3d1e#d-eddfd4Z4d5e#d6e)e#d7f         de)e#d7f         dz  fd8Z5d9ed:eddfd;Z6d!e!e         de!e         fd<Z7d$ed=e,e#ef         de fd>Z8d?e de fd@Z9dAe!e          de#dz  de!e          fdBZ:dede#fdCZ;dDe,e#ef         defdEZ<dJdFe#dGe,e#ef         dz  defdHZ=dS )KzNInternal helpers for Hugging Face marketplace skill installation and upgrades.    N)	dataclassreplace)PathPurePosixPath)AnyLiteral)CLIError)get_sessionzhuggingface/skills/mainz.claude-plugin/marketplace.json
   z.hf-skill-manifest.json   )
up_to_dateupdate_availableupdated	unmanagedinvalid_metadatasource_unreachableT)frozenc                   $    e Zd ZU eed<   eed<   dS )MarketplaceSkillname	repo_pathN)__name__
__module____qualname__str__annotations__     d/home/longshao/.hermes/hermes-agent/venv/lib/python3.11/site-packages/huggingface_hub/cli/_skills.pyr   r   #   s"         
IIINNNNNr    r   c                   $    e Zd ZU eed<   eed<   dS )InstalledSkillManifestschema_versioninstalled_revisionN)r   r   r   intr   r   r   r    r!   r#   r#   )   s*         r    r#   c                   j    e Zd ZU eed<   eed<   eed<   dZedz  ed<   dZedz  ed<   dZ	edz  ed<   dS )SkillUpdateInfor   	skill_dirstatusNdetailcurrent_revisionavailable_revision)
r   r   r   r   r   r   SkillUpdateStatusr+   r,   r-   r   r    r!   r(   r(   /   sn         
IIIOOOFC$J#'cDj'''%)d
)))))r    r(   returnc            	         t                      } |                     d          }t          |t                    st	          d          g }|D ]}t          |t
                    s|                    d          }|                    d          }t          |t                    rt          |t                    sm|                    t          |t          |                               |S )z6Load skills from the default Hugging Face marketplace.pluginszAInvalid marketplace payload: expected a top-level 'plugins' list.r   source)r   r   )
_load_marketplace_payloadget
isinstancelistr	   dictr   appendr   _normalize_repo_path)payloadr1   skillspluginr   r2   s         r!   load_marketplace_skillsr=   9   s    '))Gkk)$$Ggt$$ \Z[[[%'F [ [&$'' 	zz&!!H%%$$$ 	Jvs,C,C 	&D<PQW<X<XYYYZZZZMr    selectorc                 x    t          t                      |           }|t          d|  dt           d          |S )z$Resolve a marketplace skill by name.NSkill 'z' not found in zD. Try `hf skills add` to install `hf-cli` or use a known skill name.)_select_marketplace_skillr=   r	   DEFAULT_SKILLS_REPO_ID)r>   selecteds     r!   get_marketplace_skillrD   L   s`    ()@)B)BHMMHQh Q Q/E Q Q Q
 
 	
 Or    Fskilldestination_rootforcec                    |                                                                 }|                    dd           || j        z  }|                                r|st          d|           |                                rtt          j        |d|j         d          5 }t          |          }||j        z  }t          | |           t          ||           d	d	d	           n# 1 swxY w Y   |S 	 t          | |           n7# t          $ r* |                                rt          j        |            w xY w|S )
z:Install a marketplace skill into a local skills directory.Tparentsexist_okzSkill already exists: .z	.install-)dirprefix)rE   install_dir)existing_dir
staged_dirN)
expanduserresolvemkdirr   existsFileExistsErrortempfileTemporaryDirectoryr   _populate_install_dir_atomic_replace_directory	Exceptionshutilrmtree)rE   rF   rG   rO   tmp_dir_strtmp_dirrQ   s          r!   install_marketplace_skillr`   W   s   '2244<<>>4$777"UZ/K FE FD{DDEEE (-=Fe+JZFeFeFefff 	Wju;''G ;#33J!:FFFF%;:VVVV		W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W
 E{CCCCC    	'M+&&& s   #<C++C/2C/9D 4D?rootsc                     d t                      D             fdt          |           D             }t          ||          }||st          d| d          |S )z:Check managed skill installs for newer upstream revisions.c                 B    i | ]}|j                                         |S r   r   lower).0rE   s     r!   
<dictcomp>z%check_for_updates.<locals>.<dictcomp>v   s(    [[[%***,,e[[[r    c                 0    g | ]}t          |          S r   )_evaluate_update)rf   r)   marketplace_skillss     r!   
<listcomp>z%check_for_updates.<locals>.<listcomp>w   s%    ooo9	+=>>ooor    NzNo installed skills match ''.)r=   _iter_unique_skill_dirs_filter_updatesr	   )ra   r>   updatesfilteredrj   s       @r!   check_for_updatesrq   q   s}    
 \[AXAZAZ[[[ooooPghmPnPnoooGw11HHAXAAABBBOr    c                 x    t          | |          }g }|D ]$}|                    t          |                     %|S )zCUpgrade managed skills in place when the upstream revision changes.)rq   r8   _apply_single_update)ra   r>   ro   resultsupdates        r!   apply_updatesrv   ~   sJ    
  x00G%'G 5 5+F334444Nr    r)   c                 t   | t           z  }|                                sdS 	 t          j        |                    d                    }n# t
          $ r}dd| fcY d}~S d}~ww xY wt          |t                    sdS 	 t          |          dfS # t          $ r}dt          |          fcY d}~S d}~ww xY w)z5Read local skill metadata written by `hf skills add`.)NNutf-8encodingNzinvalid json: )Nzmetadata root must be an object)SKILL_MANIFEST_FILENAMErU   jsonloads	read_textr[   r5   r7   _parse_installed_skill_manifest
ValueErrorr   )r)   manifest_pathr:   excs       r!   read_installed_skill_manifestr      s     77M!! z,*]44g4FFGG , , ,+c+++++++++,gt$$ 766.w77==   SXX~s;   (A 
A&A!A&!A&B 
B7B2,B72B7manifestc                     |j         |j        d}| t          z                      t	          j        |dd          dz   d           d S )Nr$   r%      T)indent	sort_keys
rx   ry   )r$   r%   r{   
write_textr|   dumps)r)   r   r:   s      r!   write_installed_skill_manifestr      se    "1&9 G ((44
71555< 5     r    c                     t          dt           dt          i          } 	 |                                 }n-# t          $ r }t          dt           d|           |d }~ww xY wt          |t                    st          d          |                    d          }|                    d          }t          |t                    r|d	k    rt          d
          	 t          j        |                              d          }t          j        |          }n%# t          $ r}t          d|           |d }~ww xY wt          |t                    st          d          |S )Nz	contents/refparamsz3Failed to decode GitHub API response for 'contents/z': z5Invalid marketplace response: expected a JSON object.contentrz   base64z=Invalid marketplace payload: expected base64-encoded content.rx   z&Failed to decode marketplace payload: z4Invalid marketplace payload: expected a JSON object.)_fetch_from_skills_repoMARKETPLACE_PATHDEFAULT_SKILLS_REFr|   r[   r	   r5   r7   r4   r   r   	b64decodedecoder}   )responser:   r   r   rz   decodedparseds          r!   r3   r3      s   &&$&&)*  Hr--// r r rgM]ggbegghhnqqrgt$$ PNOOOkk)$$G{{:&&Hgs## Xx8';';VWWWP"7++227;;G$$ P P PEEEFFCOP fd## OMNNNMs-   7 
A!AA!;D 
D;#D66D;r;   c                     |                                                                 }| D ]#}|j                                        |k    r|c S $d S N)stripre   r   )r;   r>   selector_lowerrE   s       r!   rA   rA      sX    ^^%%++--N  ://LLL 04r    pathc                     |                                  }|                    d          r|dd          }|                    d          |                     d          }|st          d          |S )Nz./r   r   z-Invalid marketplace entry: empty source path.)r   
startswithr	   )r   
normalizeds     r!   r9   r9      s{    J



%
% $^
 


%
% $!!#&&J HFGGGr    rO   c                     t          |           }|                    dd           t          || j        |           t	          |           t          |t          t          |                     d S )NTrI   )revisionsource_pathrO   r   )_resolve_available_revisionrT   _extract_remote_github_pathr   _validate_installed_skill_dirr   r#   SKILL_MANIFEST_SCHEMA_VERSION)rE   rO   r%   s      r!   rY   rY      s    4U;;dT222#O   
 "+..."81	
 	
 	
    r    c                 \    | dz  }|                                 st          d|           d S )NzSKILL.mdz%Installed skill is missing SKILL.md: )is_fileRuntimeError)r)   
skill_files     r!   r   r      sD    Z'J QO:OOPPPQ Qr    r   r   c                 X    t          d|            j        }t          |||           d S )Nztarball/)r   rO   )r   r   _extract_tar_subpath)r   r   rO   	tar_bytess       r!   r   r      s6    '(=8(=(=>>FIUUUUUUr    r   c                    t          |          j        }t          j        t	          j        |           d          5 }|                                }d}|D ] }t          |j        |          }||sd}!d}t          | }	d|	j        v rt          d| d	          ||	z  }
|                                r|
                    dd
           y|                                s|
j                            dd
           |                    |          }|t          d|j         d	          |
                    |                                           	 ddd           n# 1 swxY w Y   |st%          d| d          dS )zExtract a skill subdirectory from a tar archive.

    GitHub tarballs include a leading `<repo>-<revision>/` directory. The helper also
    accepts archives that start directly at `skills/<name>/...` to keep tests simple.
    zr:*)fileobjmodeF)member_namesource_partsNTz..z"Invalid path found in archive for rL   rI   zFailed to extract zPath 'z' not found in source archive.)r   partstarfileopenioBytesIO
getmembers_member_relative_partsr   r   r   isdirrT   isfileparentextractfilewrite_bytesreadFileNotFoundError)r   r   rO   r   archivemembersmatchedmemberrelative_partsrelative_pathdestination_path	extracteds               r!   r   r      s    !--3L	bj33%	@	@	@ ;G$$&& 	; 	;F3ZfgggN%! G .1M}***"#V#V#V#VWWW*]:||~~  &&td&CCC==?? #))$)FFF++F33I "#F#F#F#FGGG(()9)9::::+	;; ; ; ; ; ; ; ; ; ; ; ; ; ; ;2  V T T T TUUUV Vs   DE%%E),E)r   r   .c                 v   t          |           j        }t          |d t          |                             |k    r|t          |          d          S t          |          t          |          k    rEt          |ddt          |          z                      |k    r|dt          |          z   d          S d S )Nr   )r   r   tuplelen)r   r   
path_partss      r!   r   r     s    {++1JZ+#l+++,--==#l++--..
:\****uZALHYHYDY@Y5Z/[/[_k/k/k!c,///11224r    rP   rQ   c                 @   |j         | j         dz  }	 |                     |           |                    |            t          j        |           d S # t
          $ r? |                                r)|                                 s|                    |             w xY w)Nz.backup)r   r   renamer\   r]   r[   rU   )rP   rQ   
backup_dirs      r!   rZ   rZ     s    "(9%B%B%BBJJ''','''j!!!!!    	,|':':'<'< 	,l+++s   >A A	Bc                 $   t                      }g }| D ]}|                                                                }|                                s=t	          |                                          D ]}|j                            d          r|                                s|                                sF|                                }||v s|                                ss|	                    |           |
                    |           |S )NrL   )setrR   rS   is_dirsortediterdirr   r   
is_symlinkaddr8   )ra   seen
discoveredrootchildresolveds         r!   rm   rm   *  s   eeDJ ( (  ((**{{}} 	DLLNN++ 		( 		(Ez$$S)) <<>> %*:*:*<*< }}H4x'8'8HHXh''''		( r    rj   c           	         t          | j        | d          }t          |           \  }}|t          ||rdnd|          S |                    | j                                                  }|)t          |dd| j         dt           d|j        	          S |j        }	 t          |          }n7# t          $ r*}t          |dt          |          |	          cY d }~S d }~ww xY w||k    rd
nd}	t          ||	|	dk    rdnd ||          S )Nr   )r   r)   r*   r   r*   r+   r   r@   z' is no longer available in rL   )r*   r+   r,   r   r   zupdate available)r*   r+   r,   r-   )r(   r   r   r   r4   re   rB   r%   r   r[   r   )
r)   rj   baser   errorrE   r,   r-   r   r*   s
             r!   ri   ri   >  st   	)KXXXD3I>>OHet%$P$6$6[Y^____""9>#7#7#9#9::E}'bY^bbI_bbb%8	
 
 
 	
  2n8?? n n nt$8S\lmmmmmmmmmn 1CFV0V0V\nF%+/A%A%A!!t)-   s   !B1 1
C%;C C% C%ru   c                    | j         dk    r| S 	 t          | j        j                  }t	          || j        j        d           n6# t          $ r)}t          | dt          |                    cY d }~S d }~ww xY wt          | dd          S )Nr   T)rG   r   r   r   )	r*   rD   r)   r   r`   r   r[   r   r   )ru   rE   r   s      r!   rs   rs   ^  s    }***M%f&6&;<<!%)9)@MMMMM M M Mv&:3s88LLLLLLLLLM 6)I>>>>s   5A 
A8A3-A83A8ro   c                 t    || S |                                                                 fd| D             S )Nc                 N    g | ]!}|j                                         k    |"S r   rd   )rf   ru   r   s     r!   rk   z#_filter_updates.<locals>.<listcomp>o  s1    RRRvFK,=,=,?,?>,Q,QF,Q,Q,Qr    )r   re   )ro   r>   r   s     @r!   rn   rn   k  sC    ^^%%++--NRRRRRRRRr    c                 
   t          dt          | j        dd          }	 |                                }n%# t          $ r}t          d|           |d }~ww xY wt          |t                    r|st          d| j         d          |d         }t          |t                    st          d	| j         d          |
                    d
          }t          |t                    r|st          d	| j         d          |S )Ncommitsr   )shar   per_pager   z4Failed to decode GitHub API response for 'commits': z2Unable to resolve the current revision for skill 'rl   r   z/Invalid commit response while resolving skill 'r   )r   r   r   r|   r[   r	   r5   r6   r   r7   r4   r   )rE   r   r:   r   latestr   s         r!   r   r   r  s7   &)5?PQRR  H^--// ^ ^ ^ScSSTTZ]]^gt$$ \G \ZEJZZZ[[[QZFfd## YWWWWXXXzz%  Hh$$ YH YWWWWXXXOs   6 
A AAr:   c                 *   |                      d          t          k    r%t          d|                      d                     |                      d          }t          |t                    r|st          d          t          t          |          S )Nr$   zunsupported schema_version: r%   zmissing installed_revisionr   )r4   r   r   r5   r   r#   )r:   r%   s     r!   r   r     s    {{#$$(EEEWDT8U8UWWXXX %9::(#.. 76H 75666!4-   r    endpointr   c           	      <   dt            dt           d|                     d           }	 t                                          ||ddidt
                    }|                                 n0# t          $ r#}t          d|  dt           d	|           |d }~ww xY w|S )
Nzhttps://api.github.com/repos/r   Acceptzapplication/vnd.github+jsonT)r   headersfollow_redirectstimeoutzFailed to fetch 'z' from z: )
DEFAULT_SKILLS_REPO_OWNERDEFAULT_SKILLS_REPO_NAMElstripr
   r4   GITHUB_API_TIMEOUTraise_for_statusr[   r	   rB   )r   r   urlr   r   s        r!   r   r     s    
w*C
w
wF^
w
waiapapqtauau
w
wC
f==$$<=!& % 
 
 	!!#### f f f[8[[<R[[VY[[\\beefOs   AA, ,
B6BB)Fr   )>__doc__r   r   r|   r\   r   rW   dataclassesr   r   pathlibr   r   typingr   r   huggingface_hub.errorsr	   huggingface_hub.utilsr
   rB   splitr   r   r   r   r   r{   r   r.   r   r#   r(   r6   r=   r   rD   boolr`   rq   rv   r   r   r   r7   r3   rA   r9   rY   r   r   bytesr   r   rZ   rm   ri   rs   rn   r   r   r   r   r    r!   <module>r     s/   T T  				     * * * * * * * * ' ' ' ' ' ' ' '         + + + + + + - - - - - - . 6L6R6RSV6W6W 3 3 4  3  !   $       
 $       
 $* * * * * * * *&6!7    &C ,<     %5  VZ gk    8  
 
:
Dj
 
/
 
 
 
  	 	:	Dj	 
/	 	 	 	T e<RUY<Y[^ae[e<e6f    "d >T Y]    4S>    8d+;&<  P`cgPg    s s    !1      $QT Qd Q Q Q QV# VC Vd VW[ V V V V
!VE !V !V$ !VSW !V !V !V !VH 5c? uUXZ]U]aeOe    	D 	d 	t 	 	 	 	4: $t*    ( $sDT?T:U Zi    @
? 
?_ 
? 
? 
? 
?ST/2 ScDj STRaMb S S S S'7 C    ,T#s(^ @V     c 4S>D3H TW      r    