
    -:j>'              	       H   d 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d	lmZ d
dlmZ dZdZdZed   Z ed       G d d             Z ed       G d d             Zd3dedededefdZd4dee   dedz  dee   fdZdee   fdZ d3dede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&eddfd'Z&d(eddfd)Z'dedee   fd*Z(ded+ee   d&eddfd,Z)d-ed.eddfd/Z*dee   dee   fd0Z+d(ed1e"eef   defd2Z,y)5zNInternal helpers for Hugging Face marketplace skill installation and upgrades.    N)	dataclassreplace)PathPurePosixPath)AnyLiteral)
BucketFile)CLIError   )disable_progress_bars   )
get_hf_apiz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        ]/var/www/html/tokenscope/api/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_skillr5   +   s    
,C		  U5c:)*<jI=*_5M4N OU U  *#u6FeTU U Us   >AA&rootsselectorc           	         t        |       }|_|j                         j                         }|D cg c]"  }|j                  j                         |k(  s!|$ }}|st	        d| d| d      t               }t               5  t        |      D ci c]  }|j                  j                         | }}|D cg c]  }t        |||       c}cddd       S c c}w c c}w c c}w # 1 sw Y   yxY w)z;Re-sync managed marketplace skill installs from the bucket.NzNo installed skill matches 'z"'. Install it with `hf skills add z`.)	_iter_unique_skill_dirsstriplowerr   r
   r   r   r.   _apply_single_update)	r6   r7   
skill_dirsselector_lowerdr2   r4   r3   r#   s	            r    update_skillsr@   9   s    (/J!)//1!+PAqvv||~/OaP
P9(Cefneooqrss
,C		  fE]^aEbcEejj..0%7ccZdeY$S)5GHef f Q def fs5   "CCC&"C1C&7C!C&
C&&C/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)r2   payloadrB   skillspluginr   rC   r   s           r    r.   r.   H   s    ',Gkk)$Ggt$Z[[%'F 
&$'zz&!H%$$Jvs,Cjj/.v6+5k3+GKT	

 Mr   r4   c                 2   |j                         j                         }|j                  dd       ||j                  z  }|j	                         }|r|st        d|       |rct        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)r4   install_dir)existing_dir
staged_dirN)
expanduserresolvemkdirr   existsFileExistsErrortempfileTemporaryDirectoryr   _populate_install_dir_atomic_replace_directory	Exceptionshutilrmtree)r2   r4   r(   r)   rU   already_existstmp_dir_strrW   s           r    r1   r1   a   s   '224<<>4$7"UZZ/K '')Ne 6{mDEE ((-=+JZJZI[[dFef 	Wjuk*[-=-==J!#U
K%;:V	W cKH
 	W   MM+&s   
4C	C& C#&0D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_fileszutf-8)encodingz4Invalid marketplace payload: expected a JSON object.)r]   r^   r   download_bucket_filesr0   MARKETPLACE_PATHjsonloads	read_textrF   rH   r
   )r2   tmp_dir
local_pathparseds       r    rD   rD   }   s    		$	$	& D'']%77
!!$
+,#' 	" 	

 J00'0BCD fd#MNNMD Ds   ABBrL   c                     |j                         j                         }| D ]#  }|j                  j                         |k(  s!|c S  y N)r:   r;   r   )rL   r7   r>   r4   s       r    r/   r/      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.)r:   
startswithr
   )rs   
normalizeds     r    rJ   rJ      s[    J



%^
 


%!!#&JFGGr   rU   c                     |j                  dd       t        | |      }t        | |||       t        |       |t        z  j                          y )NTrO   )rZ   _list_skill_files_download_skill_files_validate_installed_skill_dirMANAGED_MARKER_FILENAMEtouch)r2   r4   rU   bucket_filess       r    r_   r_      sI    dT2$S%0L#ulK@!+.**113r   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   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.ru   T)rT   	recursivezPath 'z' not found in bucket ''.)r   rstriplist_bucket_treer0   rF   r	   FileNotFoundError)r2   r4   rT   itemfiless        r    ry   ry      s    __##C(F (()A&\`(adJ' 	E 
 &0GH`Gaac deeLs   A+r   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`.ru   NTrO   zNo files found under 'z' in bucket 'r   )r   r   rs   rv   lenjoinpathr   partsparentrZ   rI   r   r0   ri   )
r2   r4   r   rU   rT   prefix_with_slashdownload_specsbucket_filerelative
local_files
             r    rz   rz      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   renamerb   rc   ra   r[   )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 )NrR   )setrX   rY   is_dirsortediterdirr   rv   
is_symlinkaddrI   )r6   seen
discoveredrootchildresolveds         r    r9   r9      s    eDJ ( ((*{{}DLLN+ 		(Ezz$$S)<<>%*:*:*<}}H4x'8HHXh'		(	( r   r3   c           	         t        |j                  |d      }|t        z  j                         s|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)Nr   )r   r#   r$   r   r,   z' is no longer available in rR   )r$   r%   Tr-   r   )r$   )r"   r   r|   r[   rE   r;   r   r0   r1   r   ra   r   )r2   r#   r3   baser4   excs         r    r<   r<      s    	)KXD//779""9>>#7#7#9:E}'Y^^,,HIaHbbcd
 	
K"3y/?/?tL 4--  Kt$8SJJKs   B' '	C0CCC)Frr   )-__doc__rk   rb   r]   dataclassesr   r   pathlibr   r   typingr   r   huggingface_hub._bucketsr	   huggingface_hub.errorsr
   utilsr   
_cli_utilsr   r0   rj   r|   r&   r   r"   r   boolr5   rG   r@   r.   r1   rH   rD   r/   rJ   r_   r{   ry   rz   r`   r9   r<   r   r   r    <module>r      s,   T    * '  / + ) " 0 % 
 4 KL  $# # # $  U# U Ud Ut Ufd fsTz fT/EZ fT*:%; 2+; t \` mq 8d38n d+;&<  P`cgPg s s 4&6 4T 4d 4QT Qd Q
"2 
tJ7G 
H&6 HtJ?O H^b Hgk H0	D 	d 	t 	4: $t* (. .4M]H]C^ .cr .r   