+
    jHàjPJ  ã                   ó*  € R t ^ RIt^ RIHt ^ RIHtHt ^ RIHt ^ RI	H
t
Ht ^ RIHtHtHtHtHtHt ^ RIHtHtHtHtHtHtHt ]! 4       t]! 4       t]! RR	4      t]! R
R4      tRRRRRRRRRRRRRRRRRR/	t R R lt!R  R! lt"]#! 0 ROm4      t$R" R# lt%R$ R% lt&R& R' lt']PQ                  R(4      RPR) R* ll4       t)]PQ                  R+4      RPR, R- ll4       t*]PQ                  R.4      RQR/ R0 ll4       t+]PY                  R14      RPR2 R3 ll4       t-]PY                  R44      RPR5 R6 ll4       t.]PY                  R74      RRR8 R9 ll4       t/R: R; lt0]PY                  R<4      RSR= R> ll4       t1]PY                  R?4      RSR@ RA ll4       t2]PY                  RB4      RPRC RD ll4       t3]Pi                  RE4      RPRF RG ll4       t5]PY                  RH4      RPRI RJ ll4       t6]PQ                  RB4      RPRK RL ll4       t7]Pi                  RH4      RPRM RN ll4       t8R# )Tu“  Skills dashboard routes.

Two routers because global route order matters: ``hub_router`` (skills-hub
install/search/scan) was registered before the profiles router include in
web_server, the plain skills CRUD ``router`` after it â€” each is mounted at its
original registration point.  Shared helpers are reached via the late-binding
seam so ``monkeypatch.setattr(<owning module>, ...)`` keeps working.
N)ÚOptional)Ú	APIRouterÚHTTPException)Úlate)Ú_hub_action_nameÚ_installed_hub_identifiers)ÚSkillContentUpdateÚSkillCreateÚSkillInstallRequestÚSkillToggleÚSkillUninstallRequestÚSkillsUpdateRequest)Ú_profile_scopeÚconfig_write_scopeÚhttp_failureÚlogÚrequireÚscoped_to_threadÚspawn_profile_actionÚ_config_profile_scopezhermes_cli.web_server_profilesÚload_configzhermes_cli.configÚofficialzOfficial (Nous)úhermes-indexzHermes Indexú	skills-shz	skills.shú
well-knownz
Well-KnownÚurlz
Direct URLÚgithubÚGitHubÚclawhubÚClawHubÚlobehubÚLobeHubz	browse-shz	browse.shc                ó:   € V ^8„  d   QhR\         \        ,          /# ©é   Úprofile©r   Ústr)Úformats   "ÚB/home/ubuntu/.hermes/hermes-agent/hermes_cli/web_routers/skills.pyÚ__annotate__r*   ,   s   € ÷ &ñ &œ(¤3�-ñ &ó    c                ó€   € ^ RI Hp \        V 4      ;_uu_ 4        V! 4       uuRRR4       #   + '       g   i     R# ; i)z5Source router built under ``profile``'s config scope.©Úcreate_source_routerN)Útools.skills_hub_searchr.   r   )r%   r.   s   & r)   Ú_hub_sourcesr0   ,   s%   € å<ä	˜w×	'Õ	'Ù#Ó%÷ 
(×	'×	'Ó	'ús   š,¬=	c                óF   € V ^8„  d   QhR\         R\        \         ,          /# )r$   Úidentr%   ©r'   r   )r(   s   "r)   r*   r*   4   s   € ÷ ñ œcð ¬H´S­Mñ r+   c                ó¨   € ^ RI Hp ^ RIHp \	        V4      ;_uu_ 4        V! 4       pV! W4      w  rVpRRR4       WV3#   + '       g   i     XX3# ; i)zL``(meta, bundle)`` for a hub identifier, resolved under ``profile``'s scope.)Ú_resolve_source_meta_and_bundler-   N)Úhermes_cli.skills_hubr5   r/   r.   r   )r2   r%   r5   r.   ÚsourcesÚmetaÚbundleÚ_srcs   &&      r)   Ú_resolve_hub_skillr;   4   sN   € åEÝ<ä	˜w×	'Õ	'Ù&Ó(ˆÙ<¸UÓLÑˆ�d÷ 
(ð ˆ<Ð÷ 
(Ö	'ð �ˆ<Ðús	    >¾A	c                ó0   € V ^8„  d   QhR\         R\        /# )r$   ÚattrÚreturn)r'   Úbool)r(   s   "r)   r*   r*   E   s   € ÷ ñ ”Sð œTñ r+   c                óR   €  \        \        WR4      4      #   \         d     R# i ; i)zG``bool(getattr(obj, attr, False))``; a raising property reads as False.F)r?   ÚgetattrÚ	Exception)Úobjr=   s   &&r)   Ú_flagrD   E   s+   € ðÜ”G˜C uÓ-Ó.Ð.øÜô Úðús   ‚ —&¥&c                ó$   € V ^8„  d   QhR\         /# )r$   r>   )Údict)r(   s   "r)   r*   r*   M   s   € ÷ $ñ $¤ñ $r+   c                 óÔ   € R V P                   RV P                  RV P                  RV P                  RV P                  RV P
                  R\        V P                  ;'       g    . 4      /# )ÚnameÚdescriptionÚsourceÚ
identifierÚtrust_levelÚrepoÚtags)rH   rI   rJ   rK   rL   rM   ÚlistrN   )Úms   &r)   Ú_skill_meta_to_payloadrQ   M   sR   € à�—‘˜ q§}¡}°hÀÇÁØ�a—l‘l M°1·=±=À&È!Ï&É&Ø”�Q—V‘V—\�\˜rÓ"ð$ð $r+   c                ó   € V ^8„  d   QhRR/# )r$   r>   N© )r(   s   "r)   r*   r*   T   s   € ÷ 
ñ 
 Dñ 
r+   c                 óJ   €  ^ RI Hp  V ! RR7       R#   \         d     R# i ; i)zÊBest-effort: invalidate the skills system-prompt snapshot after a write.

Mirrors what ``skill_manage`` does so a dashboard-authored skill is picked
up by the next session without a manual cache reset.
©Ú clear_skills_system_prompt_cacheT)Úclear_snapshotN)Úagent.prompt_builderrV   rB   rU   s    r)   Ú_clear_skills_prompt_cacherY   T   s$   € ðÝIÙ(¸×=øÜô Úðús   ‚ “"¡"z/api/skills/hub/installc                óF   € V ^8„  d   QhR\         R\        \        ,          /# ©r$   Úbodyr%   )r
   r   r'   )r(   s   "r)   r*   r*   b   s   € ÷ *ñ *Ô"5ð *ÄÌÅñ *r+   c              ƒ   óš   "  € \        V P                  R 4      p\        V P                  ;'       g    TRRVR.\	        RV4      RRR7      # 5i)úidentifier is requiredÚskillsÚinstallú--yeszFailed to spawn skills installzFailed to install skill©Úlog_msgÚprefix)r   rK   r   r%   r   )r\   r%   rK   s   && r)   Úinstall_skill_hubre   a   sM   é € ä˜Ÿ™Ð*BÓC€JÜØ�‰×Ð˜ (¨I°zÀ7Ð!KÜ˜ JÓ/Ð9YØ(ô*ð *ùó   ‚A	Az/api/skills/hub/uninstallc                óF   € V ^8„  d   QhR\         R\        \        ,          /# r[   )r   r   r'   )r(   s   "r)   r*   r*   k   s   € ÷ ,ñ ,Ô$9ð ,ÄHÌSÅMñ ,r+   c              ƒ   óš   "  € \        V P                  R 4      p\        V P                  ;'       g    TRRVR.\	        RV4      RRR7      # 5i)zname is requiredr_   Ú	uninstallra   z Failed to spawn skills uninstallzFailed to uninstall skillrb   )r   rH   r   r%   r   )r\   r%   rH   s   && r)   Úuninstall_skill_hubrj   j   sM   é € ä�4—9‘9Ð0Ó1€DÜØ�‰×Ð˜ (¨K¸¸wÐ!GÜ˜ dÓ+Ð5WØ*ô,ð ,ùrf   z/api/skills/hub/updatec                ó\   € V ^8„  d   QhR\         \        ,          R\         \        ,          /# r[   )r   r   r'   )r(   s   "r)   r*   r*   t   s*   € ÷ Sñ SÜ
Ô&Õ
'ðSÜ9AÄ#½ñSr+   c              ƒ   ój   "  € \        V '       d   V P                  MR ;'       g    TRR.RRRR7      # 5i)Nr_   Úupdatezskills-updatezFailed to spawn skills updatezFailed to update skillsrb   )r   r%   )r\   r%   s   &&r)   Úupdate_skills_hubrn   s   s8   é € ô  ßˆ�Š 4×3Ð3¨G°hÀÐ5IÈ?Ø/Ð8QôSð Sùs   ‚"3¥3z/api/skills/hub/officialc                ó:   € V ^8„  d   QhR\         \        ,          /# r#   r&   )r(   s   "r)   r*   r*   |   s   € ÷ -ñ -¬´­ñ -r+   c              ƒ  óÀ   a "  € V 3R lp\        RRR4      ;_uu_ 4        \        P                  ! V4      G Rj  x€L
 uuRRR4       #  L  + '       g   i     R# ; i5i)zRThe ENTIRE optional-skills catalog (local scan), marked installed for ``profile``.c                  ót  <€ ^ RI Hp  \        S4      p. pV ! 4       P                  4        Fˆ  p\	        V4      pVP                  R4      ;'       g    RpRV9   d   VP                  R^4      R	,          MTpRV9   d   VP                  R^4      ^ ,          MRVR&   WQ9   VR&   VP                  V4       KŠ  	  RV/# )
é    )ÚOptionalSkillSourcerK   Ú Ú/ÚgeneralÚcategoryÚ	installedr_   éÿÿÿÿ)Útools.skills_hub_officialrs   r   Ú
list_localrQ   ÚgetÚsplitÚappend)rs   rx   ÚoutrP   Úpayloadr2   Úrelr%   s          €r)   Ú_runÚ"list_official_skills.<locals>._run   s±   ø€ ÝAä.¨wÓ7ˆ	ØˆÙ$Ó&×1Ñ1Ö3ˆAÜ,¨QÓ/ˆGØ—K‘K Ó-×3Ð3°ˆEð .1°E¬\�%—+‘+˜c 1Ó% bÖ)¸uˆCØ:=À¼* #§)¡)¨C°Ó"3°AÖ"6È)ˆG�JÑØ#(Ñ#5ˆG�KÑ Ø�J‰J�wÖñ 4ð ˜#ˆÐr+   z&official skills catalog listing failedéö  zOfficial catalog failedN©r   ÚasyncioÚ	to_thread©r%   r‚   s   f r)   Úlist_official_skillsr‰   {   sG   øé € õô  
Ð>ÀÐE^×	_Õ	_Ü×&Ò& tÓ,×,÷ 
`Ò	_Ù,÷ 
`×	_Ð	_üó+   ƒAŸA
¹AºA
½AÁA
Á
A	Á	Az/api/skills/hub/sourcesc                ó:   € V ^8„  d   QhR\         \        ,          /# r#   r&   )r(   s   "r)   r*   r*   ”   s   € ÷ "-ñ "-¬8´C­=ñ "-r+   c              ƒ  óÀ   a "  € V 3R lp\        RRR4      ;_uu_ 4        \        P                  ! V4      G Rj  x€L
 uuRRR4       #  L  + '       g   i     R# ; i5i)zŒConfigured skill-hub sources + installed-skill provenance (scoped to
``profile``), so the Browse-hub tab has something before a search runs.c            
      ó  <€ \        S4      p . pR p. pV  Fž  pVP                  4       pRVR\        P                  WU4      /pVR8X  d   \	        VR4      VR&   VR8X  dE   \	        VR4      pW&R&   V'       d-    VP                  R	^R
7       Uu. uF  p\        V4      NK  	  ppVP                  V4       K   	  V F%  pT;'       d    VR,          \        9   '       * VR&   K'  	  RVRVRVR\        S4      /# u upi   \         d    . p Lgi ; i)FÚidÚlabelr   Úis_rate_limitedÚrate_limitedr   Úis_availableÚ	availablert   )ÚlimitÚ
searchabler7   Úindex_availableÚfeaturedrx   )r0   Ú	source_idÚ_SKILL_HUB_SOURCE_LABELSr|   rD   ÚsearchrQ   rB   r~   Ú_API_SOURCE_IDSr   )	r7   r   r–   r—   ÚsrcÚsidÚentryrP   r%   s	           €r)   r‚   Ú%list_skills_hub_sources.<locals>._run˜   s2  ø€ Ü˜wÓ'ˆØˆØˆØˆÛˆCØ—-‘-“/ˆCØ˜3 Ô)A×)EÑ)EÀcÓ)OÐPˆEà�hŒÜ(-¨cÐ3DÓ(E��nÑ%Ø�nÔ$Ü"'¨¨^Ó"<�Ø%4�kÑ"ç"ð&à?B¿z¹zÈ"ÐTV¸zÔ?Wó$YÙ?W¸!Ô2°1Ö5Ñ?Wð !ð $Yð �J‰J�uÖñ! ó$ ˆEØ'6×'YÐ'Y¸5À½;Ì/Ñ;YÔ"ZˆE�,Óñ ð �sÐ-¨À
ÈHØÔ3°GÓ<ð>ð 	>ùò$Yøä$ô &Ø#%šð&ús$   Á7C:ÂC5Â C:Ã5C:Ã:D
Ä	D
z!skills hub sources listing failedr„   zHub sources failedNr…   rˆ   s   f r)   Úlist_skills_hub_sourcesr    “   sG   øé € õ
>ô: 
Ð9¸3Ð@T×	UÕ	UÜ×&Ò& tÓ,×,÷ 
VÒ	UÙ,÷ 
V×	UÐ	UürŠ   z/api/skills/hub/searchc          	      ó^   € V ^8„  d   QhR\         R\         R\        R\        \         ,          /# )r$   ÚqrJ   r”   r%   )r'   Úintr   )r(   s   "r)   r*   r*   º   s0   € ÷ -ñ -Ü
ð-Üð-Ü-0ð-Ü@HÌÅñ-r+   c              ƒ  ó$  aaaa"  € T ;'       g    RP                  4       oS'       g   R. R/ R. R/ /# VVVV3R lp\        RRR	4      ;_uu_ 4        \        P                  ! V4      G R
j  x€L
 uuR
R
R
4       #  L  + '       g   i     R
# ; i5i)zCSearch the skill hub across all configured sources (network-bound).rt   ÚresultsÚsource_countsÚ	timed_outrx   c            
      ó  <€ ^ RI Hp  \        S4      p\        \	        S^4      ^24      pT ! TSS;'       g    R^R7      w  r4pR^R^R^ /p/ pV Fm  pVP                  VP                  4      p	V	e>   VP                  VP                  ^ 4      VP                  V	P                  ^ 4      8”  g   K_  W‡VP                  &   Ko  	  \        VP                  4       4      RV p
RV
 Uu. uF  p\        V4      NK  	  upR	VR
VR\        S4      /# u upi )rr   )Úparallel_search_sourcesÚall)ÚqueryÚsource_filterÚoverall_timeoutÚbuiltinÚtrustedÚ	communityNr¥   r¦   r§   rx   )r/   r©   r0   ÚminÚmaxr|   rK   rL   rO   ÚvaluesrQ   r   )r©   r7   ÚcappedÚall_resultsr¦   r§   Ú_rankÚseenÚrÚprevÚdedupedrP   r”   r%   r«   rJ   s               €€€€r)   r‚   Úsearch_skills_hub.<locals>._runÁ   s  ø€ ÝCä˜wÓ'ˆÜ”S˜ “] BÓ'ˆÙ0GØ˜5°·°¸%ÐQSô1UÑ-ˆ Ið ˜A˜y¨!¨[¸!Ð<ˆØˆÛˆAØ—8‘8˜AŸL™LÓ)ˆDØŠ|˜uŸy™y¨¯©¸Ó:¸U¿Y¹YÀt×GWÑGWÐYZÓ=[Ö[Ø%&�Q—\‘\Ó"ñ ô �t—{‘{“}Ó% g vÐ.ˆð ¹7ÓC¹7°aÔ.¨qÖ1¹7ÑCÀ_ÐVcØ˜ KÔ1KÈGÓ1TðVð 	VùÚCs   Ã Dzskills hub search failedr„   zHub search failedN)Ústripr   r†   r‡   )r¢   rJ   r”   r%   r‚   r«   s   &fff @r)   Úsearch_skills_hubr½   ¹   s}   ûé € ð �WˆW�"�O‰OÓ€EßØ˜2˜°°KÀÀ[ÐRTÐUÐU÷Vð Vô* 
Ð0°#Ð7J×	KÕ	KÜ×&Ò& tÓ,×,÷ 
LÒ	KÙ,÷ 
L×	KÐ	Küs4   †"B©(BÁA<Á+A:Á,A<Á/BÁ:A<Á<B	Â	Bc                ó<   € V ^8„  d   QhR\         R\         R\         /# )r$   r2   rc   rd   )r'   )r(   s   "r)   r*   r*   Ú   s!   € ÷ ñ ¤ð ¬sð ¼Cñ r+   c              ƒ  óØ   "  € \        VRV4      ;_uu_ 4        \        P                  ! V 4      G Rj  x€L
 pRRR4       Xf   \        RRV 2R7      hV#  L"  + '       g   i     L(; i5i)zKRun ``fn`` off-loop; any failure -> 502 ``"<prefix>: <exc>"``, None -> 404.r„   Né”  zSkill not found: ©Ústatus_codeÚdetail)r   r†   r‡   r   )Úfnr2   rc   rd   Úresults   &&&& r)   Ú_hub_lookuprÆ   Ú   sX   é € ä	�g˜s F×	+Õ	+Ü×(Ò(¨Ó,×,ˆ÷ 
,à‚~Ü¨Ð6GÈÀwÐ4OÔPÐPØ€Mñ -÷ 
,×	+üs+   ‚A*˜A²A³A·A*ÁAÁA'	Á"A*z/api/skills/hub/previewc                óF   € V ^8„  d   QhR\         R\        \         ,          /# ©r$   rK   r%   r3   )r(   s   "r)   r*   r*   ä   s"   € ÷ "]ñ "]¬ð "]¼8ÄC½=ñ "]r+   c              ƒ  ód   aa"  € \        V R4      oVV3R lp\        VSRR4      G Rj  x€L
 #  L5i)z�A hub skill's SKILL.md + file manifest WITHOUT installing it; scoped to
``profile`` so different hub taps resolve against THAT source router.r^   c                  óú  <€ \        SS4      w  rV'       g   V '       g   R # / pRpV'       dz   VP                  ;'       g    / P                  4        F5  w  rE\        V\        4      '       d    VP                  R4      W$&   K1  WRV&   K7  	  VP                  RR4      ;'       g    RpT ;'       g    TpR\        VRS4      R\        VRR4      ;'       g    RR\        VRR4      ;'       g    RR\        VRS4      ;'       g    SR	\        VR	R
4      ;'       g    R
R\        VRR 4      R\        \        VRR 4      ;'       g    . 4      RVR\        VP                  4       4      /	#   \         d
    RY$&    EK'  i ; i)Nrt   zutf-8z(binary file)úSKILL.mdrH   rI   rJ   rK   rL   r°   rM   rN   Úskill_mdÚfiles)r;   rÍ   ÚitemsÚ
isinstanceÚbytesÚdecodeÚUnicodeDecodeErrorr|   rA   rO   ÚsortedÚkeys)	r8   r9   rÍ   rÌ   r�   ÚcontentrP   r2   r%   s	          €€r)   r‚   Úpreview_skill_hub.<locals>._runé   s_  ø€ Ü)¨%°Ó9‰ˆßŸdÙàˆØˆßØ!'§¡×!3Ð!3°× :Ñ :Ö <‘�Ü˜g¤u×-Ò-ð5Ø%,§^¡^°GÓ%<˜›
ð ")˜#“Jñ !=ð —y‘y ¨RÓ0×6Ð6°BˆHà�NˆN�Fˆà”G˜A˜v uÓ-¨}¼gÀaÈÐXZÓ>[×>aÐ>aÐ_aØ”g˜a ¨2Ó.×4Ð4°"Øœ' ! \°5Ó9×BÐB¸UØœ7 1 m°[ÓA×PÐPÀ[Ø”G˜A˜v tÓ,¨f´d¼7À1ÀfÈdÓ;S×;YÐ;YÐWYÓ6ZØ˜ '¬6°%·*±*³,Ó+?ðAð 	Aøô .ô 5Ø%4˜�
ð5ús   Á.E&Å&E:Å9E:zskills hub preview failedzHub preview failedN©r   rÆ   ©rK   r%   r‚   r2   s   &f @r)   Úpreview_skill_hubrÙ   ã   s6   ùé € ô �JÐ 8Ó9€EöAô: ˜T 5Ð*EÐG[Ó\×\Ð\Ñ\ùó   „%0©.ª0z/api/skills/hub/scanc                óF   € V ^8„  d   QhR\         R\        \         ,          /# rÈ   r3   )r(   s   "r)   r*   r*   
  s&   € ÷ JWñ JW¤Sð JW¼Ä½ñ JWr+   c              ƒ  ód   aa"  € \        V R4      oVV3R lp\        VSRR4      G Rj  x€L
 #  L5i)zÜInstall-time security scan of a hub skill WITHOUT installing it (the CLI's
``scan_skill`` / ``should_allow_install`` pipeline on a quarantined bundle);
scoped to ``profile`` so the bundle resolves where an install would.r^   c                  ó`  <€ ^ RI p ^ RIHp ^ RIHpHp \        SS4      w  rEV'       g   R# VP                  R8X  d   RpM,\        VRR4      ;'       g    \        VRR4      ;'       g    SpRpV! V4      p V! W†R7      p	 ^ RI	H
p
Hp V! 4       '       d¥   V
! V4      pVP                  '       d‹   R	VP                  R
VP                  RVP                   Uu. uFY  pRVP                   RVP"                  RVP$                  RVP&                  RVP(                  RVP*                  RVP,                  /NK[  	  up/pT P5                  TRR7       T! T	RR7      w  rïT	P                   Uu. uFA  pRTP$                  RTP6                  RTP(                  RTP*                  RTP8                  /NKC  	  ppR' Uu/ uF  pT^ bK  	  ppT	P                   F5  pTP$                  T9   g   K  TTP$                  ;;,          ^,          uu&   K7  	  RT	P:                  RSRT	P                  RT	P<                  RT	P>                  RT	P@                  R TRJ d   R!MTf   R"MR#R$TRTR%TR&T/# u upi   \.         d    \0        P2                  ! RRR7        ELPi ; i  T P5                  TRR7       i ; iu upi u upi )(rr   N)Úquarantine_bundle)Ú
scan_skillÚshould_allow_installr   rK   rt   )rJ   )Úrun_tier1_scanÚtier1_advisory_enabledÚpassedÚincomplete_checksÚfindingsÚcheckÚ	validatorÚseverityÚmessageÚfileÚlineÚsecrets_classzTier 1 advisory scan skippedT)Úexc_info)Úignore_errorsF)Úforcerw   rI   rH   rJ   rL   ÚverdictÚsummaryÚpolicyÚallowÚaskÚblockÚpolicy_reasonÚseverity_countsÚtier1)ÚcriticalÚhighÚmediumÚlow)!ÚshutilÚtools.skills_hub_installrÞ   Útools.skills_guardrß   rà   r;   rJ   rA   Útools.skillevaluator_scanrá   râ   r“   rã   rä   rå   ræ   rç   rè   ré   rê   rë   Úis_secrets_classrB   Ú_logÚdebugÚrmtreerw   rI   Ú
skill_namerL   rð   rñ   )Ú_shutilrÞ   rß   rà   r8   r9   Úscan_sourcerø   Úq_pathrÅ   rá   râ   Út1ÚfÚallowedÚreasonrå   ÚsevÚcountsr2   r%   s                      €€r)   r‚   Úscan_skill_hub.<locals>._run  sœ  ø€ Û å>ßGä)¨%°Ó9‰ˆßÙà�=‰=˜JÔ&Ø$‰Kô ˜ ¨bÓ1×]Ð]´W¸TÀ<ÐQSÓ5T×]Ð]ÐX]ð ð ˆÙ" 6Ó*ˆð	7Ù Ô;ˆFðJß\Ù)×+Ò+Ù'¨Ó/�BØ—|—|�|à$ b§i¡iØ/°×1EÑ1EØ&ð *,¯ªó)6ñ *5 Að	 %,¨Q¯W©W°kÀ1Ç;Á;Ø$.°·
±
¸IÀqÇyÁyØ$*¨A¯F©F°F¸A¿F¹FØ$3°Q×5GÑ5Gó	!Iñ
 *5ñ)6ð	!7˜ð �N‰N˜6°ˆNÔ6ñ /¨v¸UÔC‰ˆð
 —_’_ó	&ñ %�ð ˜AŸJ™J¨
°A·J±JÀÈÏÉØ˜Ÿ™ ¨q¯}©}ó>ñ %ð	 	ð &ñ
 %JÓJÑ$I˜S�#�q’&Ñ$IˆÐJØ—”ˆAØ�z‰z˜VÖ#Ø�q—z‘z×" aÕ'Õ"ñ !ð
 �F×%Ñ%Ø˜%Ø�f—m‘mØ˜6×-Ñ-Ø�v—~‘~Ø�v—~‘~Ø ¨D£‘g¸wº±eÐT[Ø˜VØ˜Ø˜vØ�Uð
ð 	
ùò1)6øô ô JÜ—
’
Ð9ÀD×IÐIðJûð �N‰N˜6°ˆNÕ6üò&ùò
 KsP   Á7	J Â.I$ Â0'I$ ÃAIÄ6I$ Å'AJ&Æ4J+ÉI$ É$#JÊJ Ê
JÊJ ÊJ#zskills hub scan failedzHub scan failedNr×   rØ   s   &f @r)   Úscan_skill_hubr  	  s7   ùé € ô
 �JÐ 8Ó9€EöB
ôH ˜T 5Ð*BÐDUÓV×VÐVÑVùrÚ   z/api/skillsc                ó:   € V ^8„  d   QhR\         \        ,          /# r#   r&   )r(   s   "r)   r*   r*   X  s   € ÷  )ñ  )œh¤s�mñ  )r+   c              ƒ   ó¨   a aaaaaaa"  € ^ RI Ho ^ RIHo ^ RIHoHoHoHoH	o VVVVVVVV 3R lp\        P                  ! V4      G Rj  x€L
 #  L5i)rr   )Úfind_all_skills)Úget_disabled_skills)Ú_external_skill_namesÚ_read_bundled_namesÚ_read_hub_installed_namesÚactivity_countÚ
load_usagec                  óÎ  <€ \        S4      ;_uu_ 4        \        4       p S! V 4      pS! R R7      pS! 4       pS	! 4       pS
! 4       pS! 4       V,
          V,
          pRRR4       X Fi  pVR,          X9  VR&   S! XP                  VR,          / 4      4      VR&   VR,          X9   d   RM!VR,          X9   d   RMVR,          X9   d   RMR	VR
&   Kk  	  V#   + '       g   i     L�; i)T)Úskip_disabledNrH   ÚenabledÚusageÚhubÚbundledÚexternalÚagentÚ
provenance)r   r   r|   )ÚconfigÚdisabledr_   r  Úbundled_namesÚ	hub_namesÚexternal_namesÚsr  r  r  r  r  r  r  r%   s           €€€€€€€€r)   r‚   Úget_skills.<locals>._run^  sÚ   ø€ Ü˜G×$Õ$Ü “]ˆFÙ*¨6Ó2ˆHÙ$°4Ô8ˆFÙ“LˆEñ 0Ó1ˆMÙ1Ó3ˆIÙ2Ó4°}ÕDÀyÕPˆN÷ %ó ˆAØ˜V�9¨HÑ4ˆAˆi‰LÙ'¨¯	©	°!°Fµ)¸RÓ(@ÓAˆAˆg‰Jà˜6� iÔ/‘Ø"# F¥)¨}Ô"<‘YØ#$ V¥9°Ô#>‘ZØð	 ˆl‹Oñ ð ˆ÷/ %×$ús   •ACÃC$	N)Útools.skills_toolr  Úhermes_cli.skills_configr  Útools.skill_usager  r  r  r  r  r†   r‡   )	r%   r‚   r  r  r  r  r  r  r  s	   f @@@@@@@r)   Ú
get_skillsr-  W  s;   ÿé € å1Ý<÷kõ k÷ô ô4 ×"Ò" 4Ó(×(Ð(Ñ(ùs   ŠAAÁAÁAz/api/skills/togglec                óF   € V ^8„  d   QhR\         R\        \        ,          /# r[   )r   r   r'   )r(   s   "r)   r*   r*   |  s   € ÷ )ñ )œ[ð )´8¼Cµ=ñ )r+   c              ƒ   ót   a aaa"  € ^ RI HoHo V VVV3R lp\        P                  ! V4      G Rj  x€L
 #  L5i)rr   )r  Úsave_disabled_skillsc                  óˆ  <€ \        SP                  ;'       g    S4      ;_uu_ 4        \        4       p S! V 4      pSP                  '       d   VP	                  SP
                  4       MVP                  SP
                  4       S! W4       R R R 4       RRRSP
                  RSP                  /#   + '       g   i     L,; i)NÚokTrH   r  )r   r%   r   r  ÚdiscardrH   Úadd)r#  r$  r\   r  r%   r0  s     €€€€r)   r‚   Útoggle_skill.<locals>._run  s‰   ø€ Ü §¡× 7Ð 7°×8Õ8Ü “]ˆFÙ*¨6Ó2ˆHØ�|�|ˆ|Ø× Ñ  §¡Õ+à—‘˜TŸY™YÔ'Ù  Ô2÷ 9ð �d˜F D§I¡I¨y¸$¿,¹,ÐGÐG÷ 9×8ús   ©A$B1Â1C	N)r+  r  r0  r†   r‡   )r\   r%   r‚   r  r0  s   ff @@r)   Útoggle_skillr6  {  s.   ûé € çR÷	Hð 	Hô ×"Ò" 4Ó(×(Ð(Ñ(ùs   †+8±6²8z/api/skills/contentc                óF   € V ^8„  d   QhR\         R\        \         ,          /# )r$   rH   r%   r3   )r(   s   "r)   r*   r*   Ž  s   € ÷ 2ñ 2¤#ð 2´¼µñ 2r+   c              ƒ  óR   a a"  € ^ RI Ho VV 3R lp\        W4      G Rj  x€L
 #  L5i)z+Raw SKILL.md text for the dashboard editor.)Ú_find_skillc                  óP  <€ S! S4      p V '       g   \        R RS R2R7      hV R,          R,          pVP                  4       '       g   \        R RS R2R7      h VP                  RR7      pRSRTR\	        T4      /#   \         d   p\        R	\	        T4      R7      ThR
p?ii ; i)rÀ   zSkill 'z' not found.rÁ   ÚpathrË   z' has no SKILL.md.z	utf-8-sig)Úencodingiô  NrH   rÕ   )r   ÚexistsÚ	read_textÚOSErrorr'   )ÚfoundrÌ   rÕ   Úexcr9  rH   s       €€r)   Ú_readÚ get_skill_content.<locals>._read’  s±   ø€ Ù˜DÓ!ˆßÜ¨C¸'À$ÀÀ|Ð8TÔUÐUØ˜•= :Õ-ˆØ�‰× Ò Ü¨C¸'À$ÀÐGYÐ8ZÔ[Ð[ð	KØ×(Ñ(°+Ð(Ó>ˆGð ˜˜i¨°&¼#¸h»-ÐHÐHøô ô 	KÜ¨C¼¸C»ÔAÀsÐJûð	Kús   ÁA> Á>B%Â	B Â B%N)Útools.skill_manager_toolr9  r   )rH   r%   rB  r9  s   f& @r)   Úget_skill_contentrE  �  s$   ùé € õ 5öIô " 'Ó1×1Ð1Ñ1ùs   „' %¡'c                óF   € V ^8„  d   QhR\         R\        \        ,          /# r[   )r	   r   r'   )r(   s   "r)   r*   r*   £  s   € ÷ ñ œ[ð ´8¼Cµ=ñ r+   c              ƒ  óø   a a"  € ^ RI Ho \        S P                  ;'       g    TVV 3R l4      G Rj  x€L
 pVP	                  R4      '       g   \        RVP	                  RR4      R7      h\        4        V#  LD5i)	uÕ   Create a skill via the agent's ``skill_manage`` write path, minus the
write-approval gate â€” an authenticated dashboard write IS the user.
Profile from the body or ``?profile=``, like the rest of ``/api/skills``.)Ú_create_skillc                  óh   <€ S ! SP                   SP                  SP                  ;'       g    R 4      # ©N)rH   rÕ   rw   )rH  r\   s   €€r)   Ú<lambda>Úcreate_skill.<locals>.<lambda>ª  s&   ø€ ©°t·y±yÀ$Ç,Á,ÐPT×P]ÑP]×PeÐPeÐaeÔ)fr+   NÚsuccessé�  ÚerrorzFailed to create skill.rÁ   )rD  rH  r   r%   r|   r   rY   )r\   r%   rÅ   rH  s   f& @r)   Úcreate_skillrP  ¢  sg   ùé € õ
 7ä#Ø�‰×Ð˜Õ!fóh÷ h€Fà�:‰:�i× Ò Ü¨°F·J±J¸wÐHaÓ4bÔcÐcÜÔ Ø€Mñhùs   „/A:³A8´A:Á*A:c                óF   € V ^8„  d   QhR\         R\        \        ,          /# r[   )r   r   r'   )r(   s   "r)   r*   r*   ²  s   € ÷ 
ñ 
Ô%7ð 
Ä(Ì3Å-ñ 
r+   c              ƒ  ó>  a a"  € ^ RI Ho \        S P                  ;'       g    TVV 3R l4      G Rj  x€L
 pVP	                  R4      '       gA   VP	                  RR4      pR\        V4      P                  4       9   d   RMR	p\        WCR
7      h\        4        V#  Lg5i)zIReplace the SKILL.md of an existing skill (full rewrite) from the editor.)Ú_edit_skillc                  ó>   <€ S ! SP                   SP                  4      # rJ  )rH   rÕ   )rS  r\   s   €€r)   rK  Ú&update_skill_content.<locals>.<lambda>¶  s   ø€ Á[ÐQU×QZÑQZÐ\`×\hÑ\hÔEir+   NrM  rO  zFailed to update skill.z	not foundrÀ   rN  rÁ   )	rD  rS  r   r%   r|   r'   Úlowerr   rY   )r\   r%   rÅ   ÚerrÚstatusrS  s   f&   @r)   Úupdate_skill_contentrY  ±  s|   ùé € õ 5ä# D§L¡L×$;Ð$;°GÕ=iÓj×j€FØ�:‰:�i× Ò Ø�j‰j˜Ð";Ó<ˆØ#¤s¨3£x§~¡~Ó'7Ô7‘¸SˆÜ¨Ô;Ð;ÜÔ Ø€Mñ kùs   „/B³B´BÁAB>   r   r   r    r   r   rJ  )NN)rt   rª   é   N)rt   N)9Ú__doc__r†   Útypingr   Úfastapir   r   Úhermes_cli.web_depsr   Úhermes_cli.web_server_profilesr   r   Úhermes_cli.web_modelsr   r	   r
   r   r   r   Úhermes_cli.web_routers._commonr   r   r   r   r  r   r   r   Ú
hub_routerÚrouterr   r   r™   r0   r;   Ú	frozensetr›   rD   rQ   rY   Úpostre   rj   rn   r|   r‰   r    r½   rÆ   rÙ   r  r-  Úputr6  rE  rP  rY  rS   r+   r)   Ú<module>rg     sT  ðñó Ý ç ,å $ß W÷÷ ÷÷ ñ ñ ‹[€
Ù	‹€áÐ4Ð6VÓWÐ Ù�=Ð"5Ó6€ð Ð!Ø�NØ�Ø�,Ø	ˆ<ØˆhØˆyØˆyØ�ð
Ð õ&õñ ÒWÓX€õõ$õ
ð ‡�Ð*Ó+ö*ó ,ð*ð ‡�Ð,Ó-ö,ó .ð,ð ‡�Ð)Ó*öSó +ðSð ‡�Ð*Ó+ö-ó ,ð-ð. ‡�Ð)Ó*ö"-ó +ð"-ðJ ‡�Ð(Ó)ö-ó *ð-õ@ð ‡�Ð)Ó*ö"]ó +ð"]ðJ ‡�Ð&Ó'öJWó (ðJWðZ ‡�ˆMÓö )ó ð )ðF ‡�Ð Ó!ö)ó "ð)ð" ‡�Ð!Ó"ö2ó #ð2ð( ‡�ˆ]Óöó ðð ‡�Ð!Ó"ö
ó #ò
r+   