
    ^jf/                        d Z ddlZddlZddlZddlZddlm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	d
lmZ ddlmZ dZdZdZdZed   Z ed       G d d             Z ed       G d d             Zd;dedede defdZ!d;dedede defdZ"d<de#e   d edz  d!ede#e   fd"Z$de#e   fd#Z%d;d$edede defd%Z& ejN                  d&      Z(	 d;d'eded(eegdf   de de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dfd0Z.d$ede#e   fd1Z/d$ed2e#e   d3eddfd4Z0d5ed6eddfd7Z1de#e   de#e   fd8Z2d/ed9e*eef   d!edefd:Z3y)=zNInternal helpers for Hugging Face marketplace skill installation and upgrades.    N)Callable)	dataclassreplace)PathPurePosixPath)AnyLiteral)
BucketFile)CLIError   )disable_progress_bars   )
get_hf_apizhf-clizhuggingface/skillsmarketplace.jsonz.hf-skill-manifest.json)
up_to_date	unmanagedsource_unreachableT)frozenc                   6    e Zd ZU eed<   eed<   dZedz  ed<   y)MarketplaceSkillname	repo_pathNdescription)__name__
__module____qualname__str__annotations__r        f/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/huggingface_hub/cli/_skills.pyr   r      s    
IN"Kt"r    r   c                   @    e Zd ZU eed<   eed<   eed<   dZedz  ed<   y)SkillUpdateInfor   	skill_dirstatusNdetail)r   r   r   r   r   r   SkillUpdateStatusr&   r   r    r!   r#   r#   &   s     
IOFC$Jr    r#   
skill_namedestination_rootforcereturnc                     t               }t               5  t        |      }t        ||       }|t	        d|  dt
         d      t        ||||      cddd       S # 1 sw Y   yxY w)z3Resolve a marketplace skill by name and install it.NSkill 'z' not found in zD. Try `hf skills add` to install `hf-cli` or use a known skill name.r*   )r   r   _load_marketplace_skills_select_marketplace_skillr   DEFAULT_SKILLS_BUCKET_ID_install_marketplace_skill)r(   r)   r*   apimarketplace_skillsskills         r!   	add_skillr6   .   s    
,C		  U5c:)*<jI=*_5M4N OU U  *#u6FeTU U Us   >AA&contentc                 F     dt         ddf fd}t        t        |||      S )zXInstall the `hf-cli` skill from locally generated SKILL.md content (no bucket download).install_dirr+   Nc                     | j                  dd       | dz  j                  d       | t        z  j                          y )NTparentsexist_okSKILL.mdutf-8encoding)mkdir
write_textMANAGED_MARKER_FILENAMEtouch)r9   r7   s    r!   populatez)install_generated_skill.<locals>.populate?   s@    $6	z	!--g-H	.	.557r    rF   r*   )r   _install_skillDEFAULT_SKILL_ID)r7   r)   r*   rF   s   `   r!   install_generated_skillrJ   <   s,    8d 8t 8
 *,<xW\]]r    rootsselectorhf_cli_contentc          	         t        |       }|_|j                         j                         }|D cg c]"  }|j                  j                         |k(  s!|$ }}|st	        d| d| d      t        d |D              }d}i }|rNt               }t               5  t        |      D 	ci c]  }	|	j                  j                         |	 }}	ddd       |D 
cg c]  }
t        ||
||       c}
S c c}w c c}	w # 1 sw Y   /xY wc c}
w )zgRe-sync managed skill installs (`hf-cli` is rewritten from `hf_cli_content`, the rest from the bucket).NzNo installed skill matches 'z"'. Install it with `hf skills add z`.c              3   t   K   | ]0  }|j                   t        k7  xr |t        z  j                          2 y wN)r   rI   rD   exists).0ds     r!   	<genexpr>z update_skills.<locals>.<genexpr>Q   s2     vfgAFF&66aA@W<W;_;_;aavs   68)
_iter_unique_skill_dirsstriplowerr   r   anyr   r   r/   _apply_single_update)rK   rL   rM   
skill_dirsselector_lowerrS   needs_marketplacer3   r4   r5   r$   s              r!   update_skillsr]   G   s   (/J!)//1!+PAqvv||~/OaP
P9(Cefneooqrss vkuvv
C68l"$ 	hIabeIf!g%**"2"2"4e";!g!g	h gqqYb i1C^Tqq Q "h	h 	h rs/   "C/C/C9'"C4	C9D4C99Dc                    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                  d      }|j                  t        |t        |      t        |t              r|nd               |S )NpluginszAInvalid marketplace payload: expected a top-level 'plugins' list.r   sourcer   )r   r   r   )
_load_marketplace_payloadget
isinstancelistr   dictr   appendr   _normalize_repo_path)r3   payloadr_   skillspluginr   r`   r   s           r!   r/   r/   \   s    ',Gkk)$Ggt$Z[[%'F 
&$'zz&!H%$$Jvs,Cjj/.v6+5k3+GKT	

 Mr    r5   c                 V     dt         ddf fd}t        j                  |||      S )z:Install a marketplace skill into a local skills directory.r9   r+   Nc                     | j                  dd       t              }t        ||        t        |        | t        z  j                          y )NTr;   )rB   _list_skill_files_download_skill_files_validate_installed_skill_dirrD   rE   )r9   bucket_filesr3   r5   s     r!   rF   z,_install_marketplace_skill.<locals>.populatex   sJ    $6(e4c5,D%k2	.	.557r    rG   )r   rH   r   )r3   r5   r)   r*   rF   s   ``   r!   r2   r2   u   s/    8d 8t 8 %**&6QVWWr    z[A-Za-z0-9][A-Za-z0-9._-]*r   rF   c                 N   t         j                  |       st        d|  d      |j                         j	                         }|j                  dd       || z  }|j                         }|r|st        d|       |r]t        j                  |d|j                   d      5 }t        |      |j                  z  } ||       t        ||	       d
d
d
       |S 	  ||       |S # 1 sw Y   |S xY w# t        $ r' |j                         rt        j                  |        w xY w)a  Install a skill into ``destination_root`` by calling ``populate(install_dir)`` to fill it.

    Used by both the marketplace install (populate = download from bucket) and the
    locally-generated install (populate = write content). When the install already
    exists and ``force`` is set, the new content is staged in a sibling tempdir and
    atomically swapped in, so the existing install stays intact if ``populate``
    fails halfway through.
    zInvalid skill name ''.Tr;   zSkill already exists: .z	.install-)dirprefix)existing_dir
staged_dirN)_VALID_SKILL_NAME	fullmatchr   
expanduserresolverB   rQ   FileExistsErrortempfileTemporaryDirectoryr   r   _atomic_replace_directory	Exceptionshutilrmtree)r   r)   rF   r*   r9   already_existstmp_dir_strrw   s           r!   rH   rH      s4     &&t,-dV2677'224<<>4$7"T)K '')Ne 6{mDEE((-=+JZJZI[[dFef 	Wjuk*[-=-==JZ %;:V	W 
 	W   MM+&s   $.C'C4 'C140D$c                 2   t        j                         5 }t        |      dz  }| j                  t        t
        |fgd       t        j                  |j                  d            }d d d        t        t              st        d      |S # 1 sw Y   &xY w)Nr   T)raise_on_missing_filesr?   r@   z4Invalid marketplace payload: expected a JSON object.)r}   r~   r   download_bucket_filesr1   MARKETPLACE_PATHjsonloads	read_textrc   re   r   )r3   tmp_dir
local_pathparseds       r!   ra   ra      s    		$	$	& D'']%77
!!$
+,#' 	" 	

 J00'0BCD fd#MNNMD Ds   ABBri   c                     |j                         j                         }| D ]#  }|j                  j                         |k(  s!|c S  y rP   )rV   rW   r   )ri   rL   r[   r5   s       r!   r0   r0      sE    ^^%++-N ::/L r    pathc                     | j                         }|j                  d      r|dd  }|j                  d      r|j                  d      }|st        d      |S )Nz./r   /z-Invalid marketplace entry: empty source path.)rV   
startswithr   )r   
normalizeds     r!   rg   rg      s[    J



%^
 


%!!#&JFGGr    r$   c                 J    | dz  }|j                         st        d|       y )Nr>   z%Installed skill is missing SKILL.md: )is_fileRuntimeError)r$   
skill_files     r!   ro   ro      s0    Z'JB:,OPP  r    c                     |j                   j                  d      }| j                  t        |d      D cg c]  }t	        |t
              r| }}|st        d| dt         d      |S c c}w )zAList all files under `skill.repo_path` in the marketplace bucket.r   T)ru   	recursivezPath 'z' not found in bucket 'rr   )r   rstriplist_bucket_treer1   rc   r
   FileNotFoundError)r3   r5   ru   itemfiless        r!   rm   rm      s    __##C(F (()A&\`(adJ' 	E 
 &0GH`Gaac deeLs   A+r   r9   c                    |j                   j                  d      }| d}g }|D ]  }|j                  j                  |      s|j                  t	        |      d } |j
                  t        |      j                   }	|	j                  j                  dd       |j                  ||	f        |st        d| dt         d      | j                  t        |       y)z)Download bucket files into `install_dir`.r   NTr;   zNo files found under 'z' in bucket 'rr   )r   r   r   r   lenjoinpathr   partsparentrB   rf   r   r1   r   )
r3   r5   r   r9   ru   prefix_with_slashdownload_specsbucket_filerelative
local_files
             r!   rn   rn      s    __##C(F!(! ACN 9**+<=##C(9$:$<=)[))=+B+H+HI
t<{J789 "8NfMggi jkk6Gr    rv   rw   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   rQ   )rv   rw   
backup_dirs      r!   r   r      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 )Nrs   )setrz   r{   is_dirsortediterdirr   r   
is_symlinkaddrf   )rK   seen
discoveredrootchildresolveds         r!   rU   rU     s    eDJ ( ((*{{}DLLN+ 		(Ezz$$S)<<>%*:*:*<}}H4x'8HHXh'		(	( r    r4   c           	      t   t        |j                  |d      }|t        z  j                         s|S |j                  t        k(  r&	 t        ||j                  d       t        |d      S |j                  |j                  j                               }|#t        |dd	|j                   d
t         d      S 	 t        | ||j                  d       t        |d      S # t        $ r!}t        |dt        |            cY d }~S d }~ww xY w# t        $ r!}t        |dt        |            cY d }~S d }~ww xY w)Nr   )r   r$   r%   Tr.   r   )r%   r&   r   )r%   r-   z' is no longer available in rs   )r#   r   rD   rQ   rI   rJ   r   r   r   r   rb   rW   r1   r2   )r3   r$   r4   rM   baseexcr5   s          r!   rY   rY     s)    	)KXD//779~~))	O#NI4D4DDQ tL11""9>>#7#7#9:E}'Y^^,,HIaHbbcd
 	
K"3y/?/?tL 4--#  	O4(<SXNN	O  Kt$8SJJKs<   C  :D  	D
)D?D
D
	D7D2,D72D7)FrP   )4__doc__r   rer   r}   collections.abcr   dataclassesr   r   pathlibr   r   typingr   r	   huggingface_hub._bucketsr
   huggingface_hub.errorsr   utilsr   
_cli_utilsr   rI   r1   r   rD   r'   r   r#   r   boolr6   rJ   rd   r]   r/   r2   compilerx   rH   re   ra   r0   rg   ro   rm   rn   r   rU   rY   r   r    r!   <module>r      s   T  	   $ * '  / + ) "  / % 
 4 KL  $# # # $  U# U Ud Ut U^S ^D ^ ^Z^ ^rd rsTz rUX r]abq]r r*T*:%; 2
X+; 
Xt 
X\` 
Xmq 
X BJJ<=  	'
'' vt|$' 	'
 
'Td38n d+;&<  P`cgPg s s QT Qd Q
"2 
tJ7G 
H&6 HtJ?O H^b Hgk H0	D 	d 	t 	4: $t* (...238H3H.I.[^..r    