
    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j+                  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$dHdedede%defdZ&	 dId e!e   de#dz  de!e    fd!Z'	 dId 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.Z1d/e#d0e#d,eddfd1Z2d2e3d0e#d,eddfd3Z4d4e#d5e)e#d6f   de)e#d6f   dz  fd7Z5d8ed9e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?Z9d@e!e    de#dz  de!e    fdAZ:dede#fdBZ;dCe,e#ef   defdDZ<dIdEe#dFe,e#ef   dz  defdGZ=y)JzNInternal 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<   y)MarketplaceSkillname	repo_pathN)__name__
__module____qualname__str__annotations__     l/var/www/vps2.regionflexible.com/Desarrollo/venv/lib/python3.12/site-packages/huggingface_hub/cli/_skills.pyr   r   #   s    
INr    r   c                   "    e Zd ZU eed<   eed<   y)InstalledSkillManifestschema_versioninstalled_revisionN)r   r   r   intr   r   r   r    r!   r#   r#   )   s    r    r#   c                   h    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<   y)SkillUpdateInfor   	skill_dirstatusNdetailcurrent_revisionavailable_revision)
r   r   r   r   r   r   SkillUpdateStatusr+   r,   r-   r   r    r!   r(   r(   /   s>    
IOFC$J#'cDj'%)d
)r    r(   returnc            	      v   t               } | j                  d      }t        |t              st	        d      g }|D ]{  }t        |t
              s|j                  d      }|j                  d      }t        |t              rt        |t              sW|j                  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&D<PQW<XYZ[ Mr    selectorc                 ^    t        t               |       }|t        d|  dt         d      |S )z$Resolve a marketplace skill by name.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   sH    ()@)BHMHhZ/E.F GQ Q
 	
 Or    skilldestination_rootforcec                 J   |j                         j                         }|j                  dd       || j                  z  }|j	                         r|st        d|       |j	                         rdt        j                  |d|j                   d      5 }t        |      }||j                  z  }t        | |       t        ||       d	d	d	       |S 	 t        | |       |S # 1 sw Y   |S xY w# t        $ r' |j	                         rt        j                  |        w xY w)
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$7"UZZ/KE 6{mDEE((-=+JZJZI[[dFef 	Wju;'G ;#3#33J!:F%;:V		W
 E{C
 	W
   MM+&s   5C%C2 %C/20D"rootsc                     t               D ci c]  }|j                  j                         | }}t        |       D cg c]  }t	        ||       }}t        ||      }||st        d| d      |S c c}w c c}w )z:Check managed skill installs for newer upstream revisions.zNo installed skills match ''.)r=   r   lower_iter_unique_skill_dirs_evaluate_update_filter_updatesr	   )ra   r>   rE   marketplace_skillsr)   updatesfiltereds          r!   check_for_updatesrk   q   s    
 BYAZ[%****,e3[[PghmPno9	+=>oGow1HH4XJbABBO \os
   "A4A9c                 d    t        | |      }g }|D ]  }|j                  t        |              |S )zCUpgrade managed skills in place when the upstream revision changes.)rk   r8   _apply_single_update)ra   r>   ri   resultsupdates        r!   apply_updatesrp   ~   s;    
  x0G%'G 5+F345Nr    r)   c                 @   | t         z  }|j                         sy	 t        j                  |j	                  d            }t        |t              sy	 t        |      dfS # t
        $ r}dd| fcY d}~S d}~ww xY w# 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!,**]44g4FG gt$6.w7==  ,~cU+++,  SX~s;   %A  A=  	A:)A5/A:5A:=	BBBBmanifestc                     |j                   |j                  d}| t        z  j                  t	        j
                  |dd      dz   d       y )Nr$   r%      T)indent	sort_keys
rr   rs   )r$   r%   ru   
write_textrv   dumps)r)   r~   r:   s      r!   write_installed_skill_manifestr      sN    "11&99G ((44

715< 5 r    c                  N   t        dt         dt        i      } 	 | j                         }t        |t              st        d      |j                  d      }|j                  d      }t        |t              r|d	k7  rt        d
      	 t        j                  |      j                  d      }t        j                  |      }t        |t              st        d      |S # t        $ r}t        dt         d|       |d }~ww xY w# t        $ r}t        d|       |d }~ww xY w)Nz	contents/refparamsz3Failed to decode GitHub API response for 'contents/z': z5Invalid marketplace response: expected a JSON object.contentrt   base64z=Invalid marketplace payload: expected base64-encoded content.rr   z&Failed to decode marketplace payload: z4Invalid marketplace payload: expected a JSON object.)_fetch_from_skills_repoMARKETPLACE_PATHDEFAULT_SKILLS_REFrv   r[   r	   r5   r7   r4   r   r   	b64decodedecoderw   )responser:   r|   r   rt   decodedparseds          r!   r3   r3      s,   &
$%&)*Hr--/ gt$NOOkk)$G{{:&Hgs#x8';VWWP""7+227;G$ fd#MNNM%  rLM]L^^abeafghnqqr  P?uEFCOPs/   C  
9D  	D)C??D	D$DD$r;   c                     |j                         j                         }| D ]#  }|j                  j                         |k(  s!|c S  y Nstriprd   r   )r;   r>   selector_lowerrE   s       r!   rA   rA      sE    ^^%++-N ::/L r    pathc                     | j                         }|j                  d      r|dd  }|j                  d      r|j                  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FGGr    rO   c                     t        |       }|j                  dd       t        || j                  |       t	        |       t        |t        t        |             y )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      sX    4U;dT2#OO
 "+."81	
r    c                 J    | dz  }|j                         st        d|       y )NzSKILL.mdz%Installed skill is missing SKILL.md: )is_fileRuntimeError)r)   
skill_files     r!   r   r      s0    Z'JB:,OPP  r    r   r   c                 P    t        d|        j                  }t        |||       y )Nztarball/)r   rO   )r   r   _extract_tar_subpath)r   r   rO   	tar_bytess       r!   r   r      s%    '(8*(=>FFIUr    r   c                    t        |      j                  }t        j                  t	        j
                  |       d      5 }|j                         }d}|D ]  }t        |j                  |      }||sd}"d}t        | }	d|	j                  v rt        d| d	      ||	z  }
|j                         r|
j                  dd
       r|j                         s|
j                  j                  dd
       |j                  |      }|t        d|j                   d	      |
j!                  |j#                                 	 ddd       st%        d| d      y# 1 sw Y   xY w)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      sn    !-33L	bjj3%	@ ;G$$& 	;F3ZfgN%!G .1M}***"%G}TU#VWW*]:||~ &&td&C==?##))$)F++F3I "%7}A#FGG(()9:+	;;2 &5S TUU 3; ;s    DEE&r   r   .c                    t        |       j                  }t        |d t        |             |k(  r|t        |      d  S t        |      t        |      kD  r.t        |ddt        |      z          |k(  r|dt        |      z   d  S y )Nr   )r   r   tuplelen)r   r   
path_partss      r!   r   r     s    {+11JZ+#l+,-=#l+-..
:\**uZALHYDY5Z/[_k/k!c,//122r    rP   rQ   c                 *   |j                   | j                   dz  }	 | j                  |       |j                  |        t        j                  |       y # t
        $ r3 |j                         r!| j                         s|j                  |         w xY w)Nz.backup)r   r   renamer\   r]   r[   rU   )rP   rQ   
backup_dirs      r!   rZ   rZ     s    ""(9(9':'%BBJJ','j! |':':'<l+s   7A <Bc                    t               }g }| D ]  }|j                         j                         }|j                         s2t	        |j                               D ]  }|j                  j                  d      r|j                         s|j                         s@|j                         }||v s|j                         se|j                  |       |j                  |         |S )NrL   )setrR   rS   is_dirsortediterdirr   r   
is_symlinkaddr8   )ra   seen
discoveredrootchildresolveds         r!   re   re   *  s    eDJ ( ((*{{}DLLN+ 		(Ezz$$S)<<>%*:*:*<}}H4x'8HHXh'		(	( r    rh   c           	          t        | j                  | d      }t        |       \  }}|t        ||rd|      S d|      S |j	                  | j                  j                               }|.t        |dd| j                   dt         d|j                  	      S |j                  }	 t        |      }||k(  rd
nd}	t        ||	|	dk(  rdnd ||      S # t        $ r"}t        |dt        |      |	      cY d }~S d }~ww xY w)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   rd   rB   r%   r   r[   r   )
r)   rh   baser~   errorrE   r,   r-   r|   r*   s
             r!   rf   rf   >  s#   	)KXD3I>OHet%$6Y^__[Y^__""9>>#7#7#9:E}'Y^^,,HI_H``ab%88	
 	
  22n8? 1CFV0V\nF%+/A%A!t)- 	  nt$8S\lmmns   'C 	C=C82C=8C=ro   c                    | j                   dk7  r| S 	 t        | j                  j                        }t	        || j                  j
                  d       t        | dd      S # t        $ r!}t        | dt        |            cY d }~S d }~ww xY w)Nr   T)rG   r   r   r   )	r*   rD   r)   r   r`   r   r[   r   r   )ro   rE   r|   s      r!   rm   rm   ^  s    }}**M%f&6&6&;&;<!%)9)9)@)@M 6)I>>  Mv&:3s8LLMs   AA" "	B+BBBri   c                     || S |j                         j                         }| D cg c]"  }|j                  j                         |k(  s!|$ c}S c c}w r   r   )ri   r>   r   ro   s       r!   rg   rg   k  sJ    ^^%++-N!(RvFKK,=,=,?>,QFRRRs   "A
Ac                    t        dt        | j                  dd      }	 |j                         }t        |t              r|st        d| j                   d      |d   }t        |t              st        d	| j                   d      |j                  d
      }t        |t              r|st        d	| j                   d      |S # t        $ r}t        d|       |d }~ww xY w)Ncommitsr   )shar   per_pager   z4Failed to decode GitHub API response for 'commits': z2Unable to resolve the current revision for skill 'rc   r   z/Invalid commit response while resolving skill 'r   )r   r   r   rv   r[   r	   r5   r6   r   r7   r4   r   )rE   r   r:   r|   latestr   s         r!   r   r   r  s    &)5??PQRH^--/ gt$GKEJJ<WYZ[[QZFfd#HTVWXXzz% Hh$HHTVWXXO  ^McUSTZ]]^s   C 	C%C  C%r:   c                     | j                  d      t        k7  rt        d| j                  d             | j                  d      }t        |t              r|st        d      t        t        |      S )Nr$   zunsupported schema_version: r%   zmissing installed_revisionr   )r4   r   rz   r5   r   r#   )r:   r%   s     r!   ry   ry     sp    {{#$(EE7DT8U7VWXX %9:(#.6H566!4- r    endpointr   c           	         dt          dt         d| j                  d       }	 t               j	                  ||ddidt
              }|j                          |S # t        $ r}t        d|  dt         d	|       |d }~ww xY w)
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    )*C)DAF^E__`aiapapqtau`v
wC
f=$$<=!& % 
 	!!# O  f*8*G<R;SSUVYUZ[\beefs   4A 	B#A<<B)Fr   )>__doc__r   r   rv   r\   r   rW   dataclassesr   r   pathlibr   r   typingr   r   huggingface_hub.errorsr	   huggingface_hub.utilsr
   rB   splitr   r   r   r   r   ru   r   r.   r   r#   r(   r6   r=   r   rD   boolr`   rk   rp   r   r}   r   r7   r3   rA   r9   rY   r   r   bytesr   r   rZ   re   rf   rm   rg   r   ry   r   r   r    r!   <module>r      s   T  	     * '  + - . 6L6R6RSV6W 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V# VC Vd VW[ V
!VE !V !V$ !VSW !VH 5c? uUXZ]U]aeOe 	D 	d 	t 	4: $t* ( $sDT?T:U Zi @
? 
?_ 
?ST/2 ScDj STRaMb S'7 C ,T#s(^ @V c 4S>D3H TW r    