+
    …WÝj§  ã                  ó    € R t ^ RIHt ^ RIt^ RIHt ^ RIHt Rt ! R R]	4      t
RR R	 lltRR
 R lltR R ltR R ltR R ltR R ltR# )uY  The enabled-features file: the exact extras the install carries.

The bundle is built with `uv sync --all-extras` minus the declared
opt-in extras (`opt_in_extras`), but WHICH extras
actually resolve differs per platform (markers gate some off). The
shipped default is the EXACT list that installed â€” written at bundle
time beside the payload, read at sync time:

- lazy installs OFF (security.allow_lazy_installs: false): the feature
  list is FROZEN to this file; pm sync never deviates from it and never
  installs a plugin dep.
- lazy installs ON: the file is the baseline; extras union on top.
)ÚannotationsN)ÚPath)ÚOptionalzenabled-features.jsonc                  ó   € ] tR t^tRtRtR# )ÚFeatureProbeErrorz9A failed inventory must not become an empty feature list.© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__static_attributes__r   ó    Ú?C:\Users\johnn\AppData\Local\hermes\hermes-agent\pm\features.pyr   r      s   † ÝCr   r   c               ó    € V ^8„  d   QhRRRR/# )é   Úbase_dirúOptional[Path]Úreturnr   r   )Úformats   "r   Ú__annotate__r      s   € ÷ 3ñ 3˜Nð 3°dñ 3r   c                óh   € V e   V \         ,          # ^ RIHp V! 4       P                  \         ,          # )uu  Where the enabled-features file lives. In a bundle, the payload
root (beside manifest.json â€” bundle-written, sealed-shipped). At
runtime, the runtime dir (beside the byte store â€” per-install,
writable on every install kind). Same relative location on both:
a sealed install's store_root() is <payload>/tools, and the file
sits at the payload root = store_root().parent.)Ú
store_root)ÚFEATURES_FILENAMEÚpm.pathsr   Úparent)r   r   s   & r   Úfeatures_pathr      s-   € ð ÒØÔ+Õ+Ð+Ý#á‹<×ÑÔ!2Õ2Ð2r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úextrasú	list[str]r   r   r   r   r   )r   s   "r   r   r   *   s!   € ÷ ñ ˜9ð °ð È$ñ r   c                óâ   € \        V4      pVP                  P                  RRR7       VP                  \        P
                  ! R^R\        \        V 4      4      /^R7      R,           RR7       V# )	z<Record the exact extras an install carries. Sorted, deduped.T)ÚparentsÚexist_okÚschemar   )ÚindentÚ
úutf-8©Úencoding)r   r   ÚmkdirÚ
write_textÚjsonÚdumpsÚsortedÚset)r   r   Úpaths   && r   Úwrite_featuresr0   *   sc   € ä˜Ó"€DØ‡K�K×Ñ˜d¨TÐÔ2Ø‡O�OÜ�
Š
�H˜a ¬6´#°f³+Ó+>Ð?ÈÔJÈTÕQØð ô ð €Kr   c               ó   € V ^8„  d   QhRR/# )r   r   zOptional[list[str]]r   )r   s   "r   r   r   5   s   € ÷ ,ñ ,Ð*ñ ,r   c                 ó4  €  \         P                  ! \        4       P                  RR7      4      p T P                  R4      p\        T\        4      '       g   R# \        T Uu0 uF  p\        T4      kK  	  up4      #   \        \
        3 d     R# i ; iu upi )uŠ   The frozen/baseline feature list; None when no file exists (source
installs without a bundle â€” the baseline is the recorded venv
state).z	utf-8-sigr'   Nr   )r+   Úloadsr   Ú	read_textÚOSErrorÚ
ValueErrorÚgetÚ
isinstanceÚlistr-   Ústr)Údatar   Úes      r   Úread_featuresr=   5   s€   € ðÜ�zŠzœ-›/×3Ñ3¸[Ð3ÓIÓJˆð �X‰X�hÓ€FÜ�fœd×#Ò#ÙÜ¡6Ó*¡6˜a”3�q–6¡6Ñ*Ó+Ð+øô ”ZÐ ô Úðüò
 +s   ‚.A= Á"BÁ=BÂBc               ó    € V ^8„  d   QhRRRR/# ©r   Úrepo_dirr   r   r   r   )r   s   "r   r   r   C   s   € ÷ Lñ L˜dð L yñ Lr   c                óú   € ^ RI pV R,          P                  R4      ;_uu_ 4       pVP                  V4      pRRR4       \        XP	                  R/ 4      P	                  R/ 4      4      #   + '       g   i     L;; i)z*Every extra the repo's pyproject declares.Núpyproject.tomlÚrbÚprojectúoptional-dependencies)ÚtomllibÚopenÚloadr-   r7   )r@   rF   Úfr;   s   &   r   Údeclared_extrasrJ   C   s]   € ãà
Ð%Õ
%×	+Ñ	+¨D×	1Ô	1°QØ�|‰|˜A‹ˆ÷ 
2ä�$—(‘(˜9 bÓ)×-Ñ-Ð.EÀrÓJÓKÐK÷ 
2×	1ús   ¥A*Á*A:	c               ó    € V ^8„  d   QhRRRR/# r?   r   )r   s   "r   r   r   L   s   € ÷ ñ ˜Dð  Yñ r   c                óè  € ^ RI pV R,          P                  R4      ;_uu_ 4       pVP                  V4      pRRR4       XP                  R/ 4      P                  R/ 4      P                  R. 4      p\	        VP                  R/ 4      P                  R/ 4      4      p\        \	        V4      V,
          4      pV'       d   \        R	V 24      h\        \	        V4      4      #   + '       g   i     L²; i)
aM  Extras that only an explicit selection installs, never an all-extras build.

``[tool.hermes] opt-in-extras`` in the repo's pyproject. They stay
installable through ``sync_venv([extra])``; bundles and other
``--all-extras`` builds leave them out, so their closures are absent
from shipped payloads and from the recorded feature list.
NrB   rC   ÚtoolÚhermeszopt-in-extrasrD   rE   z5[tool.hermes] opt-in-extras names undeclared extras: )rF   rG   rH   r7   r.   r-   r6   )r@   rF   rI   r;   ÚnamesÚdeclaredÚunknowns   &      r   Úopt_in_extrasrR   L   sÂ   € ó à
Ð%Õ
%×	+Ñ	+¨D×	1Ô	1°QØ�|‰|˜A‹ˆ÷ 
2à�H‰H�V˜RÓ ×$Ñ$ X¨rÓ2×6Ñ6°ÈÓK€EÜ�4—8‘8˜I rÓ*×.Ñ.Ð/FÈÓKÓL€HÜ”S˜“Z (Õ*Ó+€GßÜÐPÐQXÐPYÐZÓ[Ð[Ü”#�e“*ÓÐ÷ 
2×	1ús   ¥C!Ã!C1	c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r@   r   Úvenv_dirÚ
python_exer   r   r   )r   s   "r   r   r   `   s.   € ÷ /kñ /k˜tð /k¨tð /kÀDð /kÈYñ /kr   c               ó&  a€ ^ RI p^ RIHp \        V 4       Uu/ uF  qUV! V4      bK  	  pp\	        VP                  4        UUu0 uF  qw F  qˆkK  	  K  	  upp4      p	Rp
 VP                  \        V4      RRRRV
\        VP                  4       4      \        P                  ! V	4      .V RRR	R
^<RR7      p \        P                   ! TP"                  4      o\'        S\(        4      '       dp   \+        S4      \+        T	4      8w  gW   \,        ;QJ d*    R SP                  4        4       F  '       g   K   RM	  RM! R SP                  4        4       4      '       d   \        R4      h\	        T3R lTP/                  4        4       4      # u upi u uppi   \        TP                  3 dF   p\        TRR4      ;'       g    \        T4      P                  4       p\        RT RT 24      ThRp?ii ; i  \$         d   p\        R4      ThRp?ii ; i)zÒInventory every required anchor in one isolated target process.

The staged interpreter owns the site layout. Only the selected tree's
.pth files are processed, so editable packages keep their launch behavior.
N)Ú_anchorsa¿  
import contextlib, importlib.util, json, os, site, sys, sysconfig
base, anchors = sys.argv[1], json.loads(sys.argv[2])
paths = sysconfig.get_paths(vars={"base": base, "platbase": base})
sites = dict.fromkeys(paths[key] for key in ("purelib", "platlib"))
if not any(os.path.isdir(path) for path in sites):
    raise RuntimeError("target dependency tree has no site-packages")
result = {}
with contextlib.redirect_stdout(sys.stderr):
    for path in sites:
        site.addsitedir(path)
    for anchor in anchors:
        try:
            result[anchor] = importlib.util.find_spec(anchor) is not None
        except (ImportError, ValueError):
            result[anchor] = False
print(json.dumps(result))
z-Bz-Iz-Sz-cTr&   Úreplace)ÚcwdÚcapture_outputÚtextr(   ÚerrorsÚtimeoutÚcheckÚstderrzfeature inventory failed on z: z'feature inventory returned invalid JSONc              3  óD   "  € T F  p\        V4      \        Jx € K  	  R # 5i©N)ÚtypeÚbool)Ú.0Úvalues   & r   Ú	<genexpr>Ú#installed_extras.<locals>.<genexpr>�   s   é € ÐJÑ8I¨u”4˜“;¤dÕ*Ó8Iùs   ‚ Fz4feature inventory returned incomplete anchor resultsc              3  ó°   <"  € T FK  w  r\         ;QJ d    V3R  lV 4       F  '       d   K   RM	  RM! V3R  lV 4       4      '       g   KG  Vx € KM  	  R# 5i)c              3  ó6   <"  € T F  pSV,          x € K  	  R # 5ira   r   )rd   ÚanchorÚresolveds   & €r   rf   Ú-installed_extras.<locals>.<genexpr>.<genexpr>�   s   øé € ÐCiÑchÐY_ÀHÈV×DTÒDTÓchùs   ƒFTN)Úall)rd   ÚextraÚgrouprk   s   &  €r   rf   rg   �   s6   øé € ÐjÑ,<™L˜EÇÃÔCiÑchÓCiÇÇÂÔCiÑchÓCi×@i—%’%Ó,<ùs   ƒ&A¬AÁ
A)Ú
subprocessÚ	pm.extrasrW   rJ   r-   ÚvaluesÚrunr:   Úresolver+   r,   r5   ÚSubprocessErrorÚgetattrÚstripr   r3   Ústdoutr6   r8   Údictr.   ÚanyÚitems)r@   rT   rU   rp   rW   rn   Úrequiredro   rj   ÚanchorsÚprobeÚchildÚexcÚdetailrk   s   &&$           @r   Úinstalled_extrasr‚   `   sÌ  ø€ ó å"ä4CÀHÔ4MÓNÑ4M¨5‘x “Ò&Ñ4M€HÐNÜ¨(¯/©/Ô*;ÔPÑ*; Ê%À’fÉ%‘fÑ*;ÒPÓQ€Gð€Eð$	`Ø—‘Ü�‹_˜d D¨$°°eÜ�×!Ñ!Ó#Ó$¤d§j¢j°Ó&9ð;à¨°DÀ7Ø b°ð	 ó 
ˆðTÜ—:’:˜eŸl™lÓ+ˆô �x¤×&Ò&¬#¨h«-¼3¸w»<Ô*Gß‹sÑJ¸¿¹Ô8IÓJ�s�sŠsÑJ¸¿¹Ô8IÓJ×JÒJÜÐ VÓWÐWÜÔj¨H¯N©NÔ,<ÓjÓjÐjùòK OùÛPøô4 �Z×/Ñ/Ð0ô `Ü˜#˜x¨Ó.×:Ð:´#°c³(×AÑAÓCˆÜÐ">¸z¸lÈ"ÈVÈHÐ UÓVÐ\_Ð_ûð`ûô
 ô TÜÐ IÓJÐPSÐSûðTús=   ™F
ÁF
Á!AF Â7 G4 ÆG1Æ,A G,Ç,G1Ç4HÇ?HÈHra   )r   Ú
__future__r   r+   Úpathlibr   Útypingr   r   ÚRuntimeErrorr   r   r0   r=   rJ   rR   r‚   r   r   r   Ú<module>r‡      sL   ðñõ #ã Ý Ý à+Ð ôD˜ô D÷3÷õ,õLõ÷(/kr   