+
    lHàjí’  ã                  óX  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIH	t	H
t
 ^ RIHtHtHt ^ RIHt ^ RIHtHtHtHtHtHtHtHtHt ^ RIHt ^ RIHtHt ^ R	IH t  ]PB                  ! ]"4      t#Rt$ ^ RI%t%R
RRut't(t)]'](])0t*]+! 4       t,R]-R&   R R lt.R R lt/R R lt0R R lt1R R lt2]Pf                  ! 4       t4]	R R l4       t5R t6R R lt7R R lt8R  R! lt9R" R# lt:R$ R% lt;R& R' lt<R( R) lt=R* R+ lt>R, R- lt?R. R/ lt@R0 R1 ltAR2 R3 ltBR4 R5 ltCR6 R7 ltDR8 R9 ltER: R; ltFR< R= ltGR> R? ltHR@ RA ltIRB RC ltJRD RE ltKRŸRF RG lltLRH RI ltMRJ RK ltNRL RM ltORN RO ltPRP RQ ltQRR RS ltRRT RU ltSRV RW ltTRX RY ltURZ R[ ltVR\ R] ltWRŸR^ R_ lltXR` Ra ltYRb Rc ltZRdRe/Rf Rg llt[Rh Ri lt\Rj Rk lt]RŸRl Rm llt^RnRRoRRpR/Rq Rr llt_Rs Rt lt`Ru Rv ltaRoRRpR/Rw Rx lltbRyRzRoRRpR/R{ R| lltcRoRRpR/R} R~ lltdR R€ lteR� R‚ ltfRƒ R„ ltgR… R† lthR‡ Rˆ ltiR‰ RŠ ltjR‹ RŒ ltkR� RŽ ltlR� R� ltmR‘ R’ ltnR“ R” ltoR• R– ltpR— R˜ ltqR™ Rš ltrR› Rœ ltsR� Rž lttR#   ]& d:    Rt%]
! ]&4      ;_uu_ 4        ^ RI$t$RRR4        EK    + '       g   i      EL-; ii ; i) uG  Skill usage telemetry + provenance for the Curator: a sidecar ``~/.hermes/skills/.usage.json`` keyed by
skill name (never frontmatter â€” keeps telemetry out of user-authored SKILL.md and off bundled/hub skills).
Counter bumps are best-effort (DEBUG-logged failures never break the tool call); writes are atomic under a
cross-process lock. Curator management is an explicit ``created_by: agent`` marker written by skill_manage â€”
never inferred from location. Lifecycle: active -> stale -> archived (moved to .archive/); ``pinned`` opts
out of auto transitions, orthogonal to state.)ÚannotationsN)ÚcontextmanagerÚsuppress)ÚdatetimeÚtimezoneÚUTC)ÚPath)	ÚAnyÚCallableÚDictÚIterableÚIteratorÚListÚOptionalÚSetÚTuple©Úget_hermes_home)Úis_excluded_skill_pathÚis_external_skill_path)Úatomic_write_textÚactiveÚstaleÚarchivedúset[str]ÚPROTECTED_BUILTIN_SKILLSc               ó    € V ^8„  d   QhRRRR/# ©é   Ú
skill_nameÚstrÚreturnÚbool© )Úformats   "Ú6/home/ubuntu/.hermes/hermes-agent/tools/skill_usage.pyÚ__annotate__r&   +   s   € ÷ 2ñ 2 Sð 2¨Tñ 2ó    c                ó   € V \         9   # ©N)r   ©r   s   &r%   Úis_protected_builtinr+   +   s   € ØÔ1Ñ1Ð1r'   c               ó   € V ^8„  d   QhRR/# ©r   r!   r   r#   )r$   s   "r%   r&   r&   /   s   € ÷ (ñ (�Tñ (r'   c                 ó$   € \        4       R ,          # )Úskillsr   r#   r'   r%   Ú_skills_dirr0   /   s   € ÜÓ˜xÕ'Ð'r'   c               ó   € V ^8„  d   QhRR/# r-   r#   )r$   s   "r%   r&   r&   3   s   € ÷ )ñ )�Tñ )r'   c                 ó$   € \        4       R ,          # )z.usage.json©r0   r#   r'   r%   Ú_usage_filer4   3   s   € Ü‹=˜=Õ(Ð(r'   c               ó   € V ^8„  d   QhRR/# r-   r#   )r$   s   "r%   r&   r&   7   s   € ÷ &ñ &�dñ &r'   c                 ó$   € \        4       R ,          # )z.archiver3   r#   r'   r%   Ú_archive_dirr7   7   s   € Ü‹=˜:Õ%Ð%r'   c               ó    € V ^8„  d   QhRRRR/# )r   Úlockr"   r!   ÚNoner#   )r$   s   "r%   r&   r&   ;   s   € ÷ Pñ P�Tð P˜dñ Pr'   c                óX  € \         '       dA   \         P                  ! Y'       d   \         P                  4      # \         P                  4      # V P	                  ^ 4       \
        P                  ! V P                  4       V'       d   \
        P                  M\
        P                  ^4       R# )é    N)
ÚfcntlÚflockÚLOCK_EXÚLOCK_UNÚseekÚmsvcrtÚlockingÚfilenoÚLK_LOCKÚLK_UNLCK)Úfdr9   s   &&r%   Ú_flockrH   ;   sW   € ßƒuÜ�{Š{˜2¶œuŸ}™}ÓHÐH¼%¿-¹-ÓHÐHØ‡G�GˆA„JÜ
‡N‚N�2—9‘9“;·$¤§¢¼F¿O¹OÈQÖOr'   c               ó   € V ^8„  d   QhRR/# )r   Ú	lock_pathr   r#   )r$   s   "r%   r&   r&   F   s   € ÷ "ñ "˜tñ "r'   c              #  ó¶  "  € \        V 4      p \        \        RR4      pVf   \        4       ;p\        n        \
        f	   \        e   W9   d   Rx € R# V P                  P                  RRR7       \        '       dI   V P                  4       '       d    V P                  4       P                  ^ 8X  d   V P                  RRR7       \        T \        '       d   RMR	RR7      ;_uu_ 4       p\        VR4       VP                  V 4        Rx € VP!                  V 4       \#        \$        \&        4      ;_uu_ 4        \        VR
4       RRR4       RRR4       R#   + '       g   i     L; i  TP!                  T 4       \#        \$        \&        4      ;_uu_ 4        \        TR
4       RRR4       i   + '       g   i     i ; i; i  + '       g   i     R# ; i5i)zÏExclusive cross-process lock on ``lock_path`` held across a read-modify-write cycle.
Re-entrant within one thread (a nested acquire of the same path just runs); a no-op
where neither fcntl nor msvcrt exists.ÚpathsNT©ÚparentsÚexist_okÚ zutf-8©Úencodingzr+za+F)r   ÚgetattrÚ_held_locksÚsetrL   r=   rB   ÚparentÚmkdirÚexistsÚstatÚst_sizeÚ
write_textÚopenrH   ÚaddÚdiscardr   ÚOSErrorÚIOError)rJ   ÚheldrG   s   &  r%   Úskill_file_lockrb   E   sH  é € ô
 �Y“€IÜ”; ¨Ó.€DØ‚|Ü#&£5Ð(ˆŒ{Ô ÜŠœ&š.¨YÔ->ÛÙØ×Ñ×Ñ 4°$ÐÔ7ßƒv�y×'Ñ'×)Ò)¨Y¯^©^Ó-=×-EÑ-EÈÔ-JØ×Ñ˜S¨7ÐÔ3Ü	ˆi§£™¨T¸G×	DÕ	DÈÜˆr�4ÔØ�‰�Ôð	"Ûà�L‰L˜Ô#Üœ'¤7×+Õ+Ü�r˜5Ô!÷ ,÷ 
EÑ	D÷ ,×+ûð �L‰L˜Ô#Üœ'¤7×+Õ+Ü�r˜5Ô!÷ ,×+×+Ð+ý÷ 
E×	DÐ	Düss   ‚A:GÁ=GÂAGÃ)GÄE+Ä-GÄ9E	ÅGÅ
GÅE(Å#GÅ+.GÆF/Æ&	GÆ/F?Æ:GÇGÇG	Ç	Gc                 óF   € \        \        4       P                  R4      4      # )z@Serialize .usage.json read-modify-write cycles across processes.z
.json.lock)rb   r4   Úwith_suffixr#   r'   r%   Ú_usage_file_lockre   _   s   € äœ;›=×4Ñ4°\ÓBÓCÐCr'   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úpathr   Úfail_logr    r!   ú	list[str]r#   )r$   s   "r%   r&   r&   d   s!   € ÷ ñ �dð  cð ¨iñ r'   c                ó  € V P                  4       '       g   . #  R V P                  RR7      P                  4        4        Uu. uF  q"'       g   K  VNK  	  up# u upi   \         d"   p\        P                  Y4       . u Rp?# Rp?ii ; i)zNStripped, non-empty lines of a small metadata file ([] if missing/unreadable).c              3  ó@   "  € T F  qP                  4       x € K  	  R # 5ir)   )Ústrip©Ú.0Úlines   & r%   Ú	<genexpr>Ú_read_lines.<locals>.<genexpr>i   s   é € ÐgÑ5f¨TŸJ™JŸL˜LÓ5fùs   ‚ú	utf-8-sigrQ   N)rX   Ú	read_textÚ
splitlinesr_   ÚloggerÚdebug)rg   rh   ÚsÚes   &&  r%   Ú_read_linesry   d   sp   € à�;‰;�=Š=Øˆ	ðÙg°T·^±^È[°^Ó5Y×5dÑ5dÔ5fÔgÓmÑg�aÓkl—�ÑgÑmÐmùÒmøÜô Ü�‰�XÔ!Ø�	ûðús5   š)A Á	AÁAÁA ÁA ÁBÁ*BÂ BÂBc               ó   € V ^8„  d   QhRR/# )r   r!   r    r#   )r$   s   "r%   r&   r&   o   s   € ÷ )ñ )�#ñ )r'   c                 óR   € \         P                  ! \        4      P                  4       # r)   )r   Únowr   Ú	isoformatr#   r'   r%   Ú_now_isor~   o   s   € Ü�<Š<œÓ×&Ñ&Ó(Ð(r'   c               ó    € V ^8„  d   QhRRRR/# )r   Úvaluer	   r!   zOptional[datetime]r#   )r$   s   "r%   r&   r&   s   s   € ÷ Vñ V ð VÐ(:ñ Vr'   c                óâ   €  V '       d    \         P                  ! \        V 4      4      MR pT'       d%   TP
                  f   TP                  \        R7      # T#   \        \        3 d     R # i ; i)N)Útzinfo)r   Úfromisoformatr    Ú	TypeErrorÚ
ValueErrorr‚   Úreplacer   )r€   Úparseds   & r%   Ú_parse_iso_timestamprˆ   s   s[   € ðß7<”×'Ò'¬¨E«
Ô3À$ˆ÷ *0°F·M±MÒ4Iˆ6�>‰>¤ˆ>Ó%ÐUÈvÐUøô ”zÐ"ô Úðús   ‚A Š!A ÁA.Á-A.c               ó    € V ^8„  d   QhRRRR/# )r   Úrecordúdict[str, Any]r!   úOptional[str]r#   )r$   s   "r%   r&   r&   {   s   € ÷ Bñ B˜~ð B°-ñ Br'   c                óº   a € V 3R lR 4        Uu. uF!  p\        V4      ;pf   K  V\        V4      3NK#  	  ppV'       d   \        VR R7      ^,          # R# u upi )zhNewest use/view/patch timestamp; ``created_at`` is excluded so never-active skills stay distinguishable.c              3  óF   <"  € T F  pSP                  V4      x € K  	  R # 5ir)   )Úget)rn   ÚkrŠ   s   & €r%   rp   Ú%latest_activity_at.<locals>.<genexpr>}   s   øé € Ð(vÑ@u¸1¨¯©°A¯¨Ó@uùs   ƒ!Nc                ó   € V ^ ,          # ©r<   r#   )Úts   &r%   Ú<lambda>Ú$latest_activity_at.<locals>.<lambda>   s   €  Q q¦Tr'   )Úkey)Úlast_used_atÚlast_viewed_atÚlast_patched_at)rˆ   r    Úmax)rŠ   ÚrawÚdtÚstampss   f   r%   Úlatest_activity_atrŸ   {   s^   ø€ ä(vÑ@uÔ(vó @Ñ(v Ü,¨SÓ1Ð1�"ô ˆr”3�s“8‹nÑ(v€Fð @ç17Œ3ˆv™>Ô*¨1Õ-ÐA¸TÐAùò@s
   �A¦Ac               ó    € V ^8„  d   QhRRRR/# ©r   r€   r	   r!   Úintr#   )r$   s   "r%   r&   r&   ‚   s   € ÷ ñ ˜ð  ñ r'   c                ó^   €  \        T ;'       g    ^ 4      #   \        \        3 d     ^ # i ; ir“   )r¢   r„   r…   ©r€   s   &r%   Ú_int_or_zeror¥   ‚   s.   € ðÜ�5—:�:˜A‹ÐøÜ”zÐ"ô Úðús   ‚ � —,«,c               ó    € V ^8„  d   QhRRRR/# r¡   r#   )r$   s   "r%   r&   r&   ‰   s   € ÷ Iñ I˜Sð I Sñ Ir'   c                ó\   € \        V \        4      '       d   ^ # \        ^ \        V 4      4      # r“   )Ú
isinstancer"   r›   r¥   r¤   s   &r%   Ú_non_negative_intr©   ‰   s%   € Ü˜5¤$×'Ò'ˆ1ÐH¬S°´LÀÓ4GÓ-HÐHr'   c               ó    € V ^8„  d   QhRRRR/# )r   rŠ   r‹   r!   r¢   r#   )r$   s   "r%   r&   r&   �   s   € ÷ dñ d˜>ð d¨cñ dr'   c                ó.   a € \        V 3R lR 4       4      # )z%Total observed use+view+patch events.c              3  óX   <"  € T F  p\        SP                  V4      4      x € K!  	  R # 5ir)   )r¥   r�   )rn   r—   rŠ   s   & €r%   rp   Ú!activity_count.<locals>.<genexpr>�   s#   øé € ÐcÑ8b°Œ|˜FŸJ™J s›O×,Ð,Ó8bùs   ƒ'*)Ú	use_countÚ
view_countÚpatch_count)Úsum©rŠ   s   fr%   Úactivity_countr³   �   s   ø€ äÔcÑ8bÓcÓcÐcr'   c               ó   € V ^8„  d   QhRR/# ©r   r!   r   r#   )r$   s   "r%   r&   r&   “   s   € ÷ iñ i˜Xñ ir'   c                 ó¤   € \        \        4       R,          R4      p R V  4        Uu0 uF  q'       g   K  VkK  	  up\        4       ,          # u upi )a(  Built-in names: ``.bundled_manifest`` ("name:hash" per line) plus the curator suppression list, which
only ever records built-ins; a pruned built-in whose manifest entry an older sync cleaned after the
catalog dropped it is still not agent-authored (#95415). Empty if both are missing/unreadable.z.bundled_manifestz#Failed to read bundled manifest: %sc              3  ón   "  € T F+  qP                  R ^4      ^ ,          P                  4       x € K-  	  R# 5i)Ú:N)Úsplitrl   rm   s   & r%   rp   Ú&_read_bundled_names.<locals>.<genexpr>˜   s*   é € ÐHÁ%¸$Ÿ
™
 3¨Ó*¨1Õ-×3Ñ3×5Ð5Ã%ùs   ‚35)ry   r0   Úread_suppressed_names)ÚlinesÚns     r%   Ú_read_bundled_namesr¾   “   sE   € ô œ›Ð(;Õ;Ð=bÓc€EÙHÁ%ÔHÓNÑH�!ËA�AˆAÑHÑNÔQfÓQhÕhÐhùÒNs
   §	AµAc               ó   € V ^8„  d   QhRR/# rµ   r#   )r$   s   "r%   r&   r&   ›   s   € ÷ ñ  8ñ r'   c                 ó¾  € \        4       p V R,          R,          pVP                  4       '       g   \        4       #  \        P                  ! VP                  RRR7      4      p\        V\        4      '       d   VP                  R4      ;'       g    / MRp\        V\        4      '       g   \        4       # V Uu0 uF  p\        V4      kK  	  ppR VP                  4        4       pR	 V 4        F…  p W,          P                  4       pVP                  V P                  4       4       TR
,          P                  4       '       g   KX  TP                  \!        TR
,          TP"                  R7      4       K‡  	  V# u upi   \        \        3 d     K¤  i ; i  \        \        P$                  3 d*   p	\&        P)                  RT	4        Rp	?	\        4       # Rp	?	ii ; i)zdHub-installed names (``.hub/lock.json``) plus the frontmatter name of each in-tree ``install_path``.z.hubz	lock.jsonrr   r†   ©rR   ÚerrorsÚ	installedNc              3  ót   "  € T F.  p\        V\        4      '       g   K  VP                  R 4      x € K0  	  R# 5i)Úinstall_pathN©r¨   Údictr�   )rn   rx   s   & r%   rp   Ú,_read_hub_installed_names.<locals>.<genexpr>«   s,   é € ÐZÑ0B¨1ÄjÐQRÔTX×FYÔ&�—‘�~×&Ð&Ó0Bùs   ‚8Ÿ8c              3  ó†   "  € T F7  p\        V\        4      '       g   K  VP                  4       '       g   K3  Vx € K9  	  R # 5ir)   )r¨   r    rl   ©rn   Úps   & r%   rp   rÈ   ¬   s%   é € ÐR© 1´¸A¼s×1CœQÈÏÉÏ	ŸQšQ«ùs   ‚AŸA·
AúSKILL.md©Úfallbackz Failed to read hub lock file: %s)r0   rX   rU   ÚjsonÚloadsrs   r¨   rÇ   r�   r    ÚvaluesÚresolveÚrelative_tor_   r…   r]   Úread_skill_nameÚnameÚJSONDecodeErrorru   rv   )
Ú
skills_dirrJ   ÚdatarÃ   r�   ÚnamesrL   rÅ   Úresolvedrx   s
             r%   Ú_read_hub_installed_namesrÛ   ›   s�  € ä“€JØ˜VÕ# kÕ1€IØ×Ñ×ÒÜ‹uˆð<ô �zŠz˜)×-Ñ-°{È9Ð-ÓUÓVˆÜ5?ÀÄd×5KÒ5K�T—X‘X˜kÓ*×0Ð0¨bøÐQUˆ	Ü˜)¤T×*Ò*Ü“5ˆLÙ!*Ó+¡˜A”�Q–¡ˆÐ+ÙZ°	×0@Ñ0@Ô0BÓZˆÙR©ÖRˆLðØ&Õ5×>Ñ>Ó@�Ø×$Ñ$ Z×%7Ñ%7Ó%9Ô:ð ˜:Õ%×-Ñ-×/Ô/Ø—	‘	œ/¨(°ZÕ*?È(Ï-É-ÔXÖYñ Sð ˆùò ,øô œZÐ(ô Úðûô
 ”T×)Ñ)Ð*ô <Ü�‰Ð7¸×;Ð;Ü‹5€Lûð<ús`   ¼AF Â$F Â6F Â:E;Ã%F Ã45F Ä)F Å2F Å;F Æ FÆF ÆFÆF ÆGÆ3GÇGc               ó   € V ^8„  d   QhRR/# )r   r!   r"   r#   )r$   s   "r%   r&   r&   º   s   € ÷ ñ  ñ r'   c                 ó   €  ^ RI Hp  V ! 4       P                  R4      p\        V\        4      '       d   \        VP                  RR4      4      # R#   \         d"   p\        P                  RT4        Rp?R# Rp?ii ; i)zo``curator.prune_builtins`` (default False); lazy config import keeps this module importable during update/sync.)Úload_configÚcuratorÚprune_builtinsFz)Failed to read curator.prune_builtins: %sN)	Úhermes_cli.configrÞ   r�   r¨   rÇ   r"   Ú	Exceptionru   rv   )rÞ   Úcurrx   s      r%   Ú_prune_builtins_enabledrä   º   sg   € ðÝ1Ù‹m×Ñ 	Ó*ˆÜ9CÀCÌ×9NÒ9NŒt�C—G‘GÐ,¨eÓ4Ó5ÐYÐTYÐYøÜô Ü�‰Ð@À!ÔDÝûðús   ‚AA ÁA ÁA=ÁA8Á8A=c               ó   € V ^8„  d   QhRR/# rµ   r#   )r$   s   "r%   r&   r&   Å   s   € ÷ @ñ @˜xñ @r'   c                 ó–   € \        \        4       R,          R4      p V  Uu0 uF  qP                  R4      '       d   K  VkK  	  up# u upi )zlBuilt-ins the curator pruned (``.curator_suppressed``); the update-time re-seeder must leave these archived.ú.curator_suppressedz+Failed to read curator suppression list: %sÚ#)ry   r0   Ú
startswith)r¼   ro   s     r%   r»   r»   Å   s:   € äœ›Ð(=Õ=Ð?lÓm€EÙ"Ó?™U�T¯/©/¸#×*>�DˆD™UÑ?Ð?ùÒ?s
    A½Ac               ó$   € V ^8„  d   QhRRRRRR/# )r   r   r    r]   r"   r!   r:   r#   )r$   s   "r%   r&   r&   Ë   s&   € ÷ 	Wñ 	W¨ð 	W°Tð 	W¸dñ 	Wr'   c               ó~  € V '       d   V \        4       ;p9   V8X  d   R# V'       d   VP                  MVP                  ! V 4        \        \	        4       R,          RP                  \        V4      4      V'       d   RMR,           RR7       R#   \         d$   p\        P                  RTRR	7        Rp?R# Rp?ii ; i)
zdAdd (built-in pruned) or drop (restored) *skill_name* in the suppression list; no-op when unchanged.Nrç   Ú
Ú z.curator_suppressed_©Ú
tmp_prefixz,Failed to write curator suppression list: %sT©Úexc_info)
r»   r]   r^   r   r0   ÚjoinÚsortedrâ   ru   rv   )r   r]   rÙ   rx   s   &$  r%   Ú_toggle_suppressed_namerô   Ë   s”   € ç˜*Ô2GÓ2IÐ)I¨ÑJÈsÔRÙß€U‡Y‚Y˜5Ÿ=™=Ð(¨*Ô5ðWÜœ+›-Ð*?Õ?ÀÇÁÌ6ÐRWË=ÓAY×ejÑ]aÐprÕAsØ%;÷	=øäô WÜ�‰ÐCÀQÐQUˆ×VÒVûðWús   ÁAB ÂB<ÂB7Â7B<c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úbaser   Ú
local_onlyr"   r!   zIterator[tuple[str, Path]]r#   )r$   s   "r%   r&   r&   ×   s'   € ÷ Uñ U˜$ð U¨tð UÐ8Rñ Ur'   c             #  óâ   "  € V P                  R4       FU  p\        V4      '       d   K  V'       d   \        V4      '       d   K1  \        W"P                  P
                  R7      V3x € KW  	  R# 5i)z´``(frontmatter name, SKILL.md)`` under *base* minus metadata/VCS/venv/cache dirs; *local_only* also skips
external skill dirs mounted below the tree (curation must not touch them).rÌ   rÍ   N)Úrglobr   r   rÔ   rV   rÕ   )rö   r÷   Úskill_mds   &$ r%   Ú_iter_skill_mdsrû   ×   sM   é € ð —J‘J˜zÖ*ˆÜ& x×0Ô0·ZÔDZÐ[c×DdÔDdÜ! (·_±_×5IÑ5IÔJÈHÐTÔTó +ùs   ‚#A/ªA/²A/Á*A/c               ó    € V ^8„  d   QhRRRR/# )r   Úkeepz5Callable[[str, Path, set[str], dict[str, Any]], bool]r!   ri   r#   )r$   s   "r%   r&   r&   ß   s    € ÷ tñ tÐRð tÐW`ñ tr'   c                ó8  € \        4       ;pP                  4       '       g   . # \        4       \        4       \	        4       rCp\        \        VRR7       UUu0 uF3  w  rVWR9  g   K  \        V4      '       d   K   V ! WVW44      '       g   K1  VkK5  	  upp4      # u uppi )zlSorted local skill names passing *keep(name, skill_md, bundled, usage)*; hub/protected names never reach it.T©r÷   )r0   rX   rÛ   r¾   Ú
load_usageró   rû   r+   )rý   rö   ÚhubÚbundledÚusagerÕ   rú   s   &      r%   Ú_scan_local_skillsr  ß   s�   € ä“MÐ!ˆD×)Ñ)×+Ò+Øˆ	Ü3Ó5Ô7JÓ7LÌjËl�%€CÜ¬o¸dÈtÕ.Tô sÑ.T™N˜DØ‘oô Ü.BÀ4×.Hô ÙMQÐRVÐbi×Mq÷ �4Ñ.Tò só tð tùó ss   Á
B
Á$B
Á7B
ÂB
c               ó   € V ^8„  d   QhRR/# ©r   r!   ri   r#   )r$   s   "r%   r&   r&   è   s   € ÷ ~ñ ~¨	ñ ~r'   c                 ó6   a € \        4       o \        V 3R l4      # )zÓCurator-manageable skills: ``created_by: agent`` records plus, with ``curator.prune_builtins``, bundled
built-ins (which never carry a managed record, so the record gate applies only to local skills). Never hub.c                óH   <€ W9   d   S# \        VP                  V 4      4      # r)   )Ú_is_curator_managed_recordr�   )rÕ   Ú_mdr  r  rà   s   &&&&€r%   r•   Ú0list_agent_created_skill_names.<locals>.<lambda>í   s$   ø€ ¸D¼O¨.Ð*|ÔQkÐlq×luÑluÐvzÓl{ÓQ|Ð*|r'   )rä   r  )rà   s   @r%   Úlist_agent_created_skill_namesr  è   s   ø€ ô -Ó.€NÜÜ|ó~ð ~r'   c               ó   € V ^8„  d   QhRR/# r  r#   )r$   s   "r%   r&   r&   ð   s   € ÷ [ñ [ 9ñ [r'   c                 óä   € \        4       p V P                  4       '       dK   \        V P                  4        Uu0 uF&  qP	                  4       '       g   K  VP
                  kK(  	  up4      # . # u upi )u`   Skills in ``.archive/`` â€” flat layout (``archive_skill`` flattens), so dir name == skill name.)r7   rX   ró   ÚiterdirÚis_dirrÕ   )ÚrootrË   s     r%   Úlist_archived_skill_namesr  ð   sH   € ä‹>€DØEIÇ[Á[Ç]Â]Œ6 4§<¡<¤>Ó@¡>˜a·X±X·Z”6�1—6”6¡>Ñ@ÓAÐZÐXZÐZùÒ@s   ¸A-ÁA-c               ó$   € V ^8„  d   QhRRRRRR/# )r   rú   r   rÎ   r    r!   r#   )r$   s   "r%   r&   r&   ö   s!   € ÷ 4ñ 4˜dð 4¨cð 4°cñ 4r'   c                óv  €  V P                  RRR7      R,          P                  R4       Uu. uF  q"P                  4       NK  	  ppRT9  d   T# Y3P	                  R4      ^,           R pRT9   d   TRTP	                  R4       MTpR T 4       p\        R	 T 4       T4      # u upi   \         d    Tu # i ; i)
zRThe frontmatter ``name:`` field of a SKILL.md (first 4000 chars), else *fallback*.rr   r†   rÁ   :Ni   Nrì   z---Nc              3  ó¾   "  € T FS  qP                  R 4      '       g   K  VP                  R^4      ^,          P                  4       P                  R4      x € KU  	  R# 5i)zname:r¸   z"'N)ré   r¹   rl   rm   s   & r%   rp   Ú"read_skill_name.<locals>.<genexpr>   sD   é € ÐgÁU¸TÏoÉoÐ^e×NfÔ8ˆd�j‰j˜˜aÓ  Õ#×)Ñ)Ó+×1Ñ1°%×8Ð8ÃUùs
   ‚AŸ>Ac              3  ó8   "  € T F  q'       g   K  Vx € K  	  R # 5ir)   r#   )rn   Úvs   & r%   rp   r    s   é € Ð(™F�q£a—’›Fùs   ‚	�
)rs   r¹   rl   r_   ÚindexÚnext)rú   rÎ   ro   r¼   ÚblockrÑ   s   &&    r%   rÔ   rÔ   ö   sÁ   € ðØ*2×*<Ñ*<ÀkÐZcÐ*<Ó*dÐejÕ*k×*qÑ*qÐrvÔ*wÓxÑ*w $—‘–Ñ*wˆÐxð �EÔØˆØ—+‘+˜eÓ$ qÕ(Ð)Ð*€EØ*/°5¬.ˆEÐ%�5—;‘;˜uÓ%Ñ&¸e€EÙgÁUÓg€FÜÑ(™FÓ(¨(Ó3Ð3ùò yøÜô ØŠðús"   ‚+B( ­B#ÁB( Â#B( Â(B8Â7B8c               ó    € V ^8„  d   QhRRRR/# r   r#   )r$   s   "r%   r&   r&     s   € ÷ añ a ð a¨ñ ar'   c                óœ   € \        V 4      ;'       g    \        V 4      '       * ;'       d#    \        V 4      RJ;'       g    \        V 4      RJ # )zLNeither bundled nor hub-installed (and not only present in an external dir).N)Ú
is_bundledÚis_hub_installedÚ_find_skill_dirÚ_find_external_skill_dirr*   s   &r%   Úis_agent_createdr"    sN   € ä˜:Ó&×FÐFÔ*:¸:Ó*FÔG÷ að aÜ˜
Ó#¨4Ð/×_Ð_Ô3KÈJÓ3WÐ[_Ð3_ðar'   c               ó    € V ^8„  d   QhRRRR/# r   r#   )r$   s   "r%   r&   r&   
  s   € ÷ 5ñ 5 ð 5¨ñ 5r'   c                ó   € V \        4       9   # r)   )rÛ   r*   s   &r%   r  r  
  s   € ØÔ2Ó4Ñ4Ð4r'   c               ó    € V ^8„  d   QhRRRR/# r   r#   )r$   s   "r%   r&   r&     s   € ÷ /ñ /˜3ð / 4ñ /r'   c                ó   € V \        4       9   # r)   )r¾   r*   s   &r%   r  r    s   € ØÔ,Ó.Ñ.Ð.r'   c               ó    € V ^8„  d   QhRRRR/# ©r   r   r    r!   r#   )r$   s   "r%   r&   r&     s   € ÷ oñ o¨Cð o°Cñ or'   c                ó   € R V  R2# )úskill 'zM' lives in skills.external_dirs; external skills are read-only to the curatorr#   r*   s   &r%   Ú_external_read_only_messager+    s   € Ø�Z�LÐ mÐnÐnr'   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r   r    Ú
skill_pathúOptional[Path]r!   r"   r#   )r$   s   "r%   r&   r&     s'   € ÷ 	pñ 	p Sð 	p°nð 	pÐPTñ 	pr'   c                ó
  € Ve   \        V4      '       g#   \        V 4      '       g   \        V 4      '       d   R# \        V 4      '       d   \	        4       # \        V 4      pV'       d   \        V4      '       * # \        V 4      RJ # )z„Agent-created: yes. Bundled: only with ``curator.prune_builtins``. Hub / external-dir / protected built-ins:
never (external owner).NF)r   r+   r  r  rä   r   r!  )r   r-  Ú	local_dirs   && r%   Úis_curation_eligibler1    sp   € ð 
Ò	Ô$:¸:×$FÒ$FÔK_Ð`j×KkÒKkÜ 
×+Ò+ÙÜ�*×ÒÜ&Ó(Ð(Ü 
Ó+€Iß4=Ô% iÓ0Ô0ÐoÔC[Ð\fÓCgÐkoÐCoÐor'   c               ó    € V ^8„  d   QhRRRR/# )r   rŠ   r	   r!   r"   r#   )r$   s   "r%   r&   r&   "  s   € ÷ uñ u sð u¨tñ ur'   c                ó�   € \        V \        4      ;'       d0    V P                  R4      R8H  ;'       g    V P                  R4      RJ # )am  ``created_by`` is a curator-management OPT-IN flag, not proof of authorship (``curator adopt`` flips it);
the key name is kept because it lives in every user's ``.usage.json``.

NAMING (issue #67140): the on-disk field is ``created_by``, which reads like provenance but is consumed
as a **curator-management opt-in policy flag**. The two are not the same question:
Ú
created_byÚagentÚagent_createdTrÆ   r²   s   &r%   r	  r	  "  sB   € ô �fœdÓ#×tÐt¨¯©°LÓ)AÀWÑ)L×)sÐ)sÐPV×PZÑPZÐ[jÓPkÐosÐPsÐtr'   c               ó    € V ^8„  d   QhRRRR/# r   r#   )r$   s   "r%   r&   r&   ,  s   € ÷ Dñ D 3ð D¨4ñ Dr'   c                óF   € \        \        4       P                  V 4      4      # r)   )r	  r   r�   r*   s   &r%   Úis_curator_managedr9  ,  s   € Ü%¤j£l×&6Ñ&6°zÓ&BÓCÐCr'   c               ó   € V ^8„  d   QhRR/# r  r#   )r$   s   "r%   r&   r&   0  s   € ÷ ,ñ , Iñ ,r'   c                 ó   € \        R 4      # )u  Curation-ELIGIBLE skills without a provenance marker (pre-``created_by`` records, or foreground creates that
belong to the user). Invisible to ``curated_report()`` and auto transitions; only ``curator adopt`` hands
them over â€” provenance is declared, never inferred from activity.c                ó~   € W9  ;'       d3    \        VP                  V 4      4      '       * ;'       d    \        W4      # r)   )r	  r�   r1  )rÕ   Úmdr  r  s   &&&&r%   r•   Ú,list_unmanaged_skill_names.<locals>.<lambda>5  s@   € ¨Ñ)<÷ *+ð *+ÔE_Ð`e×`iÑ`iÐjnÓ`oÓEpÔAp÷ *+ð *+Ü  Ó*ð*+r'   )r  r#   r'   r%   Úlist_unmanaged_skill_namesr?  0  s   € ô ñ	+ó,ð ,r'   c               ó   € V ^8„  d   QhRR/# ©r   r!   zlist[dict[str, Any]]r#   )r$   s   "r%   r&   r&   9  s   € ÷ 3ñ 3Ð.ñ 3r'   c                 ó´   € \        4       p \        4        Uu. uF5  p\        WP                  V4      RV P                  V/ 4      9   W9   R7      NK7  	  up# u upi )z”Rows for :func:`list_unmanaged_skill_names`; ``has_provenance_key`` (False = pre-dates ``created_by``) explains
WHY, it is not a signal to adopt on.r4  )Úhas_provenance_keyÚ
has_record)r   r?  Ú_report_rowr�   )r  r½   s     r%   Úunmanaged_reportrF  9  sZ   € ô ‹L€Eä/Ô1ó3Ù1�ô ˜Ÿ9™9 Q›<¸LÈEÏIÉIÐVWÐY[ÓL\Ñ<\ÐijÑis×tÙ1ñ3ð 3ùò 3s   —;Ac               ó    € V ^8„  d   QhRRRR/# ©r   r   r    r!   útuple[bool, str]r#   )r$   s   "r%   r&   r&   A  s   € ÷ Fñ F˜Cð FÐ$4ñ Fr'   c                óÊ  € V '       g   R# \        V 4      '       d	   RRV  R23# \        V 4      '       d	   RRV  R23# \        V 4      '       d	   RRV  R23# \        V 4      pVf   \	        V 4      e	   RRV  R23# RRV  R23# \        V4      '       d   R\        V 4      3# \        V 4      '       d	   R	RV  R
23# \        V 4       \        V 4      '       d	   R	RV  R23# RRV  R23# )z©User-declared handover: writes the ``created_by: agent`` marker (inactivity clock NOT reset). Refuses hub,
external, bundled and protected skills. Returns (ok, message).FÚ'z7' is a protected built-in; the curator never manages itz(' is hub-installed; its upstream owns ituU   ' is a bundled built-in â€” it is governed by curator.prune_builtins, not by adoptionz?' lives in skills.external_dirs and is read-only to the curatorr*  ú' not foundTz' is already curator-managedz	adopted 'z' into curator managementzcould not mark 'z' as curator-managed)Fzno skill name given)	r+   r  r  r   r!  r   r+  r9  Úmark_agent_created)r   Ú	skill_dirs   & r%   Úadopt_skillrO  A  s+  € ÷ Ø+Ð+Ü˜J×'Ò'Ø˜˜*˜Ð%\Ð]Ð]Ð]Ü˜
×#Ò#Ø˜˜*˜Ð%MÐNÐNÐNÜ�*×ÒØ˜˜*˜Ð%zÐ{Ð{Ð{Ü 
Ó+€IØÒÜ# JÓ/Ò;Ø˜A˜j˜\Ð)hÐiÐiÐiØ˜ 
˜|¨;Ð7Ð7Ð7Ü˜i×(Ò(ØÔ1°*Ó=Ð=Ð=Ü˜*×%Ò%Ø�q˜˜Ð$@ÐAÐAÐAÜ�zÔ"Ü˜*×%Ò%Ø�y  Ð,EÐFÐFÐFØÐ$ Z LÐ0DÐEÐEÐEr'   c               ó   € V ^8„  d   QhRR/# )r   r!   r‹   r#   )r$   s   "r%   r&   r&   \  s   € ÷ #ñ #�~ñ #r'   c                 óV   € R RR^ R^ RRRRR^ R^ R^ R	RR
\        4       R\        RRRRRR/# )r4  Nr®   r¯   r˜   r™   r°   Úpatch_generationÚlast_reused_patch_generationrš   Ú
created_atÚstateÚpinnedFÚarchived_atÚfirst_seen_at)r~   ÚSTATE_ACTIVEr#   r'   r%   Ú_empty_recordrZ  \  sS   € Ø˜$ ¨Q°¸aÀÐQUÐWgÐimØ˜1Ð0°!Ð5SÐUVÐXiÐkoØœ(›* g¬|¸XÀuÈmÐ]aà˜Tð	#ð #r'   c               ó    € V ^8„  d   QhRRRR/# )r   Úrecr	   r!   r‹   r#   )r$   s   "r%   r&   r&   d  s   € ÷ Qñ Q�Sð Q˜^ñ Qr'   c                ó¾   € \        V \        4      '       g   \        4       # / V C\        4       P                  4        UUu/ uF  w  rW9  g   K  WbK  	  uppC# u uppi )zO*rec* with every missing default key appended (a fresh record when not a dict).)r¨   rÇ   rZ  Úitems)r\  r�   r  s   &  r%   Ú_backfilledr_  d  sP   € ä�cœ4× Ò Ü‹ÐØPˆcÐP¤}£×'<Ñ'<Ô'>ÔOÑ'>™t˜qÀ!Á,”d�a’dÑ'>ÒOÐPÐPùÓOs   ¿
AÁAc               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rÕ   r    rœ   r	   Úextrar!   r‹   r#   )r$   s   "r%   r&   r&   k  s(   € ÷ ñ �cð  ð ¨cð °nñ r'   c                ór   € R V /\        V4      CVCpVP                  \        V4      \        V4      R7       V# )rÕ   )Úlast_activity_atr³   )r_  ÚupdaterŸ   r³   )rÕ   rœ   ra  Úrows   &&, r%   rE  rE  k  s<   € Ø�4Ð
5œ; sÓ+Ð
5¨uÐ
5€CØ‡J�JÔ 2°3Ó 7ÌÐWZÓH[€JÔ\Ø€Jr'   c               ó   € V ^8„  d   QhRR/# )r   r!   údict[str, dict[str, Any]]r#   )r$   s   "r%   r&   r&   q  s   € ÷ iñ iÐ-ñ ir'   c                 óÜ  € \        4       p  V P                  4       '       d'   \        P                  ! V P	                  RR7      4      M/ p\        T\        4      '       dG   TP                  4        UUu/ uF)  w  r4\        T\        4      '       g   K  \        T4      TbK+  	  upp# / #   \
        \        P                  3 d#   p\        P                  RY4       / u Rp?# Rp?ii ; iu uppi )zKThe whole .usage.json map (non-dict values dropped); {} on missing/corrupt.rr   rQ   zFailed to read %s: %sN)r4   rX   rÏ   rÐ   rs   r_   rÖ   ru   rv   r¨   rÇ   r^  r    )rg   rØ   rx   r�   r  s        r%   r   r   q  s²   € ä‹=€DðØCGÇ;Á;Ç=Â=Œt�zŠz˜$Ÿ.™.°+˜.Ó>Ô?ÐVXˆô KUÐUYÔ[_×J`ÒJ` $§*¡*¤,ÔF¡,™$˜!´*¸QÄ×2EŒIŒC�‹F�AŠI¡,ÒFÐhÐfhÐhøô ”T×)Ñ)Ð*ô Ü�‰Ð,¨dÔ6Ø�	ûðüó Gs)   Œ>B( Á3C(ÂC(Â(C%ÃC ÃC%Ã C%c               ó    € V ^8„  d   QhRRRR/# )r   rØ   rg  r!   r"   r#   )r$   s   "r%   r&   r&   |  s   € ÷ ñ Ð.ð °4ñ r'   c           
     óÊ   € \        4       p \        V\        P                  ! V ^RRR7      RR7       R#   \         d$   p\
        P                  RYRR7        Rp?R# Rp?ii ; i)	z7Write the usage map atomically; True when it committed.TF)ÚindentÚ	sort_keysÚensure_asciiz.usage_rî   zFailed to write %s: %srð   N)r4   r   rÏ   Údumpsrâ   ru   rv   )rØ   rg   rx   s   &  r%   Ú
save_usagero  |  sT   € ä‹=€DðÜ˜$¤§
¢
¨4¸ÀTÐX]Ô ^ÐktÕuÙøÜô Ü�‰Ð-¨tÀˆÔFÝûðús   Œ&4 ´A"¿AÁA"c               ó    € V ^8„  d   QhRRRR/# )r   r   r    r!   r‹   r#   )r$   s   "r%   r&   r&   ‡  s   € ÷ 5ñ 5˜3ð 5 >ñ 5r'   c                óF   € \        \        4       P                  V 4      4      # )zDThe (backfilled) record for *skill_name*; fresh defaults if missing.)r_  r   r�   r*   s   &r%   Ú
get_recordrr  ‡  s   € ä”z“|×'Ñ'¨
Ó3Ó4Ð4r'   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   r   r    Úopz7Callable[[dict[str, dict[str, Any]]], tuple[Any, bool]]rh   ÚguardzOptional[Callable[[], bool]]r!   r	   r#   )r$   s   "r%   r&   r&   Œ  s3   € ÷ ñ ˜sð Ð(_ð Ðknð Ø6ðØBEñr'   c                óP  €  Ve   V! 4       '       g   R# \        4       ;_uu_ 4        \        4       pV! V4      w  rVV'       d   \        V4      '       g   RMTuuRRR4       #   + '       g   i     R# ; i  \         d$   p\        P                  Y TRR7        Rp?R# Rp?ii ; i)zÌ*op(data) -> (result, dirty)* under the file lock, saving only when dirty; *guard* runs before locking.
None when the guard failed, the save did not land, or anything raised (DEBUG-logged via *fail_log*).NTrð   )re   r   ro  râ   ru   rv   )r   rt  rh   ru  rØ   ÚresultÚdirtyrx   s   &&&&    r%   Ú_locked_updatery  Œ  sw   € ð	ØÒ¡U§W¢WÙÜ×ÕÜ“<ˆDÙ˜t›H‰MˆFß ¬°D×)9Ò)9‘4¸v÷  ××Óûô ô Ü�‰�X¨1°tˆÔ<Ýûðús9   ‚A7 •A7 §1A#Á
A7 Á#A4	Á.A7 Á4A7 Á7B%ÂB Â B%c               ó    € V ^8„  d   QhRRRR/# ©r   r   r    r!   r:   r#   )r$   s   "r%   r&   r&   œ  s   € ÷ _ñ _ sð _¨tñ _r'   c                óh   a € S '       d)   \        S 4      '       d   V 3R lp\        S VR4       R# R# R# )zgBaseline record for a curation-eligible skill so its inactivity clock starts at first sight, not epoch.c                óv   <€ R SV 9  ;'       d+    V P                  S/ \        4       CR\        4       /C4      R J3# )NrX  )Ú
setdefaultrZ  r~   )rØ   r   s   &€r%   Ú_seedÚ%seed_record_if_missing.<locals>._seed   sd   ø€ Ø˜¨4Ñ/÷  Nð  N°D·O±OÀJð  QAÔS`ÓSbð  QAÐdsÔu}Óuñ  QAó  5Bð  JNð  5Nð  Nð  Nr'   z1skill_usage.seed_record_if_missing(%s) failed: %sN)r1  ry  )r   r  s   f r%   Úseed_record_if_missingr�  œ  s+   ø€ çÔ*¨:×6Ò6õ	Nä�z 5Ð*]Ö^ñ	 7�zr'   c               ó    € V ^8„  d   QhRRRR/# r{  r#   )r$   s   "r%   r&   r&   ¥  s   € ÷ 	 ñ 	 ˜sð 	  tñ 	 r'   c                ó(   € R R lp\        W4       R# )u˜  Start a skill's inactivity clock NOW, once. Telemetry writes a record the moment a bundled skill is
seeded, so by the curator's first sight ``created_at`` can be months old and every never-used built-in
goes stale on that first pass (#79295); ``first_seen_at`` marks the clock as anchored so later runs age
it normally. A record the bug already marked stale is reactivated â€” the staleness was the artifact.c               ó    € V ^8„  d   QhRRRR/# )r   r\  r‹   r!   r:   r#   )r$   s   "r%   r&   Ú$reanchor_clock.<locals>.__annotate__ª  s   € ÷ (ñ (�Nð ( tñ (r'   c                ót   € \        4       ;V R &   V R&   V P                  R4      \        8X  d   \        V R&   R# R# )rT  rX  rU  N)r~   r�   ÚSTATE_STALErY  ©r\  s   &r%   Ú_applyÚreanchor_clock.<locals>._applyª  s7   € Ü3;³:Ð=ˆˆLÑ˜C Ñ0Ø�7‰7�7Óœ{Ô*Ü'ˆC�‹Lñ +r'   N©Ú_mutate©r   r‰  s   & r%   Úreanchor_clockrŽ  ¥  s   € õ
(ô ˆJÖr'   Úrequire_curation_eligibleFc               ó$   € V ^8„  d   QhRRRRRR/# )r   r   r    r�  r"   r!   r	   r#   )r$   s   "r%   r&   r&   ±  s'   € ÷ mñ m˜ð mÀDð mÐUXñ mr'   c               ód   a a€ S '       g   R# \        S VV 3R lRV'       d   V 3R l4      # R4      # )zØLoad, apply *mutator(record)* in place, save; the mutator result (None if nothing landed). Telemetry is
recorded for ANY skill; lifecycle mutators pass ``require_curation_eligible=True`` (never write onto unmanaged).Nc                óH   <€ S! V P                  S\        4       4      4      R 3# ©T)r~  rZ  )rØ   Úmutatorr   s   &€€r%   r•   Ú_mutate.<locals>.<lambda>¶  s   ø€ ±G¸D¿O¹OÈJÔXeÓXgÓ<hÓ4iÐkoÑ3pr'   z"skill_usage._mutate(%s) failed: %sc                 ó   <€ \        S 4      # r)   )r1  r*   s   €r%   r•   r•  ¸  s   ø€ Ô#7¸
Ô#Cr'   ©ry  )r   r”  r�  s   ff$r%   rŒ  rŒ  ±  s7   ù€ ÷ ÙÜ˜*Õ&pØ>ßHaÔCómð màgkómð mr'   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r   r    r—   r€   r	   r!   r"   r#   )r$   s   "r%   r&   r&   »  s.   € ÷ sñ s˜3ð s Sð s°ð s¸ñ sr'   c                ó>   aa€ \        \        V VV3R lRR7      4      # )zCCuration-gated single-field write; True only when the write landed.c                ó>   <€ V P                  SS/4      ;'       g    R # r“  )rd  )r\  r—   r€   s   &€€r%   r•   Ú_set_field.<locals>.<lambda>½  s   ø€ °·
±
¸CÀ¸<Ó0H×0PÐ0PÈDÐ0Pr'   T©r�  )r"   rŒ  )r   r—   r€   s   &ffr%   Ú
_set_fieldr�  »  s   ù€ ä”˜
Õ$PÐlpÔqÓrÐrr'   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r\  r‹   Ú	count_keyr    Úts_keyr!   r:   r#   )r$   s   "r%   r&   r&   À  s(   € ÷ ñ ˆ~ð ¨#ð °sð ¸tñ r'   c                ód   € \        V P                  V4      4      ^,           W&   \        4       W&   R# )é   N)r©   r�   r~   )r\  rŸ  r   s   &&&r%   Ú_bumpr£  À  s%   € Ü& s§w¡w¨yÓ'9Ó:¸QÕ>€C�NÜ“*€CƒKr'   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r   r    rŠ   úOptional[dict[str, Any]]r!   r#   )r$   s   "r%   r&   r&   Å  s(   € ÷ iñ i Sð iÐ2Jð iÐVYñ ir'   c                ó
  € \        V 4      '       g   \        V 4      '       d   R# RV 9   dK   \        \        4      ;_uu_ 4        ^ RIHp V! 4       P                  V 4      e    RRR4       R#  RRR4       RRRR/P                  \        V\        4      '       d   VP                  R4      MR4      ;p'       d   V# \        V 4      e   R# \        V 4      f   \        V\        4      '       d   R	# R
#   + '       g   i     LŒ; i)z2Bounded provenance label for shared skill metrics.rÃ   r¸   )Úget_plugin_managerNr5  r6  r4  ÚexternalÚlocalÚunknown)r  r  r   râ   Úhermes_cli.pluginsr§  Úfind_plugin_skillr�   r¨   rÇ   r!  r   )r   rŠ   r§  Úlabels   &&  r%   Útelemetry_provenancer®  Å  sØ   € ä˜
×#Ò#¤z°*×'=Ò'=ÙØ
ˆjÔÜ”i× Õ Ý=Ù!Ó#×5Ñ5°jÓAÒMØ"÷ !Ñ àM÷ !ð ˜k¨7°OÐD×HÑHÜ(2°6¼4×(@Ò(@ˆF�J‰J�|Ô$ÀdóLð L€uö LàˆÜ 
Ó+Ò7ÙÜ% jÓ1Ò=ÄÈFÔTX×AYÒAYˆ7ÐhÐ_hÐh÷ !× ús   Á C2Ã2D	rŠ   Útask_idÚ
session_idc               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r   r   r    ÚactionrŠ   r¥  r¯  rŒ   r°  r!   r:   r#   )r$   s   "r%   r&   r&   Ö  sB   € ÷ gñ g cð g°3ð gÐC[ð gØ#0ðgØERðgØ^bñgr'   c               óX  € T;'       g    / p ^ RI HpHp V! R4      '       d]   T! RY\        W4      T;'       g    RT;'       g    RVP	                  R4      VP	                  R4      VP	                  R4      R7	       R# R#   \
         d    \        P                  RYR	R
7        R# i ; i)zfBest-effort lifecycle hook after an authoritative state change; facts absent from *record* go as None.)Úhas_hookÚinvoke_hookÚon_skill_lifecyclerí   r®   ÚreusedÚreuse_after_patch)r²  r   Ú
provenancer¯  r°  r®   r·  r¸  z+skill_usage lifecycle hook failed for %s/%sTrð   N)Úhermes_cli.lifecycler´  rµ  r®  r�   râ   ru   rv   )r   r²  rŠ   r¯  r°  Úfactsr´  rµ  s   &&$$$   r%   Ú_emit_skill_lifecycler¼  Ö  s¤   € ð �LˆL�b€Eðgß>ÙÐ(×)Ò)ÙÐ,°VÜ#7¸
Ó#KÐU\×UbÐUbÐ`bØ#-×#3Ð#3°¸u¿y¹yÈÓ?UÐ^c×^gÑ^gÐhpÓ^qØ*/¯)©)Ð4GÓ*H÷Jñ *øô
 ô gÜ�‰ÐBÀJÐaeˆ×fðgús   ŽB ¤!B Á8B Â#B)Â(B)c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   r   r    r²  r”  z*Callable[[dict[str, Any]], dict[str, Any]]Úhook_kwargsr	   r!   r:   r#   )r$   s   "r%   r&   r&   å  s9   € ÷ Oñ O ð O¨cð OÐ<fð OØ$'ðOØ,0ñOr'   c                óh   € \        \        W4      ;p\        4      '       d   \        W3RV/VB  R# R# )uc   ``_mutate`` then emit *action* with the mutator's facts as the record â€” only if the write landed.rŠ   N)r¨   rŒ  rÇ   r¼  )r   r²  r”  r¾  r»  s   &&&, r%   Ú_mutate_and_emitrÀ  å  s2   € ô œ7 :Ó7Ð7�%¼×>Ò>Ü˜jÑN¸ÐNÀ+ÔNñ ?r'   c               ó    € V ^8„  d   QhRRRR/# r{  r#   )r$   s   "r%   r&   r&   í  s   € ÷ Pñ P˜#ð P $ñ Pr'   c                ó    € \        V R  4       R# )c                ó   € \        V R R4      # )r¯   r™   )r£  rˆ  s   &r%   r•   Úbump_view.<locals>.<lambda>î  s   € ¤E¨#¨|Ð=MÔ$Nr'   Nr‹  r*   s   &r%   Ú	bump_viewrÅ  í  s   € ÜˆJÑNÖOr'   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r   r    r¯  rŒ   r°  r!   r:   r#   )r$   s   "r%   r&   r&   ñ  s/   € ÷ [ñ [˜ð [¨-ð [ÈMð [Ðeiñ [r'   c               ó0   € R R lp\        V RW1VR7       R# )zVSkill actively used (loaded into the prompt path / referenced from an assistant turn).c               ó    € V ^8„  d   QhRRRR/# ©r   r\  r‹   r!   r#   )r$   s   "r%   r&   Úbump_use.<locals>.__annotate__ó  s   € ÷ 8ñ 8�Nð 8 ~ñ 8r'   c                óv  € \        V P                  R 4      4      p\        V P                  R4      4      p\        \        V P                  R4      4      V4      pV^ 8„  ;'       d    W#8„  pT P                  V^,           \	        4       TV'       d   TMTR7       RV P                  R4      R V^,           RV^ 8„  RV/# )r®   rR  rS  )r®   r˜   rR  rS  r4  r·  r¸  )r©   r�   Úminrd  r~   )r\  ÚusesÚgenÚlast_reusedr¸  s   &    r%   r‰  Úbump_use.<locals>._applyó  s²   € Ü  §¡¨Ó!5Ó6ˆÜ §¡Ð(:Ó ;Ó<ˆÜÔ+¨C¯G©GÐ4RÓ,SÓTÐVYÓZˆØ  1™H×:Ð:¨Ñ):ÐØ�
‰
˜T A�X´H³JÐQTß7H±Èkð 	ô 	[à˜cŸg™g lÓ3°[À$ÈÅ(ÈHÐVZÐ]^ÑV^Ø#Ð%6ð8ð 	8r'   Úloaded©r¯  r°  N©rÀ  )r   r¯  r°  r‰  s   &$$ r%   Úbump_userÔ  ñ  s   € õ8ô �Z ¨6Èz×Zr'   r²  Úpatchc          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   r   r    r²  r¯  rŒ   r°  r!   r:   r#   )r$   s   "r%   r&   r&   ÿ  s1   € ÷ ,ñ ,˜3ð ,¨3ð ,À=ð ,Ø(ð,Ø48ñ,r'   c               ó@   € R R lp\        YR8X  d   RMRWBVR7       R# )z&Called from skill_manage (patch/edit).c               ó    € V ^8„  d   QhRRRR/# rÉ  r#   )r$   s   "r%   r&   Ú bump_patch.<locals>.__annotate__  s   € ÷ 5ñ 5�Nð 5 ~ñ 5r'   c                óŠ   € \        V R R4       \        V P                  R4      4      ^,           V R&   RV P                  R4      /# )r°   rš   rR  r4  )r£  r©   r�   rˆ  s   &r%   r‰  Úbump_patch.<locals>._apply  sC   € Üˆc�=Ð"3Ô4Ü"3°C·G±GÐ<NÓ4OÓ"PÐSTÕ"TˆÐÑØ˜cŸg™g lÓ3Ð4Ð4r'   rÕ  ÚpatchedÚeditedrÒ  NrÓ  )r   r²  r¯  r°  r‰  s   &$$$ r%   Ú
bump_patchrÞ  ÿ  s!   € õ5ô �Z¸Ô.?¡ÀXÈvØ *÷,r'   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   r   r    r6  r"   r¯  rŒ   r°  r!   r:   r#   )r$   s   "r%   r&   r&   
  s8   € ÷ \ñ \˜sð \°dð \À]ð \Ø,ð\Ø8<ñ\r'   c               ó8   a€ R V3R llp\        V RWBVR7       R# )u‡  Persist creation provenance and emit a create fact; the record is reset (a create is a new logical skill).

Foreground creates (``agent_created=False`` â€” e.g. ``/learn`` at the user's request) are stamped
``created_by="learn"``: a learning-signal marker, NOT the curator-management opt-in (``"agent"``),
so /journey can show user-taught skills without handing them to autonomous curation.
c               ó    € V ^8„  d   QhRRRR/# rÉ  r#   )r$   s   "r%   r&   Ú$record_created.<locals>.__annotate__  s   € ÷ 1ñ 1�Nð 1 ~ñ 1r'   c                ó„   <€ V P                  4        T P                  \        4       S'       d   R MRR7       RV R,          /# )r5  Úlearn)r4  r4  )Úclearrd  rZ  )r\  r6  s   &€r%   r‰  Úrecord_created.<locals>._apply  s2   ø€ Ø�	‰	ŒØ�
‰
”=“?¿-©wÈWˆ
ÔUØ˜c ,Õ/Ð0Ð0r'   ÚcreatedrÒ  NrÓ  )r   r6  r¯  r°  r‰  s   &d$$ r%   Úrecord_createdrè  
  s   ø€ ÷1ð 1ô �Z ¨FÐPZ×[r'   c               ó    € V ^8„  d   QhRRRR/# r{  r#   )r$   s   "r%   r&   r&     s   € ÷ 6ñ 6 ð 6¨ñ 6r'   c                ó,   € R R lp\        V RV4       R# )zBRecord a successful Skills Hub install without exporting its name.c               ó    € V ^8„  d   QhRRRR/# rÉ  r#   )r$   s   "r%   r&   Ú&record_installed.<locals>.__annotate__  s   € ÷ +ñ +�Nð + ~ñ +r'   c                ó:   € V P                  R \        RR7       RR /# )rÃ   N)r4  rU  rW  r4  )rd  rY  rˆ  s   &r%   r‰  Ú record_installed.<locals>._apply  s   € Ø�
‰
˜k´È4ˆ
ÔPØ˜kÐ*Ð*r'   rÃ   NrÓ  r�  s   & r%   Úrecord_installedrï    s   € õ+ô �Z ¨fÖ5r'   c               ó    € V ^8„  d   QhRRRR/# r{  r#   )r$   s   "r%   r&   r&   !  s   € ÷ 2ñ 2 3ð 2¨4ñ 2r'   c                ó    € \        V RR4       R# )ue   Opt a skill into curator management â€” the only thing that makes it eligible for automatic curation.r4  r5  N)r�  r*   s   &r%   rM  rM  !  s   € äˆz˜<¨Ö1r'   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r   r    rU  r!   r:   r#   )r$   s   "r%   r&   r&   &  s&   € ÷ Dñ D˜#ð D cð D¨dñ Dr'   c                ó„  a€ S\         9  d   \        P                  RSV 4       R# R V3R llp\        WRR7      p\	        V\
        4      '       do   VR,          '       d^   S\        8H  ;'       d    VR,          \        8H  pV'       d   R	M\        R
\        R/P                  S4      pVe   \        WVR7       R# R# R# R# )znSet lifecycle state (no-op if invalid / unmanageable). Emits archived/stale/restored; active<-stale is silent.z"set_state: invalid state %r for %sNc               ó    € V ^8„  d   QhRRRR/# rÉ  r#   )r$   s   "r%   r&   Úset_state.<locals>.__annotate__,  s   € ÷ oñ o�Nð o ~ñ or'   c                ó¼   <€ V P                  R 4      pVS8w  d+   SV R &   S\        8w  d   S\        8X  d   \        4       MRV R&   RVS8g  RV P                  R4      RV/# )rU  NrW  Úchangedr4  Úprevious_state)r�   r‡  ÚSTATE_ARCHIVEDr~   )r\  ÚpreviousrU  s   & €r%   r‰  Úset_state.<locals>._apply,  sc   ø€ Ø—7‘7˜7Ó#ˆØ�uÔØ ˆC�‰LØœÔ#Ø38¼NÔ3J¤X¤ZÐPT��MÑ"Ø˜8 uÑ,¨l¸C¿G¹GÀLÓ<QÐScÐemÐnÐnr'   Trœ  r÷  rø  Úrestoredr   r   r²   )Ú_VALID_STATESru   rv   rŒ  r¨   rÇ   rY  rù  r‡  r�   r¼  )r   rU  r‰  r»  rü  r²  s   &f    r%   Ú	set_staterþ  &  s©   ø€ à”MÔ!Ü�‰Ð9¸5À*ÔMÙ÷oð oô �JÀ$ÔG€EÜ�%œ×Ò 5¨×#3Ô#3ØœLÑ(×VÐV¨UÐ3CÕ-DÌÑ-Vˆß'‘¬n¸jÌ+ÐW^Ð-_×-cÑ-cÐdiÓ-jˆØÒÜ! *¸U×Cñ ñ $4Ñr'   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r   r    rV  r"   r!   r#   )r$   s   "r%   r&   r&   ;  s!   € ÷ :ñ :˜3ð :¨ð :°ñ :r'   c                ó.   € \        V R\        V4      4      # )u¸   False when the write did not land (not curation-eligible).

(skill not curation-eligible), True on success â€” so callers can report failure instead of a false
success (issue #92993).
rV  )r�  r"   )r   rV  s   &&r%   Ú
set_pinnedr  ;  s   € ô �j (¬D°«LÓ9Ð9r'   c               ó    € V ^8„  d   QhRRRR/# r{  r#   )r$   s   "r%   r&   r&   D  s   € ÷ ñ �sð ˜tñ r'   c                ó>   a € S '       d   \        S V 3R  lR4       R# R# )c                ó0   <€ R V P                  SR 4      R J3# r)   )Úpop)Údr   s   &€r%   r•   Úforget.<locals>.<lambda>F  s   ø€ ¨d°A·E±E¸*ÀdÓ4KÐSWÐ4WÑ-Xr'   z!skill_usage.forget(%s) failed: %sNr—  r*   s   fr%   Úforgetr  D  s   ø€ ßÜ�zÔ#XÐZ}Ö~ñ r'   c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r   Úsrcr   Údestr   r    r²  Úcapture_kwargsr	   r!   rI  r#   )r$   s   "r%   r&   r&   J  s8   € ÷ (ñ (�4ð (˜tð (°ð (¸cð (ÐUXð (Ð]mñ (r'   c           	     ó.  €  ^ RI Hp VP                  ! V 3/ VB p V P	                  V4       TR8H  p	T	'       d7   \        \
        4      ;_uu_ 4        \        P                  ! T4       RRR4       T	'       d   \        T4      '       d   \        Y)R7       \        Y)'       d   \        M\         4       \        \        4      ;_uu_ 4        Te   TP#                  Y2T;'       g    . TR7       RRR4       R	T R
T 23#   \         d    R;rV Lòi ; i  \
         dR    ^ RIp TP                  \        T 4      \        T4      4        EL  \         d   pRRT RT 23u Rp?u # Rp?ii ; ii ; i  + '       g   i     EL; i  + '       g   i     L ; i)zÀMove *src* to *dest* for *action* ("archive" | "restore") inside a best-effort audit-ledger entry, then apply
suppression + state side effects; rename falls back to shutil.move across devices.)Úskill_ledgerNFz
failed to z: Úarchive)r]   )ÚbeforeÚ
after_rootTzd to )Útoolsr  Úcapture_beforerâ   Úrenamer_   ÚshutilÚmover    r   ÚosÚutimer  rô   rþ  rù  rY  Úrecord_mutation)
r
  r  r   r²  r  Ú_ledgerÚ_ledger_beforer  rx   Ú	archivings
   &&&&,     r%   Ú	_relocater  J  sR  € ð(Ý1Ø ×/Ò/°ÑF°~ÑFˆð5Ø�
‰
�4Ôð ˜)Ñ#€Ißô ”g×ÕÜ�HŠH�TŒN÷ çœ
 :×.Ò.Ü 
Õ:Üˆj®I�.¼<ÔHÜ	”)×	Õ	ØÒØ×#Ñ# F¸~×?SÐ?SÐQSÐ`dÐ#Ôe÷ 
ð �F�8˜5  Ð'Ð'Ð'øô- ô (Ø#'Ð'ˆ‘.ð(ûô ô 5Ûð	5Ø�K‰Kœ˜C›¤# d£)×,øÜô 	5Ø˜J v h¨b°°Ð4Ð4×4ûð	5úð	5ú÷ ×Ðú÷
 
×	úsd   ‚C= œD ÁE0Ã	FÃ#	FÃ=DÄDÄE-Ä!$EÅE)Å	E$ÅE)ÅE-Å$E)Å)E-Å0F	ÆF	c               ó    € V ^8„  d   QhRRRR/# rH  r#   )r$   s   "r%   r&   r&   i  s   € ÷ fñ f˜cð fÐ&6ñ fr'   c           	     ó´  € \        V 4      pVf   \        V 4      e   R\        V 4      3# \        W4      '       g;   \	        V 4      '       d	   RRV  R23# \        V 4      '       d	   RRV  R23# RRV  R23# Vf	   RRV  R23# \        V4      '       d   R\        V 4      3# \        4       V ,          p VP                  P                  RRR	7       TP                  4       '       dH   TP                  TP                   R\        P                  ! \         4      P#                  R4       24      p\%        YT RRT R7      #   \         d   pRR
T 23u Rp?# Rp?ii ; i)zÇMove a curator-eligible skill dir to ``.archive/`` (flattened; timestamp suffix on collision). Never hub;
bundled built-ins only with ``curator.prune_builtins`` (and then suppressed from re-seeding).NFr*  zY' is a protected built-in; it backs load-bearing UX and is never archived or consolidatedz!' is hub-installed; never archivezJ' is a bundled built-in; enable curator.prune_builtins to allow pruning itrL  TrM   zfailed to create archive dir: Ú-z%Y%m%d%H%M%Sr  )Úcomplete_packageÚskill)r   r!  r+  r1  r+   r  r   r7   rV   rW   r_   rX   Ú	with_namerÕ   r   r|   r   Ústrftimer  )r   rN  r  rx   s   &   r%   Úarchive_skillr%  i  sw  € ô   
Ó+€IØÒÔ5°jÓAÒMØÔ1°*Ó=Ð=Ð=Ü 
×6Ò6Ü 
×+Ò+Ø˜G J <ð  0Ið  Jð  Jð  JÜ˜J×'Ò'Ø˜G J <Ð/PÐQÐQÐQØ˜ 
˜|Ð+uÐvÐvÐvØÒØ˜ 
˜|¨;Ð7Ð7Ð7Ü˜i×(Ò(ØÔ1°*Ó=Ð=Ð=ô ‹>˜JÕ&€Dð;Ø�‰×Ñ $°ÐÔ6ð ‡{�{‡}‚}Ø�~‰~ §¡Ð 0°´(·,²,¼sÓ2C×2LÑ2LÈ^Ó2\Ð1]Ð^Ó_ˆô �Y j°)ÈdÐZdÔeÐeøô ô ;ØÐ6°q°cÐ:Ð:Õ:ûð;ús   Â1D; Ä;EÅEÅEÅEc               ó    € V ^8„  d   QhRRRR/# rH  r#   )r$   s   "r%   r&   r&   ‡  s   € ÷ Añ A˜cð AÐ&6ñ Ar'   c                óF  a€ \        V 4      '       d	   RRV  R23# \        V 4      '       d   \        4       '       g	   RRV  R23# \        4       pVP	                  4       '       g   R# VP                  R4       Uu. uF  q"P                  4       '       g   K  VNK  	  ppV  R2oV Uu. uF  q"P                  V 8X  g   K  VNK  	  up;'       gu    \        V3R lV 4       RR	7      ;'       gV    V Uu. uFH  q"R
,          P                  4       '       g   K!  \        VR
,          VP                  R7      V 8X  g   KF  VNKJ  	  uppV'       g	   RRV  R23# \        4       V ,          ;pP	                  4       '       d   RRV 23# \        V^ ,          WPR4      # u upi u upi u upi )zÓMove an archived skill back to the flat layout (nesting NOT reconstructed). Refuses a name now colliding with
a hub skill, or a bundled built-in unless ``curator.prune_builtins`` is on (restoring lifts a prune).Fr*  zA' is now hub-installed; restore would shadow the upstream versionz;' is now bundled; restore would shadow the upstream versionÚ*r   c              3  ó   <"  € T Fƒ  qP                   P                  S4      '       g   K%  \        VP                   4      \        S4      ,
          ^8X  g   KQ  VP                   \        S4      R P                  4       '       g   K  Vx € K…  	  R# 5i)é   N)rÕ   ré   ÚlenÚisdigit)rn   rË   Úprefixs   & €r%   rp   Ú restore_skill.<locals>.<genexpr>˜  s_   øé € ð 	-‘DˆqŸF™F×-Ñ-¨f×5Œ¼#¸a¿f¹f»+ÌÈFËÕ:SÐWYÑ:YŒØ�V‰V”C˜“K�LÐ!×)Ñ)×+÷ 
Š“Dùs   ƒ"Bª'BÁ)BÂ
BT)ÚreverserÌ   rÍ   z' not found in archivezdestination already exists: Úrestore)Fzno archive directory)r  r  rä   r7   rX   rù   r  rÕ   ró   Úis_filerÔ   r0   r  )r   Úarchive_rootrË   ÚdirsÚ
candidatesr  r-  s   &     @r%   Úrestore_skillr5  ‡  s§  ø€ ô ˜
×#Ò#Ø˜ 
˜|Ð+lÐmÐmÐmÜ�*×ÒÔ&=×&?Ò&?Ø˜ 
˜|Ð+fÐgÐgÐgÜ“>€LØ×Ñ× Ò Ø,Ð,ð $×)Ñ)¨#Ô.Ó=Ñ.�!·(±(·*�AˆAÑ.€DÐ=Øˆ|˜1Ð€Fñ "Ó:™T˜§V¡V¨zÑ%9—!�!™TÑ:÷ zð z¼fô	-‘Dó 	-Ø6:ô?<÷ zð zñ ó@zÙˆa 
�N×3Ñ3×5Œ¼/È!ÈjÍ.Ðcd×ciÑciÔ:jÐnxÑ:x�ˆ‘4ñ@zð ÷ Ø˜ 
˜|Ð+AÐBÐBÐBÜ“ 
Õ*Ð*ˆ×2Ñ2×4Ò4ØÐ4°T°FÐ;Ð;Ð;Ü�Z •] D°iÓ@Ð@ùò >ùò ;ùò@zs*   Á9FÂFÂ&FÂ=FÃ1FÄ FÄ9Fc               ó$   € V ^8„  d   QhRRRRRR/# )r   Ú	skill_mdszIterable[Path]r   r    r!   r.  r#   )r$   s   "r%   r&   r&   ¢  s&   € ÷ qñ q ð q¸Cð qÀNñ qr'   c                ó0   a€ \        V3R  lV  4       R4      # )c              3  óŠ   <"  € T F8  p\        WP                  P                  R 7      S8X  g   K*  VP                  x € K:  	  R# 5i)rÍ   N)rÔ   rV   rÕ   )rn   rË   r   s   & €r%   rp   Ú#_match_skill_dir.<locals>.<genexpr>£  s,   øé € Ði¡9˜a´ÀÏHÉHÏMÉMÔ0ZÐ^hÑ0h”�—–£9ùs
   ƒ'A¯AN)r  )r7  r   s   &fr%   Ú_match_skill_dirr;  ¢  s   ø€ ÜÔi¡9ÓiÐkoÓpÐpr'   c               ó    € V ^8„  d   QhRRRR/# ©r   r   r    r!   r.  r#   )r$   s   "r%   r&   r&   ¦  s   € ÷ Cñ C ð C¨ñ Cr'   c                ó†   € ^ RI Hp \        4       pVP                  4       '       d   \	        R V! VR4       4       V 4      # R# )z3Skill dir by frontmatter ``name`` (flat or nested).)Úiter_skill_index_filesc              3  óL   "  € T F  p\        V4      '       d   K  Vx € K  	  R # 5ir)   )r   rÊ   s   & r%   rp   Ú"_find_skill_dir.<locals>.<genexpr>ª  s   é € ÐrÑ(P 1ÔXnÐop×XqŸQšQÓ(Pùó   ‚$š
$rÌ   N)Úagent.skill_utilsr?  r0   rX   r;  )r   r?  rö   s   &  r%   r   r   ¦  sC   € å8Ü‹=€Dà+/¯;©;¯=ª=ô ÑrÑ(>¸tÀZÔ(PÓrØ&ó(ð CØ>BðCr'   c               ó    € V ^8„  d   QhRRRR/# r=  r#   )r$   s   "r%   r&   r&   ®  s   € ÷ Pñ P¨ð P°ñ Pr'   c                óX   a a€ ^ RI Hp \        VV 3R lV! 4       R,           4       R4      # )z=Skill dir under configured external dirs by frontmatter name.©Úget_all_skills_dirsc              3  óª   <"  € T FH  qP                  4       '       g   K  \        R  VP                  R4       4       S4      ;o  f   KD  Sx € KJ  	  R# 5i)c              3  óL   "  € T F  p\        V4      '       d   K  Vx € K  	  R # 5ir)   )r   rÊ   s   & r%   rp   Ú5_find_external_skill_dir.<locals>.<genexpr>.<genexpr>²  s   é € Ð/sÑ;Q°aÔYoÐpq×Yr·²Ó;QùrB  rÌ   N)rX   r;  rù   )rn   rö   Úfoundr   s   & €€r%   rp   Ú+_find_external_skill_dir.<locals>.<genexpr>±  sO   øé € ð IÑ#<˜4ÇÁÇ”Ü.Ñ/s¸4¿:¹:ÀjÔ;QÓ/sØ/9ó;ð ;�UØCGðH÷ ’Ó#<ùs   ƒAŸ%AÁ	
Aºr¢  NNN)rC  rG  r  )r   rG  rK  s   f @r%   r!  r!  ®  s/   ù€ å5Üõ IÑ#6Ó#8¸Ö#<ó IàJNóPð Pr'   c               ó   € V ^8„  d   QhRR/# rA  r#   )r$   s   "r%   r&   r&   ·  s   € ÷ 	pñ 	pÐ,ñ 	pr'   c                 ó  € \        4       p \        \        4       4      pVP                  R V P	                  4        4       4       \        V4       Uu. uF+  p\        W P                  V4      W 9   \        V4      R7      NK-  	  up# u upi )z»One backfilled row per curator-managed skill with ``provenance`` and ``_persisted`` (real record exists; fresh
backfills get their inactivity clock seeded instead of counting as ancient).c              3  ó    "  € T FD  w  rVP                  R 4      '       g   K  \        V4      '       g   K1  \        V4      f   K@  Vx € KF  	  R# 5i)rV  N)r�   r1  r   )rn   rÕ   r\  s   &  r%   rp   Ú!curated_report.<locals>.<genexpr>¾  sA   é € ð l¡|™)˜$Ø—G‘G˜H×%ô Ü*>¸t×*Dô ÜIXÐY]ÓI^÷ ’£|ùs   ‚A¢Aµ
AÁ
A)Ú
_persistedr¹  )	r   rU   r  rd  r^  ró   rE  r�   r¹  )rØ   rÙ   r½   s      r%   Úcurated_reportrS  ·  su   € ô ‹<€DÜÔ.Ó0Ó1€Eð 
‡L�Lñ l t§z¡z¤|ó lô läagÐhmÔanÓoÑanÐ\]ŒK˜Ÿ8™8 A›;°1±9ÌÐTUË×WÑanÑoÐoùÒos   Á1Bc               ó    € V ^8„  d   QhRRRR/# r   r#   )r$   s   "r%   r&   r&   Ã  s   € ÷ fñ f ð f¨ñ fr'   c                óF   € \        V 4      RJ ;'       d    \        V 4      RJ# )zéPresent under ``skills.external_dirs`` and NOT in the local store (the local copy wins on
name clashes, mirroring ``is_agent_created``'s external exclusion). An external-only skill is
externally authored: it was mounted, not learned.N)r   r!  r*   s   &r%   Úis_external_onlyrV  Ã  s(   € ô ˜JÓ'¨4Ð/×dÐdÔ4LÈZÓ4XÐ`dÐ4dÐer'   c               ó   € V ^8„  d   QhRR/# )r   r!   rU   r#   )r$   s   "r%   r&   r&   Ê  s   € ÷ ñ ˜sñ r'   c            	     ó4  € ^ RI Hp  \        4       pV ! 4       R,           Fu  pVP                  4       '       g   K  VP	                  R4       FE  p\        V4      '       d   K  VP                  \        W3P                  P                  R7      4       KG  	  Kw  	  V# )z¢Frontmatter names of all skills under configured external dirs (one scan per call; the
router's set-based provenance uses this instead of a per-skill dir lookup).rF  rM  rÌ   rÍ   )
rC  rG  rU   rX   rù   r   r]   rÔ   rV   rÕ   )rG  rÙ   rö   rú   s       r%   Ú_external_skill_namesrY  Ê  sq   € õ 6Ü“€EÙ#Ó% b×)Ð)ˆØ�{‰{�}Š}ÙØŸ
™
 :Ö.ˆHÜ)¨(×3Ô3Ø—	‘	œ/¨(¿_¹_×=QÑ=QÔRÖSó /ñ *ð €Lr'   c               ó    € V ^8„  d   QhRRRR/# r(  r#   )r$   s   "r%   r&   r&   Ø  s   € ÷ ñ ˜3ð  3ñ r'   c                óx   € \        V 4      '       d   R# \        V 4      '       d   R# \        V 4      '       d   R# R# )u½  'hub' | 'bundled' | 'external' | 'agent'.

'external' covers skills mounted from ``skills.external_dirs`` and absent from the local
store â€” externally authored, not learned from the user (#108032). 'agent' keeps covering
agent-authored AND local hand-made skills â€” the ones the user may edit/delete from the UI
(external skills stay foreground-editable in place by design, commit 8c8fc6c1ec; the label
split is about origin, not mutability).r  r  r¨  r5  )r  r  rV  r*   s   &r%   r¹  r¹  Ø  sD   € ô & j×1Ò1ˆEð Ü(¨×4Ò4�ðä/°
×;Ò;�ðð ðr'   c               ó   € V ^8„  d   QhRR/# rA  r#   )r$   s   "r%   r&   r&   æ  s   € ÷ ^ñ ^Ð*ñ ^r'   c            
     ó0  € \        4       ;p P                  4       '       g   . # \        4       p\        \	        V RR7       UUu0 uF  w  r#VkK	  	  upp4       Uu. uF+  p\        WAP                  V4      \        V4      WA9   R7      NK-  	  up# u uppi u upi )zlUsage rows for EVERY skill on disk (built-ins and hub included); ``curated_report()`` is the managed subset.Frÿ   )r¹  rR  )r0   rX   r   ró   rû   rE  r�   r¹  )rö   rØ   rÕ   r
  r½   s        r%   Úusage_reportr^  æ  s‡   € ä“MÐ!ˆD×)Ñ)×+Ò+Øˆ	Ü‹<€Dä´?À4ÐTYÕ3ZÔ[Ñ3Z¡i d›TÑ3ZÒ[Ô\ó^Ù\�ô ˜Ÿ8™8 A›;´:¸a³=ÈQÉY×WÙ\ñ^ð ^ùÛ[ùò^s   ÁB
Á1Br)   )uÚ__conditional_annotations__Ú__doc__Ú
__future__r   rÏ   Úloggingr  Ú	threadingÚ
contextlibr   r   r   r   r   Úpathlibr   Útypingr	   r
   r   r   r   r   r   r   r   Úhermes_constantsr   rC  r   r   Úutilsr   Ú	getLoggerÚ__name__ru   rB   r=   ÚImportErrorrY  r‡  rù  rý  rU   r   Ú__annotations__r+   r0   r4   r7   rH   r©  rT   rb   re   ry   r~   rˆ   rŸ   r¥   r©   r³   r¾   rÛ   rä   r»   rô   rû   r  r  r  rÔ   r"  r  r  r+  r1  r	  r9  r?  rF  rO  rZ  r_  rE  r   ro  rr  ry  r�  rŽ  rŒ  r�  r£  r®  r¼  rÀ  rÅ  rÔ  rÞ  rè  rï  rM  rþ  r  r  r  r%  r5  r;  r   r!  rS  rV  rY  r¹  r^  )r_  s   @r%   Ú<module>rm     sµ  øðô1õ #ã Û Û 	Û ß /ß ,Ñ ,Ý ß V× VÕ Vå ,ß LÝ #à	×	Ò	˜8Ó	$€ð 
€ðÛð -5°g¸zÐ )€ˆk˜>Ø˜{¨NÐ;€ñ &)£UÐ ˜(Ó *õ2õ(õ)õ&õPð �oŠoÓ€ð ô"ó ð"ò2Dõ
õ)õVõBõõIõdõiõõ>õ@õ	WõUõtõ~õ[õ4õaõ5õ/õo÷	põuõDõ,õ3õFõ6#õQõõiõõ5÷
õ _õ	 ðmÈ5÷ mõsõ
÷
ið"gÐ^bð gØ37ðgØUY÷gõOõPð[¸$ð [Ð\`÷ [ð,°ð ,ÐSWð ,Ø+/÷,ð\ÐUYð \Ø/3÷\õ6õ2õ
Dõ*:õõ(õ>fõ<Aõ6qõCõPõ	põfõõ÷^øðS ô Ø€EÙ	�+×	Õ	Û÷ 
×	×	Õ	úðús*   Á4I) É)J)ÊJÊJ)ÊJ%ÊJ)Ê%J)