+
    „WÝjd²  ã                  óÈ  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIHt ^ RI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HtHtHtHtHtH t  ^ RI!H"t" ]PF                  ! ]$4      t%Rt&R R	 lt'R
 R lt(R R lt)R R lt*R}R R llt+R R lt,R R lt-R R lt.RR/t/R R lt0R R lt1R R lt2R  R! lt3R" R# lt4R$ R% lt5R&R'R(R)/t6R* R+ lt7R, R- lt8R.RR/R0R1RR2R3R4R0R5R/R6 R7 llt9R8 R9 lt:R: R; lt;R<R=]&3t<]=! 0 R~m4      t>]=! 0 Rm4      t?]=! 0 R€m4      t@R? R@ ltARA RB ltBRC RD ltCRE RF ltDRG RH ltE ! RI RJ]4      tFRKRLRMRMRNRNRORPR>RQRRRSRTRU/tGRV RW ltHRX RY ltIRZ R[ ltJ ! R\ R]]K4      tLR^R0R_R/R` Ra lltMR^R3/Rb Rc lltNRd Re ltORf Rg ltPRh Ri ltQR�RjR0/Rk Rl llltRRm Rn ltSR‚Ro Rp lltTRq Rr ltUR}Rs Rt lltVRu Rv ltWRw Rx ltXRy Rz ltYR{ R| ltZR# )ƒuh  ``hermes plugins`` catalog surface: resolution, provenance sidecar, search/browse/info/validate,
catalog-aware update, plus the dashboard/TUI-facing catalog payload helpers.

Sibling of :mod:`hermes_cli.plugins_cmd` (the installer core, enable/disable state and console helpers
live there and are imported late â€” this module is imported BY ``plugins_cmd``).
)ÚannotationsN)ÚPath)ÚAnyÚDictÚListÚ
NamedTupleÚOptional)ÚCATALOG_TIERSÚPluginCatalogEntryÚRemovedEntryÚcached_removed_entriesÚentry_capability_summaryÚfilter_entriesÚfind_removedÚget_live_catalog_entryÚload_catalog_liveÚmatch_removedÚresolved_removed_entriesÚ_NAME_REÚ_normalize_repo)Úis_junctionz.hermes-catalog.jsonc               ó    € V ^8„  d   QhRRRR/# )é   Ú
identifierÚstrÚreturnÚbool© )Úformats   "ÚRC:\Users\johnn\AppData\Local\hermes\hermes-agent\hermes_cli\plugins_cmd_catalog.pyÚ__annotate__r    "   s   € ÷ Yñ Y¨ð Y°ñ Yó    c                óâ   € ^ RI Hp \        V 4      ;'       dX    RV 9  ;'       dK    RV 9  ;'       d>    V P                  V4      '       * ;'       d     \        \        P
                  ! V 4      4      # )u@   Bare ``[a-z0-9_-]`` token â€” not a URL, ``owner/repo`` or path.)Ú_URL_SCHEMESÚ/Ú\)Úhermes_cli.plugins_cmdr#   r   Ú
startswithr   Úmatch)r   r#   s   & r   Úlooks_like_catalog_namer)   "   ss   € å3Ü�
Ó÷ Yð Y ¨:Ñ 5÷ Yð Y¸$ÀjÑ:P÷ Yð YØ×%Ñ% lÓ3Ô3÷Yð YÜ8<¼X¿^º^ÈJÓ=WÓ8XðYr!   c               ó    € V ^8„  d   QhRRRR/# )r   Ú
candidatesr   r   ÚNoner   )r   s   "r   r    r    )   s   € ÷ Qñ Q #ð Q¨$ñ Qr!   c                 óô   € ^ RI Hp V  Fk  p\        V4      pVf   K  VP                  ;'       g    RpVP                  '       d   VRVP                   R2,          pV! RVP
                   RV 2RR	7      h	  R# )
zS``PluginOperationError`` when any candidate (name or repo URL) is on the kill list.©ÚPluginOperationErrorNúno reason recordedz
 (removed Ú)úPlugin 'zO' was removed from the Hermes plugin catalog and is blocked from installation: Úremoved_from_catalog©Úfailure_class)r&   r/   r   ÚreasonÚdateÚname)r+   r/   Ú	candidateÚremovedÚdetails   *    r   Úraise_if_removedr<   )   s}   € å;Ûˆ	Ü˜yÓ)ˆØÔØ—^‘^×;Ð;Ð';ˆFØ�|�|ˆ|Ø˜J w§|¡| n°AÐ6Õ6�Ù&Ø˜7Ÿ<™<˜.ð )!Ø!' ð*Ø9OôQð Qó  r!   c               ó    € V ^8„  d   QhRRRR/# )r   r   r   r   r
   r   )r   s   "r   r    r    7   s   € ÷ 	ñ 	 Sð 	Ð6Hñ 	r!   c                ó`   € ^ RI Hp \        V 4      pVf   V! VRV  R24       \        ^4      hV# )uI   Bare name â†’ live catalog entry, or exit 1 with a pointer to ``search``.)Ú_failz[red]Error:[/red] 'z€' is not in the Hermes plugin catalog and is not a Git URL or owner/repo shorthand. Browse entries with `hermes plugins search`.)r&   r?   r   Ú
SystemExit)r   Úconsoler?   Úentrys   &&  r   Úresolve_catalog_namerC   7   sC   € å,Ü" :Ó.€EØ‚}ÙˆgØ! * ð .Qð Qô	Sô ˜‹mÐØ€Lr!   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   Útargetr   ÚcatalogÚdictÚshar   r   r,   r   )r   s   "r   r    r    C   s.   € ÷ Qñ Q¨ð Q¸ð QÀ3ð QÈ4ñ Qr!   c                óØ  € RVR,          RVR,          RTRVP                  R4      ;'       g    RR\        P                  P                  \        P                  4      P	                  RR	7      P                  R
R4      /p V \        ,          P                  \        P                  ! V^R7      R,           RR7       R#   \         d"   p\        P                  RY4        Rp?R# Rp?ii ; i)a"  Human/Desktop-readable ``.hermes-catalog.json`` inside the install dir. It is a CONVENIENCE COPY:
the authoritative provenance is the ``catalog`` block on the ``.install-metadata.json`` record (see
:func:`read_catalog_sidecar`), because anything inside the tree is under the repo's control.Úcatalog_namer8   ÚreporH   ÚtierÚ	communityÚinstalled_atÚseconds)Útimespecú+00:00ÚZ©ÚindentÚ
zutf-8©Úencodingz)Failed to write catalog sidecar in %s: %sN)ÚgetÚdatetimeÚnowÚUTCÚ	isoformatÚreplaceÚCATALOG_SIDECARÚ
write_textÚjsonÚdumpsÚOSErrorÚloggerÚwarning)rE   rF   rH   ÚsidecarÚexcs   &&&  r   Úwrite_catalog_sidecar_recordrg   C   s½   € ð
 	˜ �¨°¸µÀ%ÈØ�—‘˜FÓ#×2Ð2 {Øœ×)Ñ)×-Ñ-¬h¯l©lÓ;×EÑEÈyÐEÓYß	‰�˜3Ó	ð	€GðQØ	”/Õ	!×-Ñ-¬d¯jªj¸ÈÔ.KÈdÕ.RÐ]dÐ-ÖeøÜô QÜ�‰ÐBÀF×PÒPûðQús   Â ;B= Â=C)ÃC$Ã$C)c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   rE   r   rB   r
   rH   úOptional[str]r   r,   r   )r   s   "r   r    r    S   s*   € ÷ ñ  $ð Ð/Að Èð Ðaeñ r!   c           	     ó�   € \        T R VP                  RVP                  RVP                  /T;'       g    VP                  4       R# )r8   rK   rL   N)rg   r8   rK   rL   rH   )rE   rB   rH   s   &&&r   Úwrite_catalog_sidecarrk   S   s8   € Ü ØØ	�—‘˜V U§Z¡Z°¸¿¹ÐDØ×Ðˆu�y‰yör!   c               ó    € V ^8„  d   QhRRRR/# )r   Ú
plugin_dirr   r   úOptional[dict]r   )r   s   "r   r    r    [   s   € ÷ 	8ñ 	8 ð 	8¨ñ 	8r!   c                óØ   € ^ RI HpHpHp V P                  V! 4       8w  d   R#  V! 4       P                  V P                  4      p\        T\        4      '       d   T# R#   T d     R# i ; i)zeThe installer-owned ``.install-metadata.json`` record for a dir under the plugins dir, else ``None``.)r/   Ú_plugins_dirÚ_read_install_metadataN)	r&   r/   rp   rq   ÚparentrX   r8   Ú
isinstancerG   )rm   r/   rp   rq   Úrecords   &    r   Ú_install_recordru   [   sd   € çaÑaØ×Ñ™L›NÔ*ÙðÙ'Ó)×-Ñ-¨j¯o©oÓ>ˆô   ¬×-Ò-ˆ6Ð7°4Ð7øð  ô Úðús   ¤ A ÁA)Á(A)c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rm   r   rt   rG   Úblockr   r   )r   s   "r   r    r    g   s(   € ÷ ñ  Tð °4ð Àð Èñ r!   c                óL   a€ ^ RI Hp R V3R llpV! V P                  V4       S# )zDMigrate one trusted installer record to the nested catalog contract.)Ú_update_install_recordc               ó    € V ^8„  d   QhRRRR/# )r   Úcurrentrn   r   r   )r   s   "r   r    Ú*_write_catalog_block.<locals>.__annotate__k   s   € ÷ ñ ˜ð ¨Nñ r!   c                ó|   <€ V f   R # \        V 4      pSVR&   VP                  RR 4       VP                  RR 4       V# )NrF   rJ   Úcatalog_tier)rG   Úpop)r{   Úmigratedrw   s   & €r   ÚmigrateÚ%_write_catalog_block.<locals>.migratek   s?   ø€ ØŠ?ÙÜ˜“=ˆØ#ˆ�ÑØ�‰�^ TÔ*Ø�‰�^ TÔ*Øˆr!   )r&   ry   r8   )rm   rt   rw   ry   r�   s   &&f  r   Ú_write_catalog_blockrƒ   g   s%   ø€ å=÷ð ñ ˜:Ÿ?™?¨GÔ4Ø€Lr!   c               ó$   € V ^8„  d   QhRRRRRR/# ©r   rm   r   rt   rG   r   rn   r   )r   s   "r   r    r    x   s!   € ÷ ;ñ ; dð ;°Dð ;¸^ñ ;r!   c           
     óˆ  € V \         ,          p VP                  4       '       d'   \        P                  ! VP	                  RR7      4      MRp\        T\        4      '       d   TP                  R4      '       g   R# \        TP                  R4      ;'       g    R4      P                  4       p\        \        TR,          4      4      pTe,   TP                  R4      RJg   TP                  R	4      T8w  d   R# \        TP                  R
4      ;'       g    R4      P                  R^4      ^ ,          p\        T4      \        TP                  4      8w  d   R# RTP                  RTP                  R\        TP                  R4      ;'       g    TP                   4      RTRT/p\#        YT4      #   \
         d     R# i ; i)u  Installs made before provenance moved out of the tree carry only the in-tree file. Trust it once â€”
only when the installer record agrees (pinned at that sha, cloned from that catalog entry's repo) â€”
and copy it onto the record so later reads never consult the tree again.z	utf-8-sigrV   NrJ   rH   Ú ÚpinnedTÚrevisionÚsourceÚ#r8   rK   rL   Úpin)r^   Úis_filer`   ÚloadsÚ	read_textÚ	Exceptionrs   rG   rX   r   Úlowerr   Úsplitr   rK   r8   rL   rƒ   )rm   rt   ÚpathÚdatarH   rB   rŠ   rw   s   &&      r   Ú_adopt_legacy_sidecarr•   x   sc  € ð œÕ'€DðØCGÇ<Á<Ç>Â>Œt�zŠz˜$Ÿ.™.°+˜.Ó>Ô?ÐW[ˆô �dœD×!Ò!¨¯©°.×)AÒ)AÙÜ
ˆd�h‰h�u‹o×#Ð# Ó
$×
*Ñ
*Ó
,€CÜ"¤3 t¨NÕ';Ó#<Ó=€EØ‚}˜Ÿ
™
 8Ó,°DÓ8¸F¿J¹JÀzÓ<RÐVYÔ<YÙÜ�—‘˜HÓ%×+Ð+¨Ó,×2Ñ2°3¸Ó:¸1Õ=€FÜ�vÓ¤/°%·*±*Ó"=Ô=ÙØ�U—Z‘Z ¨¯©°V¼SÀÇÁÈ&ÓAQ×A_ÐA_ÐUZ×U_ÑU_Ó=`ÐbgÐilÐnsÐuxÐy€EÜ 
°EÓ:Ð:øô ô Úðús   �F2 ¥(F2 Æ2GÇ Gz1github.com/nousresearch/hermes-plugin-holographicÚholographicc               ó$   € V ^8„  d   QhRRRRRR/# r…   r   )r   s   "r   r    r    “   s&   € ÷ Nñ N tð N°Tð N¸nñ Nr!   c                óŒ  € \        VP                  R 4      ;'       g    R4      P                  R^4      ^ ,          p\        \        P                  \        V4      R4      4      pVf   R# \        VP                  R4      ;'       g    R4      P                  4       p\        WRVP                  RVRVP                  RVR	V/4      # )
rŠ   r‡   r‹   Nr‰   r8   rK   rL   rŒ   rH   )
r   rX   r’   r   Ú_HANDOFF_REPOSr   r‘   rƒ   r8   rL   )rm   rt   rŠ   rB   rH   s   &&   r   Ú_adopt_handoff_installrš   “   s°   € Ü�—‘˜HÓ%×+Ð+¨Ó,×2Ñ2°3¸Ó:¸1Õ=€FÜ"¤>×#5Ñ#5´oÀfÓ6MÈrÓ#RÓS€EØ‚}ÙÜ
ˆf�j‰j˜Ó$×*Ð*¨Ó
+×
1Ñ
1Ó
3€CÜ 
°V¸U¿Z¹ZÈÐQWÐY_Ðaf×akÑakØ5:¸CÀÈð5Mó Nð Nr!   c               ó   € V ^8„  d   QhRR/# ©r   r   rn   r   )r   s   "r   r    r    �   s   € ÷ !Sñ !S¨ñ !Sr!   c                ób  € V '       g   R# \        V 4      p \        V 4      pVf   R# VP                  R4      p\        V\        4      '       gç   VP                  R4      pV'       d°   \        VP                  R4      ;'       g    R4      P                  4       pR\        V4      R\        VP                  R4      ;'       g    R4      P                  R	^4      ^ ,          R
\        VP                  R4      ;'       g    R4      RVRV/p\        WV4      pM\        W4      ;'       g    \        W4      pV'       d   VP                  R4      '       g   R# RVR,          RVP                  RR4      RVP                  RR4      R
VP                  R
4      ;'       g    RRVP                  RR4      /# )a\  Catalog provenance of an installed plugin (``catalog_name``/``repo``/``sha``/``tier``/``pin``), or
``None`` for a non-catalog install. Read from the installer-owned metadata record, never from the
tree: a URL-installed repo that ships its own ``.hermes-catalog.json`` must not render as a reviewed
catalog install nor mark the real entry installed.NrF   rJ   r‰   r‡   r8   rK   rŠ   r‹   rL   r~   rM   rŒ   rH   )r   ru   rX   rs   rG   r   r‘   r’   rƒ   r•   rš   )rm   rt   rw   Úlegacy_namerH   s   &    r   Úread_catalog_sidecarrŸ   �   ss  € ÷
 ÙÜ�jÓ!€JÜ˜ZÓ(€FØ‚~ÙØ�J‰J�yÓ!€EÜ�eœT×"Ò"ð
 —j‘j Ó0ˆßÜ�f—j‘j Ó,×2Ð2°Ó3×9Ñ9Ó;ˆCàœ˜KÓ(Øœ˜FŸJ™J xÓ0×6Ð6°BÓ7×=Ñ=¸cÀ1ÓEÀaÕHØœ˜FŸJ™J ~Ó6×EÐE¸+ÓFØ�sØ�sðˆEô )¨¸UÓC‰Eä)¨*Ó=×kÐkÔAWÐXbÓAkˆEß˜Ÿ	™	 &×)Ò)ÙØ˜E &�M¨6°5·9±9¸VÀRÓ3HÈ%ÐQV×QZÑQZÐ[`ÐbdÓQeØ�E—I‘I˜fÓ%×4Ð4¨°e¸U¿Y¹YÀuÈbÓ=QðSð Sr!   c               ó$   € V ^8„  d   QhRRRRRR/# )r   re   rG   Ú	entry_shar   r   r   r   )r   s   "r   r    r    Á   s&   € ÷ Vñ V˜Dð V¨Sð V°Tñ Vr!   c                óö   € \        V4      ;'       dh    T\        V P                  R4      ;'       g    R4      P                  4       \        V P                  R4      ;'       g    R4      P                  4       39   # )a  The install satisfies the catalog pin *entry_sha*: HEAD is that commit, or the pin is an
annotated tag whose commit was checked out (``sha`` records the peeled commit, ``pin`` the tag
object the installer verified). Neither matches after a re-pin or for an off-pin ``--ref`` install.rH   r‡   rŒ   )r   r   rX   r‘   )re   r¡   s   &&r   Úat_catalog_pinr£   Á   sn   € ô �	‹?÷ Vð V˜yÜˆG�K‰K˜Ó×$Ð$ "Ó%×+Ñ+Ó-¬s°7·;±;¸uÓ3E×3KÐ3KÈÓ/L×/RÑ/RÓ/Tð-Vñ  Vð Vr!   c               ó   € V ^8„  d   QhRR/# rœ   r   )r   s   "r   r    r    É   s   € ÷ ,ñ ,¨.ñ ,r!   c                ó   € \        V 4      # )z=Catalog fields from the authoritative installer-owned record.)rŸ   )rm   s   &r   Úcatalog_install_recordr¦   É   s   € ä 
Ó+Ð+r!   c               ó   € V ^8„  d   QhRR/# )r   r   ri   r   )r   s   "r   r    r    Î   s   € ÷ _ñ _ Mñ _r!   c                óÀ   € \        V 4      pV'       g   R# RVP                  R4      ;'       g    R R\        VP                  R4      ;'       g    R4      R,           2# )	zX``catalog:<tier>@<sha8>`` for a catalog install (``list`` Source column), else ``None``.Nzcatalog:rL   rM   Ú@rH   r‡   ºNé   N)r¦   rX   r   )Údir_pathre   s   & r   Úcatalog_annotationr­   Î   sU   € ä$ XÓ.€GßÙØ�g—k‘k &Ó)×8Ð8¨[Ð9¸¼3¸w¿{¹{È5Ó?Q×?WÐ?WÐUWÓ;XÐY[Õ;\Ð:]Ð^Ð^r!   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r8   r   Úremoved_entrieszlist[RemovedEntry]r   ri   r   )r   s   "r   r    r    Ö   s#   € ÷ ñ ˜Sð Ð=Oð ÐTañ r!   c                óø   € \        V4      ;'       g    / pWP                  R4      VP                  R4      3 F>  pV'       d   \        \        V4      V4      MRpVf   K(  VP                  ;'       g    Ru # 	  R# )u„  Kill-list reason when an INSTALLED plugin matches by name, catalog name or repo, else ``None``.

``removed_entries`` is required: callers annotating many rows (``plugins list``, the dashboard hub)
resolve the kill list once with :func:`plugin_catalog.resolved_removed_entries` and pass it in.
Resolving per row cost one live-catalog fetch â€” one network timeout, offline â€” per plugin.
rJ   rK   Nr0   )r¦   rX   r   r   r6   )r8   r¬   r¯   re   r9   r:   s   &&&   r   Úremoved_annotationr±   Ö   sk   € ô % XÓ.×4Ð4°"€GØŸK™K¨Ó7¸¿¹ÀVÓ9LÓMˆ	ßDM”-¤ I£°Ô@ÐSWˆØÔØ—>‘>×9Ð9Ð%9Ò9ñ Nñ r!   ÚwindowsÚwin32ÚmacosÚdarwinc               ó    € V ^8„  d   QhRRRR/# )r   Ú	platformsú	list[str]r   zset[str]r   )r   s   "r   r    r    ê   s   € ÷ Xñ X Ið X°(ñ Xr!   c                ó�   € V  Uu0 uF5  p\         P                  VP                  4       VP                  4       4      kK7  	  up# u upi )z;Return catalog platform names in host OS-family vocabulary.)Ú_PLATFORM_ALIASESrX   r‘   )r·   Úvalues   & r   Únormalized_platformsr¼   ê   s4   € áMVÓWÉYÀEÔ×!Ñ! %§+¡+£-°·±³Ö?ÉYÑWÐWùÒWs   …;Ac               ó    € V ^8„  d   QhRRRR/# )r   rB   r
   r   r,   r   )r   s   "r   r    r    ï   s   € ÷ 
ñ 
Ð0Bð 
Àtñ 
r!   c           
     óö   € V P                   '       g   R # ^ RIHp ^ RIHp V! 4       pV\        V P                   4      9  d8   V! RV P                   RV RRP                  V P                   4       R2RR	7      hR # )
Nr.   )Ú	os_familyr2   z' is unavailable on z; supported platforms: ú, Ú.Úincompatibler4   )r·   r&   r/   Úhermes_platform.host.factsr¿   r¼   r8   Újoin)rB   r/   r¿   r{   s   &   r   Ú$_refuse_unsupported_catalog_platformrÅ   ï   sq   € Ø�?�?ˆ?ÙÝ;Ý4á‹k€GØÔ*¨5¯?©?Ó;Ô;Ù"Ø�u—z‘z�lÐ"6°w°iÐ?VØ�y‰y˜Ÿ™Ó)Ð*¨!ð-Ø<Jô
ð 	
ñ <r!   ÚrefÚallow_removedFÚscan_decision_cbÚpython_depsTÚassume_deps_consentÚbefore_swapc               ó4   € V ^8„  d   QhRRRRRRRRRRR	RR
R/# )r   rB   r
   Úforcer   rÆ   ri   rÇ   rÉ   rÊ   r   Útupler   )r   s   "r   r    r    ý   sB   € ÷ ,ñ ,Ð!3ð ,¸tð ,È-ð ,Ø)-ð,Ø[_ð,à/3ð,àRWñ,r!   c               óP  € ^ RI Hp V'       g!   \        V P                  V P                  4       \        V 4       T! V P                  Y;'       g    V P                  VV P                  WVW7RV P                  RV P                  RV P                  RV P                  /R7
      w  ršpWšV3# )a+  ``_install_plugin_core`` at the catalog pin (an explicit *ref* wins) + provenance recorded on the
install-metadata record at the sha ACTUALLY checked out (a ``--ref`` install is not at the reviewed
pin, so ``update_available`` must say so). Returns the core's ``(target, manifest, installed_name)``.)Ú_install_plugin_corer8   rK   rL   rŒ   )	rÍ   rÆ   rÈ   Úreviewed_pinrÉ   rÊ   rÇ   rË   rF   )	r&   rÐ   r<   r8   rK   rÅ   Úinstall_identifierrH   rL   )rB   rÍ   rÆ   rÇ   rÈ   rÉ   rÊ   rË   rÐ   rE   ÚmanifestÚinstalled_names   &$$$$$$$    r   Úinstall_catalog_entryrÕ   ý   sŽ   € õ <ßÜ˜Ÿ™ U§Z¡ZÔ0Ü(¨Ô/Ù';Ø× Ñ ¨×3CÐ3C¸%¿)¹)ÐVfØ—Y‘Y¨KØ#Ø˜Ÿ™ V¨U¯Z©Z¸ÀÇÁÈUÐTY×T]ÑT]Ð^ô	(`Ñ$€F�nð
 ˜^Ð+Ð+r!   c               ó    € V ^8„  d   QhRRRR/# )r   r8   r   r   zOptional[RemovedEntry]r   )r   s   "r   r    r      s   € ÷ ñ  3ð Ð7Mñ r!   c                óf  € V'       d   \        V4      MRpV'       d   \        V4      MR;'       g    / pVP                  R4      RJ d   R# \        VP                  R4      \        4      '       d   VP                  R4      M/ p\        VP                  R4      ;'       g    R4      P                  R^4      ^ ,          pYVP                  R4      VP                  R	4      V'       d   VP                  MR.p\        4       pV F*  pV'       d   \        \        V4      V4      MRpVf   K(  Vu # 	  R# )
a1  Kill-list verdict for an INSTALLED plugin (manifest name, dir name, catalog name or recorded
source), or ``None``. A record carrying ``allow_removed`` (the user bypassed the list at install) is
honoured; the check is offline (in-tree list + cached live copy) so load time never blocks on the
catalog host.NrÇ   TrF   rŠ   r‡   r‹   r8   rK   )
r   ru   rX   rs   rG   r   r’   r8   r   r   )	r8   rm   rt   rw   rŠ   r+   Úentriesr9   r:   s	   &&       r   Úinstalled_plugin_removalrÙ     sï   € ÷
 &0”�jÔ!°T€Jß-7Œo˜jÔ)¸T×HÐHÀb€FØ‡z�z�/Ó" dÓ*ÙÜ%/°·
±
¸9Ó0EÄt×%LÒ%LˆF�J‰J�yÔ!ÐRT€EÜ�—‘˜HÓ%×+Ð+¨Ó,×2Ñ2°3¸Ó:¸1Õ=€FØ §	¡	¨&Ó 1°5·9±9¸VÓ3D×YcÀjÇoÂoÐimÐn€JÜ$Ó&€GÛˆ	ß<E”-¤ I£°Ô8È4ˆØÔØŠNñ  ñ r!   c               ó    € V ^8„  d   QhRRRR/# ©r   r8   r   r   r,   r   )r   s   "r   r    r    #  s   € ÷ 	lñ 	l cð 	l¸$ñ 	lr!   c           	     ó|   € ^ RI Hp \        W4      pVe'   T! RT  RVP                  ;'       g    R RV  R24      hR# )z£``PluginOperationError`` form of :func:`installed_plugin_removal` for ``update``/``enable``, which
otherwise keep pulling and activating code the catalog recalled.r.   Nr2   z.' was removed from the Hermes plugin catalog: r0   z(. Remove it with `hermes plugins remove z_`, or reinstall with `hermes plugins install <source> --force --allow-removed` if you trust it.)r&   r/   rÙ   r6   )r8   rm   r/   r:   s   &&  r   Úrefuse_if_installed_removedrÝ   #  s^   € õ <Ü& tÓ8€GØÒÙ"Ø�t�fÐJØ�~‰~×5Ð5Ð!5Ð6Ð6^Ð_cÐ^dð ekðkólð 	lñ r!   Ú__pycache__ú.gitÚdesktopc               ó    € V ^8„  d   QhRRRR/# )r   r8   r   r   r   r   )r   s   "r   r    r    :  s   € ÷ ;ñ ;˜ð ; ñ ;r!   c                óF   € V \         9   ;'       g    V P                  R4      # )zMInstaller/cache names that are never user state (checked per path component).z.pyc)Ú_PRESERVE_SKIPÚendswith)r8   s   &r   Ú_skip_preserverå   :  s   € à”>Ñ!×:Ð: T§]¡]°6Ó%:Ð:r!   c               ó    € V ^8„  d   QhRRRR/# )r   Úrelr   r   r   r   )r   s   "r   r    r    ?  s   € ÷ 	ñ 	 Tð 	¨dñ 	r!   c                ó(  € ^ RI Hp V P                  P                  4       pW!9   ;'       gh    V\        9   ;'       gW    V P                  4       \        9   ;'       g8    \        V P                  ;'       d    V P                  ^ ,          \        9   4      # )zWTrue for plugin code/control surfaces an update must never resurrect from the old tree.)ÚCODE_FILE_EXTENSIONS)
Útools.plugin_guardré   Úsuffixr‘   Ú_NO_GIT_REVISION_EXTENSIONSÚas_posixÚ_NO_GIT_REVISION_FILESr   ÚpartsÚ_NO_GIT_REVISION_DIRS)rç   ré   rë   s   &  r   Ú_revision_owned_without_gitrñ   ?  s‚   € å7Ø�Z‰Z×ÑÓ€FàÑ&÷ 	Eð 	EØÔ0Ñ0÷	Eð 	Eà�<‰<‹>Ô3Ñ3÷	Eð 	Eô �—	‘	×CÐC˜cŸi™i¨�lÔ.CÑCÓDð	r!   c               ó    € V ^8„  d   QhRRRR/# )r   rE   r   r   z%tuple[Optional[list[str]], list[str]]r   )r   s   "r   r    r    K  s   € ÷ ñ ˜4ð Ð$Iñ r!   c                ó  € ^ RI HpHpHp V! 4       pV R,          P	                  4       '       g   R. 3# V'       g   V! RV P
                   R24      hV! W@RRRR	R
R^R7	      pVP                  ^ 8w  dQ   VP                  ;'       g    VP                  ;'       g    RP                  4       pV! RV P
                   RV 24      h. . r‡VP                  P                  R4       F¢  p	\        V	4      ^8  d   K  V	R,          V	R,          rº\        ;QJ d/    R \        V4      P                   4       F  '       g   K   RM$	  RM ! R \        V4      P                   4       4      '       d   Kˆ  V
R9   d   TMTP                  V4       K¤  	  Wx3# )zÀ``(untracked_or_ignored, modified_tracked)`` in a git checkout. The first item is ``None``
when git cannot classify the installed tree (notably subdirectory installs, which carry no ``.git``).)r/   Ú_resolve_git_executableÚ_run_plugin_gitrß   Nz%Could not inspect local changes for 'z!': git executable is unavailable.Ústatusz--porcelainz	--ignoredz-zz--untracked-files=allz--ignored=matching)Útimeoutzgit status failedú': Ú :Nr   N:é   NNc              3  ó8   "  € T F  p\        V4      x € K  	  R # 5i©N)rå   )Ú.0Úparts   & r   Ú	<genexpr>Ú!_local_changes.<locals>.<genexpr>b  s   é € Ð@±¨Œ~˜d×#Ð#³ùs   ‚TF)z??z!!)r&   r/   rô   rõ   Úexistsr8   Ú
returncodeÚstderrÚstdoutÚstripr’   ÚlenÚanyr   rï   Úappend)rE   r/   rô   rõ   Úgit_exerö   r;   ÚlocalÚmodifiedÚitemÚcoderç   s   &           r   Ú_local_changesr  K  sY  € ÷ fÑeÙ%Ó'€GØ�V�O×#Ñ#×%Ò%Ø�RˆxˆßÙ"Ø3°F·K±K°=Ð@aÐbó
ð 	
ñ ˜W¨h¸À{ÐTXÐZqØ1¸2ô?€Fà×Ñ˜AÔØ—-‘-×GÐG 6§=¡=×GÐGÐ4G×NÑNÓPˆÙ"Ø3°F·K±K°=ÀÀFÀ8ÐLó
ð 	
ð ˜"ˆ8Ø—‘×#Ñ# DÖ)ˆÜˆt‹9�qŒ=ÙØ˜•H˜d 2�hˆcß‹3Ñ@´°S³	·²Ó@�3�3Š3Ñ@´°S³	·²Ó@×@Ò@ÙØ˜,Ô&‰¨H×<Ñ<¸SÖAñ *ð ˆ?Ðr!   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rE   r   Úrelsr¸   Ústashr   r,   r   )r   s   "r   r    r    h  s(   € ÷ #ñ #˜tð #¨9ð #¸Tð #Àdñ #r!   c                óÎ   € V F^  pW,          pVP                  4       '       g   K#  W#,          pVP                  P                  R R R7       \        P                  ! WE4       K`  	  R# )T)ÚparentsÚexist_okN)r�   rr   ÚmkdirÚshutilÚcopy2)rE   r  r  rç   ÚsrcÚdsts   &&&   r   Ú_stash_local_filesr  h  sH   € ÛˆØ�lˆØ�;‰;�=Œ=Ø•+ˆCØ�J‰J×Ñ T°DÐÔ9Ü�LŠL˜Ö"ó r!   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úoldr   Únewr
  zOptional[list[str]]r   r¸   r   )r   s   "r   r    r    q  s/   € ÷ uñ u˜4ð u dð uÐ3Fð uÈ9ñ ur!   c           	     óH	  a aaaa€ ^ RI Ho ^ RIHp S;'       g    R Uu0 uF  p\	        V4      kK  	  upo. o. pR VVV3R llpR VV 3R llpRR V3R lllp\
        P                  ! S VR	7       EF³  w  ršp\	        V	4      p. pV
 F•  p\        V4      '       g   Wã9   g   Sf   VS 8X  d   V\        9   d   K2  WÎ,          P                  4       '       g   \        WÎ,          4      '       d    V! WÎ,          P                  S 4      4       K„  VP                  V4       K—  	  WÚR&   V EFù  p\        V4      '       d   K  WÎ,          pVP                  S 4      pSf   \        V4      '       d   KG  M'SP                  V.VP                  O54      '       d   Ko   VP!                  4       P"                  p\&        P(                  ! T4      '       d   T! T4       K°  \&        P*                  ! T4      '       g   KÎ  Y,          p\
        P,                  P/                  T4      '       dV   \        T4      '       d	   T! T4      hTP1                  4       '       d    TP                  4       '       g
   T! TR4      hSf   EKP  TpS pTP2                  P4                   EF  pTT,          pTT,          p\
        P,                  P/                  T4      '       dH   \        T4      '       g-   TP                  4       '       g   TP1                  4       '       g	   T! T4      hK‚   TP!                  4       p\        T4      '       g'   \&        P6                  ! TP"                  4      '       g
   T! TR4      h\&        P8                  ! TP"                  4      pTP;                  TR7       TP=                  T4       EK  	  TP                  4       '       g   TP?                  4       '       d   TPA                  4        \B        PD                  ! TTRR7       TP                  TPG                  4       4       EKü  	  EK¶  	  S'       d%   S! RRPI                  \K        S4      4       R24      hV# u upi   \$         d   pS! RT RT 24      ThR
p?ii ; i  S d    h \$         d   pT! TR4      ThR
p?ii ; i)a¡  Carry user-owned files into a staged replacement without reviving old plugin code.

For a git checkout, *local* is the ``??``/``!!`` set and may contain a directory entry
such as ``data/``; descendants of those entries are copied and win over same-path files in
the new tree. ``None`` means there is no git checkout, so user-state files absent from the new
tree are carried while executable/declarative plugin surfaces remain revision-owned. If a
user-owned path cannot be represented safely in the new tree (a layout clash, or a symlink in a
git checkout's untracked/ignored set), fail before publication rather than silently dropping it.
Dirs in ``tools.plugin_guard.EXCLUDED_DIRS`` (``.venv/``, ``node_modules/``, tool caches) are
install artefacts: they are neither carried nor inspected, so links inside them never stop an update.
Returns the carried paths (POSIX, relative to the tree) so a later scan block can name them.
r.   )ÚEXCLUDED_DIRSc               ó    € V ^8„  d   QhRRRR/# )r   rç   r   r   r,   r   )r   s   "r   r    Ú'_carry_user_files.<locals>.__annotate__…  s   € ÷ *ñ *˜ð * ñ *r!   c                ó    <€ SeI   SP                  V .V P                  O54      '       g"   SP                  V P                  4       4       R # R # R # rü   )Ú
isdisjointr  r  rí   )rç   ÚkeepÚlinkedr
  s   &€€€r   Ú
_user_linkÚ%_carry_user_files.<locals>._user_link…  s@   ø€ ð Ò T§_¡_°cÐ5H¸C¿K¹KÑ5H×%IÒ%IØ�M‰M˜#Ÿ,™,›.Ö)ñ &JÑr!   c               ó    € V ^8„  d   QhRRRR/# )r   rf   rb   r   r,   r   )r   s   "r   r    r!  ‹  s   € ÷ bñ b˜ð b Tñ br!   c                ó"   <€ S! R S RV  24      V h)z$Could not preserve user files from 'rø   r   )rf   r/   r  s   &€€r   Ú_walk_errorÚ&_carry_user_files.<locals>._walk_error‹  s!   ø€ Ù"Ð%IÈ#ÈÈcÐRUÐQVÐ#WÓXÐ^aÐar!   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rç   r   r6   r   r   r/   r   )r   s   "r   r    r!  Ž  s"   € ÷ 
ñ 
�tð 
 Sð 
Ðcwñ 
r!   c                ó"   <€ S! R V  RV R24      # )zCannot preserve user file 'rø   z*. The installed plugin was left unchanged.r   )rç   r6   r/   s   &&€r   Ú	_conflictÚ$_carry_user_files.<locals>._conflictŽ  s#   ø€ Ù#Ø)¨#¨¨c°&°Ð9cÐdó
ð 	
r!   )ÚonerrorN:NNNzCould not preserve user file 'rø   z3the updated plugin now has a directory at that pathz)its source path changed during the update)Úmodez%its destination could not be preparedF)Úfollow_symlinksz'Cannot preserve symlinked user file(s) rÀ   zŒ: links are not followed into an update. Replace each with a regular file (or remove it) and retry. The installed plugin was left unchanged.r   )z1its destination conflicts with the updated plugin)&r&   r/   rê   r  r   ÚosÚwalkrå   rð   Ú
is_symlinkr   Úrelative_tor  rñ   r#  r  ÚlstatÚst_moderb   ÚstatÚS_ISLNKÚS_ISREGr“   ÚlexistsÚis_dirrr   rï   ÚS_ISDIRÚS_IMODEr  Úchmodr�   Úunlinkr  r  rí   rÄ   Úsorted)r  r  r
  r  rç   Úcarriedr&  r*  r.  ÚdirpathÚdirnamesÚ	filenamesÚherer4  r8   r  Úsrc_moderf   r  rr   Úsource_parentrþ   Úsource_infor1  r/   r$  r%  s   f&f                     @@@r   Ú_carry_user_filesrK  q  sÒ  ü€ õ <Ý0à!&§ ¨" Ó-¡˜#ŒD�ŽI¡Ñ-€DØ€FØ€G÷*ò *÷bñ b÷
ò 
ô
 )+¯ª°¸[×(IÐ(IÑ$ˆ˜9Ü�G‹}ˆØˆÛˆDô
 ˜t×$Ò$¨Ô(=Øš¨$°#¬+¸$ÔBWÔ:WÙØ•×'Ñ'×)Ò)¬[¸½×-EÒ-EÙ˜D�K×4Ñ4°SÓ9Ô:ÙØ�K‰K˜Öñ ð �‰ÜˆDä˜d×#Ò#ÙØ•+ˆCØ—/‘/ #Ó&ˆCØŠ}ô /¨s×3Ò3Ùð 4à—‘ #Ð!4¨¯©Ñ!4×5Ò5ÙðdØŸ9™9›;×.Ñ.�ô
 �|Š|˜H×%Ò%Ù˜3”ÙÜ—<’< ×)Ò)Ùà•)ˆCÜ�w‰w�‰˜s×#Ò#Ü˜s×#Ò#Ù# C›.Ð(ð —:‘:—<’<¨¯©×(8Ò(8Ù# CÐ)^Ó_Ð_Ø’=âàˆFØˆMØŸ
™
×(Õ(�Ø˜$•�Ø Õ%�Ü—7‘7—?‘? 6×*Ò*Ü" 6×*Ò*¨f×.?Ñ.?×.AÒ.AÈÏÉÏÊÙ'¨›nÐ,Ùð
[Ø"/×"5Ñ"5Ó"7�KÜ" =×1Ò1¼¿ºÀk×FYÑFY×9ZÒ9ZÙ'¨Ð-XÓYÐYÜŸ<š<¨×(;Ñ(;Ó<�DØ—L‘L d�LÔ+Ø—L‘L ×&ñ )ð$ �~‰~×Ò 3§;¡;§=¢=Ø—
‘
”Ü�LŠL˜˜c°5Õ9Ø�N‰N˜3Ÿ<™<›>×*ôy ñ! )J÷Z Ù"Ø5°d·i±iÄÀvÃÓ6OÐ5Pð Q7ð 7ó
ð 	
ð
 €NùòK .øôb ô dÙ*Ð-KÈCÈ5ÐPSÐTWÐSXÐ+YÓZÐ`cÐcûðdûðL ,ô ØÜô [Ù# CÐ)PÓQÐWZÐZûð[úsC    QÆQÌAR ÍAR ÑQ=Ñ)Q8Ñ8Q=Ò R!	ÒR!	Ò
R	ÒR!	c                  ó@   € ] tR tRt$ R]R&   R]R&   R]R&   R]R&   R	tR
# )ÚRepinResultié  r   rH   r   ÚchangedrÔ   r¸   Úwarningsr   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__annotations__Ú__static_attributes__r   r!   r   rM  rM  é  s   ‡ Ø	ƒHØƒMØÓØ×r!   rM  Úcapabilitieszhost capabilitiesÚtoolsÚhooksÚpython_dependencieszPython dependencieszDesktop UI halfÚrequires_authzyour sign-in forÚoauthzyour OAuth sign-in forc               ó$   € V ^8„  d   QhRRRRRR/# )r   rÓ   rG   Útreer   r   údict[str, set]r   )r   s   "r   r    r    ÷  s!   € ÷ ñ ˜Tð ¨ð °.ñ r!   c                óh  a € ^ RI Hp ^ RIHp S ;'       g    / o R V 3R llpR\	        T! S \        S P                  R4      ;'       g    R4      4      4      RV! R	4      R
V! RR
4      RV! R4      RV! R4      RV! S 4      RVR,          R,          P                  4       '       d   R0/# \	        4       /# )zdWhat an installed tree exposes: declared host capabilities, tools, hooks, Python deps, Desktop half.)Úoauth_surface)Ú$_declared_capabilities_from_manifestc               ó$   € V ^8„  d   QhRRRRRR/# )r   Úkeyr   Úaltsr   Úsetr   )r   s   "r   r    Ú$plugin_surface.<locals>.__annotate__ý  s!   € ÷ ñ �3ð ˜sð  sñ r!   c           
     ó  <€ V .VO Fj  pSP                  V4      p\        V\        4      '       g   K,  V Uu0 uF1  p\        V\        \        \
        34      '       g   K&  \        V4      kK3  	  upu # 	  \        4       # u upi rü   )rX   rs   Úlistr   ÚintÚfloatre  )rc  rd  ÚkÚrawÚxrÓ   s   &*   €r   Ú_listÚplugin_surface.<locals>._listý  sg   ø€ Ø�˜“ˆAØ—,‘,˜q“/ˆCÜ˜#œt×$Ô$Ù(+ÓP© 1¬z¸!¼cÄ3ÌÐ=N×/Oœœ˜Až©ÑPÒPñ ô ‹uˆùò Qs   ·#A?ÁA?rV  r8   Ú?rW  Úprovides_toolsrX  Úprovides_hooksrY  rZ  r[  rà   z	plugin.jszdesktop/plugin.js)Úhermes_cli.plugin_oauthr`  r&   ra  re  r   rX   r�   )rÓ   r]  r`  ra  rn  s   f&   r   Úplugin_surfacert  ÷  s¿   ø€ å5ÝKØ�~ˆ~˜2€H÷ð ð 	œÑ@ÀÌ3ÈxÏ|É|Ð\bÓOc×OjÐOjÐgjÓKkÓlÓmØ‘Ð'Ó(¨'±5Ð9IÈ7Ó3SØ™uÐ%:Ó;¸_ÉeÐTcÓNdØ‘˜xÓ(Ø¨T°IÕ-=ÀÕ-K×,TÑ,T×,VÒ,VÐ'Ð(ðð ô
 ]`Ó\aðð r!   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r  r^  r  r   údict[str, list[str]]r   )r   s   "r   r    r      s"   € ÷ 6ñ 6�~ð 6¨Nð 6Ð?Sñ 6r!   c                ó<  € \          Uu/ uF‡  pVP                  V\        4       4      V P                  V\        4       4      ,
          '       g   KD  V\        VP                  V\        4       4      V P                  V\        4       4      ,
          4      bK‰  	  up# u upi )z\``{surface: [added...]}`` for every surface the new tree widens; empty when nothing widened.)Ú_SURFACE_LABELSrX   re  rB  )r  r  rk  s   && r   Úsurface_deltary    su   € åFUó 6ÁoÀØ�w‰w�qœ#›%Ó  3§7¡7¨1¬c«eÓ#4×4Ñ4ô =ˆAŒv�c—g‘g˜a¤£Ó'¨#¯'©'°!´S³UÓ*;Õ;Ó<Ò<Áoñ 6ð 6ùò 6s   ‰ABÁABc               ó    € V ^8„  d   QhRRRR/# )r   Údeltarv  r   r¸   r   )r   s   "r   r    r      s   € ÷ Oñ OÐ3ð O¸	ñ Or!   c           	     ó”   € V P                  4        UUu. uF&  w  r\        V,           R RP                  V4       2NK(  	  upp# u uppi )z: rÀ   )Úitemsrx  rÄ   )r{  rk  Úvs   &  r   Úsurface_delta_linesr    s;   € Ø@EÇÁÄÔNÁ¹¸Œ˜qÕ!Ð" " T§Y¡Y¨q£\ NÓ3ÁÒNÐNùÓNs   ”,Ac                  ó2   a € ] tR tRtRtR V 3R lltRtV ;t# )ÚRepinConsentRequiredi  uÄ   The new pin widens the plugin's surface and no consent was given; nothing was changed on disk.
``delta`` is :func:`surface_delta`'s mapping â€” surfaces hand it to the user and retry with consent.c               ó$   € V ^8„  d   QhRRRRRR/# )r   r8   r   rH   r{  rv  r   )r   s   "r   r    Ú!RepinConsentRequired.__annotate__  s'   € ÷ rñ r˜Sð r sð rÐ3Gñ rr!   c                	ó¢   <€ WVuV n         V n        V n        \        SV `  R V RVR,           RRP                  \        V4      4       R24       R# )z
Updating 'z' to rª   z adds z; z. Confirm to continue.N)r8   rH   r{  ÚsuperÚ__init__rÄ   r  )Úselfr8   rH   r{  Ú	__class__s   &&&&€r   r†  ÚRepinConsentRequired.__init__  sS   ø€ Ø*.°UÐ'ˆŒ	�4”8˜TœZÜ‰ÑØ˜˜˜e C¨¥G 9¨F°4·9±9Ô=PÐQVÓ=WÓ3XÐ2YÐYoÐpö	rr!   )r{  r8   rH   )rP  rQ  rR  rS  Ú__doc__r†  rU  Ú__classcell__)rˆ  s   @r   r�  r�    s   ø† ñm÷rö rr!   r�  ÚinteractiveÚ
consent_cbc               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   rE   r   re   rG   rŒ  r   r   rM  r   )r   s   "r   r    r    !  s<   € ÷ kBñ kBØðkBàðkBð ð	kBð ñkBr!   c          	     óÌ  a aa$a%a&a'€ ^ RI HpHpHpHpHpHp	Hp
Hp \        VR,          4      o$\        S$4      o%S%f   V! RS$ R24      h\        S$S 4       \        VS%P                  4      '       d#   \        S%P                  RS P                  . 4      # \!        S 4      w  o'p\        VP#                  R4      ;'       g    R4      R	,          p\%        V! S 4      S 4      o&R
 V$VV%V&3R llp\&        P(                  ! RV! 4       R7      ;_uu_ 4       p\+        V4      R,          pV
! S%P,                  4      w  ppV! VVS%P                  4       V'       d
   V! VV4      MTpV! V	! V4      V4       RRR4       T! 4       P.                  R,          S P                   RV 2,          p\1        S VV4       ^ RIHp V! S S%VV'V 3R lR7       . pV! 4       P7                  4        F˜  w  pp\9        V\:        4      '       g   K  VP#                  R4      p\9        V\:        4      '       g   KG  VP#                  R4      S%P                  8X  g   Ki  \        VS%P                  4      '       g   K‡  VP=                  V4       Kš  	  \?        V4      ^8w  d   T! RT;'       g    R R24      hV^ ,          pS P.                  V,          p. pV'       d"   VP=                  R\?        V4       RV R24       VS 8w  dÎ   S PA                  4       '       d¸   ^ RI H!pH"pH#pH$p V! 4       V! 4       p!p Rp"V V!3 FD  p#S P                  V#9   g   K  V#PK                  S P                  4       V#PM                  V4       Rp"KF  	  V"'       d   V! V V!RS P                   RV R 2VR!7       V! S 4       VP=                  R"S P                   RV R#24       \        S%P                  RVV4      #   + '       g   i     ELo; i)$aî  Re-pin a catalog install to the current catalog SHA (never ``git pull``).

Publication stays PM-owned and recoverable. Untracked/ignored user files are copied into the
staged replacement before publication; tracked edits are backed up under
``<HERMES_HOME>/plugins-backup/<name>-<sha8>/``. A manifest rename moves the selection and removes
the stale directory.

A pin that widens the plugin (new tools, hooks, Python deps, host capabilities or a Desktop half)
is a new grant. ``consent_cb(delta) -> bool`` decides before publication; absent or declined raises
:class:`RepinConsentRequired` with the installed tree untouched. The immutable catalog pin is
previewed separately because the PM update transaction owns and publishes its own staged clone.
)r/   Ú_clone_plugin_reporp   rq   Ú_read_manifestÚ_read_manifest_for_installÚ_resolve_git_urlÚ_resolve_subdir_withinrJ   Nr2   up   ' is no longer in the catalog â€” it may have been removed. See `hermes plugins info` and the removed blocklist.FrH   r  rª   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rÓ   rG   r]  r   r   r,   r   )r   s   "r   r    Ú*repin_catalog_plugin.<locals>.__annotate__M  s&   € ÷ Gñ G ð G¨Dð G°Tñ Gr!   c                ó˜   <€ \        S\        W4      4      pV'       d,   Se   S! V4      '       g   \        SSP                  V4      hR # R # rü   )ry  rt  r�  rH   )rÓ   r]  r{  rJ   r�  rB   Úinstalled_surfaces   && €€€€r   Ú_consent_gateÚ+repin_catalog_plugin.<locals>._consent_gateM  sB   ø€ ÜÐ/´ÀÓ1OÓPˆß˜*Ò0±ZÀ×5FÒ5FÜ& |°U·Y±YÀÓFÐFñ 6G‰5r!   z.repin-preview-)ÚprefixÚdirÚpluginzplugins-backupÚ-)Úupdate_pluginc                ó   <€ \        SV S4      # rü   )rK  )Ústagedr
  rE   s   &€€r   Ú<lambda>Ú&repin_catalog_plugin.<locals>.<lambda>e  s   ø€ Ô(9¸&À&È%Ô(Pr!   )Úcatalog_entryrŒ  Úcarry_user_filesrF   r8   z>Catalog update published but its install record is ambiguous: ÚmissingrÁ   zLocal edits to z9 tracked file(s) were not carried over; copies are under z2 (the previous version's files, re-apply by hand).)Ú_admit_and_save_plugin_setsÚ_get_disabled_setÚ_get_enabled_setÚ_remove_plugin_coreTzRename plugin 'z' to 'Ú')Úactionr�  zPlugin renamed itself from 'z!'; the old directory was removed.)'r&   r/   r�  rp   rq   r‘  r’  r“  r”  r   r   rÝ   r£   rH   rM  r8   r  rX   rt  ÚtempfileÚTemporaryDirectoryr   rÒ   rr   r  Úhermes_cli.plugins_transactionrŸ  r}  rs   rG   r  r  r  r§  r¨  r©  rª  ÚremoveÚadd)(rE   re   rŒ  r�  r/   r�  rp   rq   r‘  r’  r“  r”  r  Úold_sha8r™  Úpreview_tmpÚpreview_rootÚgit_urlÚsubdirÚpreview_targetÚbackuprŸ  ÚmatchesrÔ   Úrowrw   Ú
new_targetrO  r§  r¨  r©  rª  ÚenabledÚdisabledÚselection_changedÚselectedrJ   rB   r˜  r
  s(   f&$d                                @@@@r   Úrepin_catalog_pluginrÀ  !  s  ý€ ÷&	÷ 	ó 	ô �w˜~Õ.Ó/€LÜ" <Ó0€EØ‚}Ù"Ø�|�nð %Cð CóDð 	Dô   ¨fÔ5Ü�g˜uŸy™y×)Ò)Ü˜5Ÿ9™9 e¨V¯[©[¸"Ó=Ð=ä$ VÓ,�O€Eˆ8Ü�7—;‘;˜uÓ%×.Ð.¨Ó/°Õ3€HÜ&¡~°fÓ'=¸vÓFÐ÷Gó Gô 
×	$Ò	$Ð,=Á<Ã>×	RÕ	RÐVaÜ˜KÓ(¨8Õ3ˆÙ*¨5×+CÑ+CÓD‰ˆ�Ù˜<¨°%·)±)Ô<ßIOÑ/°¸fÔEÐUaˆÙÑ0°Ó@À.ÔQ÷ 
Sñ ‹^×"Ñ"Ð%5Õ5¸6¿;¹;¸-ÀqÈÈ
Ð8SÕS€FÜ�v˜x¨Ô0Ý<áØØØÝPõ	ð €GÙ5Ó7×=Ñ=Ö?Ñˆ˜Ü˜#œt×$Ò$ÙØ—‘˜	Ó"ˆä�uœd×#Ô#Ø—	‘	˜&Ó! U§Z¡ZÖ/Ü˜u e§i¡i×0Ô0à�N‰N˜>Ö*ñ  @ô ˆ7ƒ|�qÔÙ"ØLÈW×MaÐMaÐXaÐLbÐbcÐdó
ð 	
ð ˜Q•Z€NØ—‘ Õ/€JØ€HßØ�‰˜/¬#¨h«-¨Ð8qØ!˜(Ð"TðVô 	Wà�VÔ §¡§¢÷	có 	cá,Ó.Ñ0AÓ0C�ˆØ!ÐØ  (Ó+ˆHØ�{‰{˜hÖ&Ø—‘ §¡Ô,Ø—‘˜^Ô,Ø$(Ò!ñ	 ,÷
 Ù'Ø˜¨O¸F¿K¹K¸=ÈÈ~ÐN^Ð^_Ð*`Ø%õ'ñ 	˜FÔ#Ø�‰Ð6°v·{±{°mÀ6È.ÐIYÐYzÐ{Ô|Ü�u—y‘y $¨¸ÓAÐA÷o 
S×	RÐ	Rús   ÄAOÏO#	c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R/# )
r   r8   r   rE   r   re   rG   rŒ  r   r   r   )r   s   "r   r    r    �  s1   € ÷ $ñ $˜Sð $¨$ð $¸ð $ÐX\ð $Ðhlñ $r!   c          	     óH  a aaaa€ ^ RI HoHpHoHpHp SP                  RS  R24       R VVVVV 3R llp\        WSVR7      p	V	P                  '       d   RMRp
SP                  R	V	P                   R
V
 RV	P                  R,           R24       V	P                   F  pSP                  RV R24       K  	  V	P                  '       dÏ   VP                  V	P                  ,          pV! V! V4      V	P                  4      pV'       d‘   ^ RIHpHp V! V	P                  V4      '       g   V! V	P                  V4      '       dW   S'       d#   V! SV	P                  VRR7       V	P                  # SP                  RV	P                   RV	P                   R24       V	P                  # )z½Re-pin a catalog install, printing progress; True when the pin moved. Refusals raise
:class:`RepinConsentRequired` / ``PluginOperationError`` with nothing changed (the caller reports them).)Ú_ask_yesra  Ú_is_ttyr‘  Ú_run_capability_consentz[dim]Checking catalog pin for z	...[/dim]c               ó    € V ^8„  d   QhRRRR/# )r   r{  rv  r   r   r   )r   s   "r   r    Ú(cmd_update_catalog.<locals>.__annotate__–  s   € ÷ 8ñ 8Ð!5ð 8¸$ñ 8r!   c                óÚ   <€ SP                  R S R24       \        V 4       F  pSP                  RV 24       K  	  S'       d   S! 4       '       g   SP                  R4       R# S! R4      # )z 
  [yellow]The new pin of [bold]z[/bold] adds:[/yellow]z    z‘  [yellow]Non-interactive session: update NOT applied (fail closed). Re-run `hermes plugins update` in a terminal to review and confirm.[/yellow]Fz  Apply this update? [y/N]: )Úprintr  )r{  ÚlinerÃ  rÄ  rA   rŒ  r8   s   & €€€€€r   Ú_confirm_wideningÚ-cmd_update_catalog.<locals>._confirm_widening–  sf   ø€ Ø�‰Ð9¸$¸Ð?UÐVÔWÜ'¨Ö.ˆDØ�M‰M˜D  ˜-Ö(ñ /ç¡'§)¢)Ø�M‰Mð iô jáÙÐ6Ó7Ð7r!   )rŒ  r�  z
updated tozis already at catalog pinu    [green]âœ“[/green] Plugin [bold]z[/bold] Ú rª   rÁ   õ   [yellow]âš  ú	[/yellow])Údeclared_set_changedÚpending_capabilitiesÚupdate)Úcontextz[yellow]Plugin zE has new capabilities; review them with `hermes plugins capabilities z`.[/yellow])r&   rÃ  ra  rÄ  r‘  rÅ  rÉ  rÀ  rN  rÔ   rH   rO  rr   Úhermes_cli.plugin_capabilitiesrÐ  rÑ  )r8   rE   re   rA   rŒ  ra  r‘  rÅ  rË  ÚresultÚverbrd   r»  ÚdeclaredrÐ  rÑ  rÃ  rÄ  s   f&&fd           @@r   Úcmd_update_catalogrØ  �  sz  ü€ ÷jõ jà‡M�MÐ2°4°&¸	ÐBÔC÷8ô 8ô " &¸{ÐWhÔi€FØ!Ÿ>Ÿ>˜>‰<Ð/J€DØ‡M�MÐ4°V×5JÑ5JÐ4KÈ8ÐTXÐSYÐYZÐ[a×[eÑ[eÐfhÕ[iÐZjÐjkÐlÔmØ—?”?ˆØ�‰˜ W I¨YÐ7Ö8ñ #à‡~‡~€~ð —]‘] V×%:Ñ%:Õ:ˆ
Ù7¹ÀzÓ8RÐTZ×TiÑTiÓjˆßßaÙ# F×$9Ñ$9¸8×DÒDÑH\Ð]c×]rÑ]rÐt|×H}ÒH}ßÙ+¨G°V×5JÑ5JÈHÐ^fÕgð
 �>‰>Ðð —M‘MØ)¨&×*?Ñ*?Ð)@ð A8Ø8>×8MÑ8MÐ7NÈkð[ô\ð �>‰>Ðr!   c               ó    € V ^8„  d   QhRRRR/# ©r   rB   r
   r   r   r   )r   s   "r   r    r    ¹  s   € ÷ %ñ %Ð0ð %°Sñ %r!   c           
     ó¬  € V P                   pVP                  R 3VP                  R3VP                  R33 UUu. uF:  w  r#V'       g   K  \	        V4       RT \	        V4      ^8w  d
   VR8w  d   RMR 2NK<  	  pppVP
                  '       d(   VP                  \	        VP
                  4       R24       RP                  V4      ;'       g    R# u uppi )	ÚtoolÚhookÚ
middlewarerÍ  Úsr‡   z envrÀ   u   â€”)rV  rq  rr  Úprovides_middlewarer  Úrequires_envr  rÄ   )rB   Úcapsr}  Úlabelrï   s   &    r   Ú_capability_countsrä  ¹  sÜ   € Ø×Ñ€Dà#'×#6Ñ#6¸Ð"?À$×BUÑBUÐW]ÐA^Ø#'×#;Ñ#;¸\Ð"Jñ"LôVñ"L‘�ÜOTô _”�E“
ˆ|˜1˜U˜G¬3¨u«:¸¬?¸uÈÔ?T¡CÐZ\Ð#]Ó^ñ"Lð 
ñ Vð ××ÐØ�‰œ˜D×-Ñ-Ó.Ð/¨tÐ4Ô5Ø�9‰9�UÓ×$Ð$˜uÐ$ùóVs   ¹CÁ
/Cc               ó    € V ^8„  d   QhRRRR/# rÚ  r   )r   s   "r   r    r    Ã  s   € ÷ Tñ TÐ'ð T¨Cñ Tr!   c                ó�   € V P                   '       d#   V P                    RV P                  R,           2# V P                  R,          # )zP``1.4.0 @ abcd1234`` when the entry carries a version label, else the short sha.z @ rª   )ÚversionrH   )rB   s   &r   Ú	pin_labelrè  Ã  s5   € à38·=·=°=ˆe�m‰mˆ_˜C §	¡	¨"¥˜Ð/ÐSÀeÇiÁiÐPRÅmÐSr!   c               ó    € V ^8„  d   QhRRRR/# )r   rØ   zlist[PluginCatalogEntry]r   r,   r   )r   s   "r   r    r    È  s   € ÷ yñ yÐ5ð yÀ4ñ yr!   c                óÈ  a
€ ^ RI Hp V! RRR7      p\        \        4       UUu/ uF  w  rEWTbK	  	  uppo
RRRRR	R
/p\	        V V
3R lR7       FÈ  pRVP                  VP                  R
4       RVP                   RVP                  VP                  R
4       R2p\        VP                  4      ^<8:  d   VP                  MVP                  R,          R,           p	VP                  VP                  VP                  W‰\        V4      \        V4      4       KÊ  	  VP                  4        VP                  V4       VP                  4        VP                  R4       R# u uppi )é    )Ú_tableNzHermes Plugin Catalog (curated))ÚtitleÚofficialÚcyanÚverifiedÚgreenrM   Úmagentac                ó|   <€ V P                   SP                  V P                  \        S4      4      V P                  3# rü   )ÚcategoryrX   rL   r  r8   )ÚeÚranks   &€r   r¢  Ú!_render_entries.<locals>.<lambda>Î  s*   ø€ ¨A¯J©J¸¿¹ÀÇÁÌÈTËÓ8SÐUV×U[ÑU[Ñ+\r!   )rc  Ú[Ú]z[/:Né9   Nz...zc[dim]Details:[/dim] hermes plugins info <name>    [dim]Install:[/dim] hermes plugins install <name>))ÚNameÚbold)ÚCategoryN)ÚTierN)ÚDescriptionN)ÚPinnedÚdim)ÚCapabilitiesr  )r&   rì  Ú	enumerater	   rB  rX   rL   r  ÚdescriptionÚadd_rowr8   rô  rè  rä  rÉ  )rØ   rA   rì  ÚtableÚir8   Ústylerõ  rL   Údescrö  s   &&        @r   Ú_render_entriesr
  È  s   ø€ Ý-Ùð @ØGhôj€Eä#,¬]Ô#;Ô<Ñ#;™˜ˆDŠGÑ#;Ò<€DØ˜ ¨W°kÀ9ÐM€EÜ�GÔ!\×]ˆØ�5—9‘9˜QŸV™V YÓ/Ð0°°!·&±&°¸¸E¿I¹IÀaÇfÁfÈiÓ<XÐ;YÐYZÐ[ˆÜ # A§M¡MÓ 2°bÔ 8ˆq�}Š}¸a¿m¹mÈCÕ>PÐSXÕ>XˆØ�‰�a—f‘f˜aŸj™j¨$´iÀ³lÔDVÐWXÓDYÖZñ ^ð ‡M�M„OØ‡M�M�%ÔØ‡M�M„OØ‡M�MÐwÖxùó =s   ¤EÚjson_outputc               ó$   € V ^8„  d   QhRRRRRR/# )r   Útermr   r  r   r   r,   r   )r   s   "r   r    r    Ø  s!   € ÷ &ñ &�Sð &¨tð &Àñ &r!   c               óR  € ^ RI Hp \        \        4       V 4      pV'       dE   \	        \
        P                  ! RT RV Uu. uF  qDP                  4       NK  	  up/^R7      4       R# V! 4       pV'       g"   TP	                  V '       d   RV  R2MR4       R# \        W54       R# u upi )	z]Search the curated catalog (name/description/declared tools); empty term = browse everything.©Ú_consoleÚqueryÚresultsrS   Nz$[yellow]No catalog entries matched 'z
'[/yellow]z([dim]No catalog entries available.[/dim])	r&   r  r   r   rÉ  r`   ra   Úto_dictr
  )r  r  r  r¹  rõ  rA   s   &$    r   Ú
cmd_searchr  Ø  s…   € å/ÜÔ.Ó0°$Ó7€GßÜŒd�jŠj˜' 4¨É'Ó4RÉ'ÀQ·Y±Y¶[É'Ñ4RÐSÐ\]Ô^Ô_ÙÙ‹j€GßØ�‰×QUÐ<¸T¸FÀ*ÑMØEô	GáÜ�GÖ%ùò 5Ss   ¿B$c               ó    € V ^8„  d   QhRRRR/# rÛ   r   )r   s   "r   r    r    ç  s   € ÷  ñ  �3ð  ˜4ñ  r!   c                ó²  € ^ RI HpHp \        V 4      pVf   V! V 4       R# V! 4       pVP                  pVP                  4        VP                  RVP                   RVP                   R24       VP                  '       d   VP                  VP                  4       VP                  4        RVP                  3RVP                  3RVP                  3R	VP                  3R
VP                  3RVP                  3RVP                  '       d   RVP                   2MR3RRP!                  VP"                  4      3RVP$                  3.	pV F.  w  rxV'       g   K  VP                  RVR,           R RV 24       K0  	  VP                  4        RVP&                  3RVP(                  3RVP*                  3RVP,                  33 F=  w  ryTP                  RVR,           R RRP!                  V	4      ;'       g    R 24       K?  	  VP                  4        \/        VP                  4      ;'       g    \/        VP                  4      p
V
e^   TP                  RV
P0                  ;'       g    R V
P2                  '       d   RV
P2                   R2MR R24       VP                  4        VP                  R VP                   24       VP                  4        R# )!z\Full catalog entry for *name*; falls back to installed-plugin details for non-catalog names.)r  Úcmd_showNz[bold]z[/bold] [cyan]\[z][/cyan]ÚRepoÚSubdirÚVersionz
Pinned SHAÚImageÚ
MaintainerÚRequireszhermes r‡   Ú	PlatformsrÀ   ÚDocsz[dim]Ú:z<12z[/dim] ÚToolsÚHooksÚ
MiddlewarezEnv varsz(none)u$   [red bold]âœ— REMOVED from catalog: r0   z (r1   z[/red bold]z/[dim]Install:[/dim]     hermes plugins install )r&   r  r  r   rV  rÉ  r8   rL   r  rK   r¶  rç  rH   ÚimageÚ
maintainerÚrequires_hermesrÄ   r·   Údocs_urlrq  rr  rà  rá  r   r6   r7   )r8   r  r  rB   rA   râ  Úrowsrã  r»   r}  r:   s   &          r   Úcmd_infor)  ç  ss  € ç9Ü" 4Ó(€EØ‚}Ù�ŒÙÙ‹j€GØ×Ñ€DØ‡M�M„OØ‡M�M�F˜5Ÿ:™:˜,Ð&7¸¿
¹
°|À8ÐLÔMØ××ÐØ�‰�e×'Ñ'Ô(Ø‡M�M„OØ�U—Z‘ZÐ  8¨U¯\©\Ð":¸YÈÏÉÐ<VÐYeÐgl×gpÑgpÐXqØ�e—k‘kÐ"Ø˜5×+Ñ+Ð,¨zÐ`e×`u×`uÐ`u¸WÀU×EZÑEZÐD[Ñ;\Ð{}Ð.~Ø˜$Ÿ)™) E§O¡OÓ4Ð5¸ÀÇÁÐ7OðQ€Dó ‰ˆß‰5Ø�M‰M˜E %¨#¥+¨cÐ!2°'¸%¸ÐAÖBñ ð ‡M�M„OØ! 4×#6Ñ#6Ð7¸'À4×CVÑCVÐ9WØ&¨×(@Ñ(@ÐAÀJÐPT×PaÑPaÐCbód‰ˆà�‰˜˜e c�k¨#Ð.¨g°d·i±iÀÓ6F×6RÐ6RÈ(Ð5SÐTÖUñdð ‡M�M„OÜ˜5Ÿ:™:Ó&×BÐB¬,°u·z±zÓ*B€GØÒØ�‰Ð<¸W¿^¹^×=cÐ=cÐOcÐ<dØ18··°˜2˜gŸl™l˜^¨1Ñ-À2ÐFÀkðSô 	Tà�‰ŒØ‡M�MÐCÀEÇJÁJÀ<ÐPÔQØ‡M�M†Or!   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r“   r   Úas_jsonr   Úinstall_depsr   r,   r   )r   s   "r   r    r    
  s)   € ÷ 'ñ '�sð ' Tð 'Àð 'ÐRVñ 'r!   c                ó   € ^ RI Hp ^ RIHp RpV'       d‚   ^ RIp^ RIHp ^ RIHpHp	H	p
H
p ^ RIHp  VP                  V! \        V 4      .4      R7       VP                  4       pV	! V4      P!                  4       '       d   V! WÚ! V4      4      V! V4      3pV! \        V 4      V4      pV'       dP   \%        \*        P,                  ! VP/                  4       ^R
7      4       \&        P0                  ! VP2                  4       V! 4       pVP%                  4        VP4                   F<  w  pppTP%                  V'       d   RMR RV 2V'       d   RV R2MR,           4       K>  	  VP6                   F  pVP%                  RV R24       K  	  VP8                  '       d¥   ^ RIHp V! VP8                  R,          VP8                  R,          VP8                  R,          4      pTP%                  VP>                  '       d   RMR RVPA                  4        R24       VPB                   F  pVP%                  RV R24       K  	  VP%                  4        TP%                  VPD                  '       d   RMR4       \&        P0                  ! VP2                  4       R#   \"         d*   p\%        RT 2\&        P(                  R	7        Rp?EL0Rp?ii ; i)zºCatalog-admission validation of a plugin directory (the CI gate); exits 0/1. *install_deps*
installs the declared Python deps first so the capability probe imports what an install would.)Úvalidate_plugin_dirr  N)Úpaths)Úactivation_environmentÚproject_pythonÚselected_venvÚvenv_command)Ú
Candidates)Úpluginszdependency preparation failed: )ÚfilerS   u   [green]âœ“[/green]u   [red]âœ—[/red]rÍ  u
    [dim]â€” z[/dim]r‡   rÎ  rÏ  )ÚIsolationReportÚverdictÚreasonsÚnotesu   [green]â—†[/green]u   [dim]â—‡[/dim]u    Isolation [dim]â€” u
     [dim]Â· z+[green bold]Validation passed.[/green bold]z'[red bold]Validation failed.[/red bold])#Úhermes_cli.plugin_validater.  r&   r  Úpmr/  Úpm.environmentsr0  r1  r2  r3  Úpm.plugin_inputsr4  Ú	sync_venvr   Ú	repo_rootr�   r�   rÉ  Úsysr  r`   ra   r  ÚexitÚ	exit_codeÚchecksrO  Ú	isolationÚ!hermes_cli.plugin_isolation_auditr7  Ú
host_readyÚsummaryr:  Úok)r“   r+  r,  r.  r  Úprober<  r/  r0  r1  r2  r3  r4  Úrootrf   ÚreportrA   Ú
check_namerI  r;   rd   r7  ÚisoÚnotes   &&&                     r   Úcmd_validaterP  
  s=  € õ ?Ý/Ø€EßÛÝßgÓgÝ/ð	LØ�L‰L¡¬T°$«Z¨LÓ!9ˆLÔ:ð —?‘?Ó$ˆDÙ˜dÓ#×+Ñ+×-Ò-Ù% d¨M¸$Ó,?Ó@ÑBXÐY]ÓB^Ð_�ñ !¤ d£¨UÓ3€FßÜŒd�jŠj˜Ÿ™Ó)°!Ô4Ô5Ü�Š�×!Ñ!Ô"Ù‹j€GØ‡M�M„OØ"(§-¤-Ñˆ
�B˜Ø�‰·Ñ-Ð9IÐJÈ!ÈJÈ<ÐXß8>˜: f X¨VÑ4ÀBõHö 	Iñ #0ð —?”?ˆØ�‰˜ W I¨YÐ7Ö8ñ #à××ÐÝEÙ˜f×.Ñ.¨yÕ9¸6×;KÑ;KÈIÕ;VÐX^×XhÑXhÐipÕXqÓrˆØ�‰°··°Ñ-ÐEUÐVÐVjÐkn×kvÑkvÓkxÐjyÐyð  Aô  	BØ—I”IˆDØ�M‰M˜J t f¨FÐ3Ö4ñ à‡M�M„OØ‡M�MÀ6Ç9Ç9À9Ñ?ÐR{Ô|Ü‡H‚HˆV×ÑÖøô+ ô 	LÜÐ3°C°5Ð9ÄÇ
Á
×KÓKûð	Lús   ´A$J ÊKÊ$KËKc               ó    € V ^8„  d   QhRRRR/# )r   Ú	installedzdict[str, dict[str, Any]]r   údict[str, Any]r   )r   s   "r   r    r    6  s   € ÷ ñ Ð'@ð À^ñ r!   c                óD  € / pV P                  4        F:  p\        VR,          4      pV'       g   K  / VCRV/CV\        VR,          4      &   K<  	  . p\        4        EF"  pVP	                  VP
                  4      ;'       g    V P	                  VP
                  4      pV'       d   VP	                  R4      MRpV'       d*   VP	                  R4      '       d   \        VR,          4      MRpTP                  / VP                  4       CRVP                  R,          R\        V4      R	VRJR
TR\        V4      ;'       d&    \        T;'       g    / VP                  4      '       * RV'       d
   VR,          MR/C4       EK%  	  RTR\        4        Uu. uF5  pRVP
                  RVP                  RVP                  RVP                  /NK7  	  upR\         P                   P#                  \         P$                  4      P'                  4       P)                  RR4      /# u upi )a\  Catalog entries merged with local state for the dashboard. *installed* maps every alias (name
and registry key) of a discovered plugin to ``{"dir", "runtime_status"}``. A catalog name rarely
equals the manifest name (``hermes-plugin-x`` vs ``x``), so installs are matched through the
sidecar's ``catalog_name`` first and by name only as a fallback.rœ  re   rJ   NrH   Ú	sha_short:Né   NÚcapability_summaryrR  Úinstalled_shaÚupdate_availableÚruntime_statusrØ   r:   r8   rK   r6   r7   Úgenerated_atrQ   rR   )Úvaluesr¦   r   r   rX   r8   r  r  rH   r   r   r£   r   rK   r6   r7   rY   rZ   r[   r\   r]   )rR  Úby_catalog_namer
  re   rØ   rB   rX  Úrs   &       r   Úinstalled_catalog_stater_  6  sÈ  € ð
 24€OØ×!Ñ!Ö#ˆÜ(¨¨u­Ó6ˆß‰7Ø<Y¸uÐ<YÀiÐQXÑ<YˆOœC ¨Õ 7Ó8Ó9ñ $ð €GÜ"×$ˆØ×#Ñ# E§J¡JÓ/×LÐL°9·=±=ÀÇÁÓ3Lˆß*/�%—)‘)˜IÔ&°Tˆß/6¸7¿;¹;Àu×;MÒ;Mœ˜G E�NÔ+ÐSWˆØ�‰ð 
Ø�m‰m‹oð
Ø*¨E¯I©I°b­MØ Ô":¸5Ó"AØ˜ dÐ*¨O¸]Ø¤ ]Ó 3× dÐ d¼NÈ7Ï=È=ÐVXÐZ_×ZcÑZcÓ<dÔ8dØ¿˜eÐ$4Ö5ÀDñ
÷ 	ñ	 %ð 	�7ØÔbzÔb|Ó}Ñb|Ð]^�V˜QŸV™V V¨Q¯V©V°X¸q¿x¹xÈÐQR×QWÑQWÓXÑb|Ñ}Øœ×)Ñ)×-Ñ-¬h¯l©lÓ;×EÑEÓG×OÑOÐPXÐZ]Ó^ðð ùâ}s   Æ;H
c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úpinsúdict[str, str]ÚversionszOptional[dict[str, str]]r   rS  r   )r   s   "r   r    r    S  s#   € ÷ ñ  ~ð ÐAYð Ðesñ r!   c                ó  € T;'       g    / p\        V 4      pV'       g   / # \        VP                  R4      ;'       g    R4      P                  4       pRVR,          R\        VP                  R4      ;'       g    R4      RV/pVP                  \        VR,          4      4      pV'       dY   WeR&   VP                  \        VR,          4      4      ;'       g    R	VR
&   \	        V4      ;'       d    \        W64      '       * VR&   V# )zåProvenance fields for one installed-plugin row (TUI/desktop ``plugins.manage list``): catalog
name/tier/installed SHA and, when *pins* has the entry, the current pin (+ its version label from
*versions*) and ``update_available``.rH   r‡   rJ   r~   rL   rM   rX  Úcatalog_shaNÚcatalog_versionrY  )r¦   r   rX   r‘   r   r£   )r¬   ra  rc  re   rX  rº  rŒ   s   &&&    r   Úcatalog_row_fieldsrg  S  sç   € ð �~ˆ~˜2€HÜ$ XÓ.€GßØˆ	Ü˜Ÿ™ EÓ*×0Ð0¨bÓ1×7Ñ7Ó9€Mà˜ Õ/°ÄÀWÇ[Á[ÐQWÓEX×EgÐEgÐ\gÓAhØ˜ð(€Cð �(‰(”3�w˜~Õ.Ó/Ó
0€Cß
Ø ˆMÑØ!)§¡¬c°'¸.Õ2IÓ.JÓ!K×!SÐ!SÈtˆÐÑÜ"& }Ó"5×"ZÐ"Z¼nÈWÓ>ZÔ:ZˆÐÑØ€Jr!   c               ó   € V ^8„  d   QhRR/# ©r   r   rb  r   )r   s   "r   r    r    g  s   € ÷ ñ �nñ r!   c                 ó�   €  \        4        U u/ uF  q P                  V P                  bK  	  up # u up i   \         d    / u # i ; i)zU``{catalog_name: pinned_sha}`` from the live catalog; empty on failure (best effort).)r   r8   rH   r�   ©rõ  s    r   Úcatalog_pinsrl  g  sB   € ðÜ'8Ô':Ó;Ñ': !—‘˜Ÿ™’Ñ':Ñ;Ð;ùÒ;øÜô ØŠ	ðús   ‚5 Ž0­5 °5 µAÁAc               ó   € V ^8„  d   QhRR/# ri  r   )r   s   "r   r    r    o  s   € ÷ ñ ˜ñ r!   c                 ó¸   €  \        4        U u/ uF-  q P                  '       g   K  V P                  V P                  bK/  	  up # u up i   \         d    / u # i ; i)u  ``{catalog_name: title}`` for entries that carry one â€” the Plugins hub server-sentence display
name. One resolution for a whole listing: callers that annotate every installed plugin must not
pay a live-catalog fetch per candidate (see ``resolved_removed_entries``); empty on failure.)r   rí  r8   r�   rk  s    r   Úcatalog_titlesro  o  sJ   € ðÜ):Ô)<ÓHÑ)< AÇÅ”�—‘˜Ÿ™’Ñ)<ÑHÐHùÒHøÜô ØŠ	ðúó'   ‚A	 ŽA¦AÁA	 ÁA	 Á	AÁAc               ó   € V ^8„  d   QhRR/# ri  r   )r   s   "r   r    r    y  s   € ÷ ñ ˜.ñ r!   c                 ó¸   €  \        4        U u/ uF-  q P                  '       g   K  V P                  V P                  bK/  	  up # u up i   \         d    / u # i ; i)z]``{catalog_name: version_label}`` for entries that carry one; empty on failure (best effort).)r   rç  r8   r�   rk  s    r   Úcatalog_versionsrs  y  sL   € ðÜ+<Ô+>ÓLÑ+> aÇ)Å)Ô!�—‘˜Ÿ	™	Ò!Ñ+>ÑLÐLùÒLøÜô ØŠ	ðúrp  c               ó   € V ^8„  d   QhRR/# )r   r   z5tuple[dict[str, str], dict[str, str], dict[str, str]]r   )r   s   "r   r    r    �  s   € ÷ ;ñ ;ÐPñ ;r!   c                 ó”  €  \        4       p T  Uu/ uF  qP                  TP                  bK  	  upT  Uu/ uF-  qP                  '       g   K  TP                  TP                  bK/  	  upT  Uu/ uF-  qP
                  '       g   K  TP                  TP
                  bK/  	  up3#   \         d	    / / / 3u # i ; iu upi u upi u upi )u¤  The pins/versions/titles maps from ONE live-catalog resolution. Listing callers (``_plugin_rows``)
need all three; taking them via :func:`catalog_pins`/:func:`catalog_versions`/:func:`catalog_titles`
would pay the whole ``load_catalog_live()`` pass â€” git probe, ~300 catalog YAMLs, prefer-in-tree
merges â€” three times per inventory request (#125683). Best effort like the per-map helpers: an
empty triple on failure.)r   r�   r8   rH   rç  rí  )rØ   rõ  s     r   Úcatalog_rows_mapsrv  �  s¦   € ðÜ#Ó%ˆñ %,Ó,¡G˜q�V‰V�Q—U‘UŠ]¡GÑ,Ù(/Ó=© 1·9µ9ÔˆQ�V‰V�Q—Y‘YÒ©Ñ=Ù&-Ó9¡g ·µŒ_ˆQ�V‰V�Q—W‘WŠ_¡gÑ9ð;ð ;øô ô Ø�2�rˆzÒðüâ,ùÚ=ùÚ9s-   ‚
B% �B;µC ÁC Á.CÂCÂ%B8Â7B8rü   >   úuv.lockúmcp.jsonú
plugin.ymlúplugin.jsonúplugin.yamlúpackage.jsonúpyproject.tomlúpackage-lock.json>   Úskillsrà   re   Ú	dashboardÚnode_modules>   ú.cjsú.jsxú.mjsú.tsx)r‡   )FF)[rŠ  Ú
__future__r   rY   r`   Úloggingr3  r  r9  rA  r­  Úpathlibr   Útypingr   r   r   r   r   Úhermes_cli.plugin_catalogr	   r
   r   r   r   r   r   r   r   r   r   r   r   Úpm.filesystemr   Ú	getLoggerrP  rc   r^   r)   r<   rC   rg   rk   ru   rƒ   r•   r™   rš   rŸ   r£   r¦   r­   r±   rº   r¼   rÅ   rÕ   rÙ   rÝ   rã   Ú	frozensetrî   rð   rì   rå   rñ   r  r  rK  rM  rx  rt  ry  r  r�   r�  rÀ  rØ  rä  rè  r
  r  r)  rP  r_  rg  rl  ro  rs  rv  r   r!   r   Ú<module>rŽ     s=  ðñõ #ã Û Û Û 	Û Û Û 
Û Ý ß 8Õ 8÷÷ ÷ õ õ
 &à	×	Ò	˜8Ó	$€à(€õYõQõ	õQ÷ õ	8õõ";ð0 FÀ}ÐU€õNõ!SõHVõ,õ
_õð"  ¨°(Ð;Ð õXõ

ð,ÐZ^ð ,Ø05ð,ØHLð,Øbfð,à6;ð,àIM÷,õ$õ(	lð   ¨Ð9€Ù"ò $ó Ð ñ "Ò"_Ó`Ð ñ (Ò(HÓIÐ õ;õ
	õõ:#õuôp�*ô ð "Ð#6¸ÀÈ'ÐSZØ(Ð*?ÀÐL]Ø"Ð$6¸ÐAYð[€õ
õ,6õOôr˜9ô rðkBð ð	kBð
 ÷kBð\$Ð_c÷ $õT%õTõ
yñ &°e÷ &ð &õ ÷F'õX÷:õ(õõ÷;r!   