+
    jHàj¯1  ã                  óD  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIHt ^ RI	H
t
 ^ RIHtHt ^ RIHt ^ RIHt ]! RR	7       ! R
 R4      4       tR&R R l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RR/R R lltRsR]R&   R  R! ltR" R# ltR'R$ R% lltR# )(u   Canonical runtime identity for Hermes.

Resolution order:
1. Install stamp (``install-stamp.json``) â€” written at build time by
   ``scripts/write_install_stamp.py`` for every packager (Docker, Nix, and
   the desktop app). The stamp is authoritative
   for packaged builds.
2. Live git â€” for unstamped source/dev installs with a ``.git`` directory.
3. Unknown â€” no stamp and no git. The provenance is unknown.
)ÚannotationsN)Ú	dataclass)ÚPath)ÚLiteralÚcast)ÚUPDATE_MECHANISMS)ÚSTABLE_TAG_RET)Úfrozenc                  ó”   € ] tR t^t$ R]R&   R]R&   R]R&   R]R&   R]R&   R	]R
&   RtR]R&   RtR]R&   RtR]R&   ]R R l4       t	Rt
R# )ÚVersionInfoÚstrÚbase_versionÚderived_versionú
int | NoneÚdistanceú
str | NoneÚcommitÚbranchz^Literal['build', 'commit-build', 'ci', 'docker', 'fallback', 'git', 'local', 'nix', 'unknown']ÚsourceFÚboolÚdirtyNÚcommit_datez.Literal['docker', 'nix', 'desktop-app'] | NoneÚdistributionc               ó   € V ^8„  d   QhRR/# )é   Úreturnr   © )Úformats   "Ú</home/ubuntu/.hermes/hermes-agent/hermes_cli/version_info.pyÚ__annotate__ÚVersionInfo.__annotate__&   s   € ÷ Bñ B ñ Bó    c                ó|   € V P                   R8X  d   V P                  # \        V P                   V P                  4      # )z–``<base>+<distance>`` when a release is known, else the derived identity.
Keep a tagless checkout's ``git.<sha>`` rather than reducing it to unknown.
Úunknown)r   r   Ú_derived_versionr   )Úselfs   &r   Údisplay_versionÚVersionInfo.display_version%   s5   € ð
 ×Ñ 	Ô)Ø×'Ñ'Ð'Ü × 1Ñ 1°4·=±=ÓAÐAr!   r   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__annotations__r   r   r   Úpropertyr&   Ú__static_attributes__r   r!   r   r   r      sY   ‡ àÓØÓØÓØÓØÓØjÓjØ€Eˆ4ÓØ"€K�Ó"ØCG€LÐ@ÓGàôBó ôBr!   r   Fc          
     ó,   € V ^8„  d   QhRRRRRRRRR	R/# )
r   r   r   r   r   r   r   Úshort_commitr   r   r   )r   s   "r   r   r   /   s:   € ÷ ñ Øðàðð ðð ð	ð
 	ñr!   c                ó´   € V'       d?   V^ 8”  d8   V'       d   V RV 2M
\        V4      pT  RT V'       d   V'       d   R 2# R 2# V'       d
   Vf   V  R2# V # )é    z.gÚ+ú.dirtyÚ z+?)r   )r   r   r   r0   Úsuffixs   &&&& r   r$   r$   /   sf   € ÷ �H˜q”Lß2>�H�:˜R ˜~Ñ.ÄCÈÃMˆØ�˜q  ·U¿|¨Ð(TÐUÐUÐQSÐ(TÐUÐUß�Ò!Ø�˜rÐ"Ð"ØÐr!   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úrepo_dirr   Úargsr   r   r   r   )r   s   "r   r   r   =   s!   € ÷ 	?ñ 	?�tð 	? Cð 	?¨Jñ 	?r!   c                ó  €  \         P                  ! R .VORRRR^\        V 4      RR7      pTP
                  ;'       g    RP                  4       pTP                  ^ 8X  d   T'       d   T# R#   \        \         P                  3 d     R# i ; i)ÚgitTúutf-8ÚreplaceF©Úcapture_outputÚtextÚencodingÚerrorsÚtimeoutÚcwdÚcheckNr5   )Ú
subprocessÚrunr   ÚOSErrorÚSubprocessErrorÚstdoutÚstripÚ
returncode)r8   r9   ÚresultÚvalues   &*  r   Ú_run_gitrO   =   s‹   € ðÜ—’ØˆN�TˆN¨4°dÀWÐU^ÐhiÔorÐs{Óo|Øô
ˆð �]‰]× Ð ˜b×'Ñ'Ó)€EØ×%Ñ%¨Ô*¯uˆ5Ð>¸$Ð>øô ”Z×/Ñ/Ð0ô Úðús   ‚*A- Á-BÂBc               ó   € V ^8„  d   QhRR/# ©r   r   zPath | Noner   )r   s   "r   r   r   I   s   € ÷ ñ ˜;ñ r!   c                 ó  € \        \        4      P                  P                  P                  4       p V R,          P	                  4       '       d   V # ^ RIHp V! 4       R,          pVR,          P	                  4       '       d   V# R# )z=Use the executing checkout before a profile's optional clone.ú.git)Úget_process_hermes_homezhermes-agentN)r   Ú__file__ÚparentÚresolveÚexistsÚhermes_constantsrT   )r8   rT   Ú	candidates      r   Ú_resolve_repo_dirr[   I   sh   € ä”H‹~×$Ñ$×+Ñ+×3Ñ3Ó5€HØ�6Õ×!Ñ!×#Ò#Øˆõ 9á'Ó)¨NÕ:€IØ�FÕ×"Ñ"×$Ò$ØÐÙr!   c               ó    € V ^8„  d   QhRRRR/# )r   rN   r   r   r   r   )r   s   "r   r   r   X   s   € ÷ +ñ +˜jð +¨Zñ +r!   c                óh   €  \        T ;'       g    R 4      pT^ 8¼  d   T# R#   \         d     R# i ; i)r5   N)ÚintÚ
ValueError)rN   Úparseds   & r   Ú_parse_nonnegativera   X   s>   € ðÜ�U—[�[˜bÓ!ˆð ˜q”[ˆ6Ð* dÐ*øô ô Úðús   ‚" �" ¢1°1c               ó    € V ^8„  d   QhRRRR/# )r   r8   r   r   ztuple[str, int] | Noner   )r   s   "r   r   r   `   s   € ÷ ñ  dð Ð/Eñ r!   c           	     óÌ  € \        V RRRRRR4      pV'       g   R# VP                  R^4      w  r#p\        V4      p \        P                  ! \        V R	V R
24      ;'       g    R4      P                  R/ 4      pTP                  R4      pTe6   \        T\        4      '       d    \        P                  ! RT 24      '       g   R# Yu3#   \        P                   d     R# i ; i)a7  The version the nearest CalVer release shipped, and the commits since it.

Releases before semver tags existed are tagged ``vYYYY.M.D`` only; the
version users actually run is in that tag's pyproject. Without this, a
checkout past such a release would compare as "unknown" against plugins'
``requires_hermes``.
Údescribez--tagsz--longz--matchzv2[0-9][0-9][0-9].*ÚHEADNÚ-Úshowz:pyproject.tomlr5   ÚprojectÚversionÚv)rO   Úrsplitra   ÚtomllibÚloadsÚgetÚTOMLDecodeErrorÚ
isinstancer   r   Ú	fullmatch)r8   Ú	describedÚtagÚcountÚ_r   rh   ri   s   &       r   Ú_calver_release_versionrv   `   sß   € ô ˜ :¨x¸À9ÐNcÐekÓl€IßÙØ×$Ñ$ S¨!Ó,�M€C�Ü! %Ó(€HðÜ—-’-¤¨°6¸c¸UÀ/Ð;RÓ S× YÐ YÐWYÓZ×^Ñ^Ð_hÐjlÓmˆð �k‰k˜)Ó$€GØÒœz¨'´3×7Ò7¼}×?VÒ?VÐYZÐ[bÐZcÐWd×?eÒ?eÙØÐÐøô ×"Ñ"ô Úðús   ½>C
 Ã
C#Ã"C#c               ó   € V ^8„  d   QhRR/# rQ   r   )r   s   "r   r   r   y   s   € ÷ &ñ &˜[ñ &r!   c                 ó`   € ^ RI Hp Hp V ! V! 4       4      pVP                  4       '       d   V# R# )zKThe executing tree's stamp (pm.paths.install_stamp_path owns the location).)Úinstall_stamp_pathÚ	repo_rootN)Úpm.pathsry   rz   Úis_file)ry   rz   Úps      r   Ú_resolve_stamp_filer~   y   s&   € ç6á™9›;Ó'€AØ—	‘	—’ˆ1Ð% Ð%r!   c               ó   € V ^8„  d   QhRR/# )r   r   úVersionInfo | Noner   )r   s   "r   r   r   �   s   € ÷ Iñ IÐ/ñ Ir!   c                 ój  € \        4       p V f   R#  V P                  RR7      p\        P                  ! V4      p\        T\        4      '       d   RT9  d   R# TP                  R4      \        9  d&   \        RT  RRP                  \        4       R	24      hTP                  R
4      R8X  d   \        RT  R24      hTP                  R4      ;'       g    RpT'       d   \        T4      R08X  d   R# \        TP                  R4      ;'       g    R4      pTR8X  dO   T P                  R,          P                  4       '       d(   \!        T P                  RR4      pT'       d	   YS8w  d   R# TP                  R4      ;'       g    RpTP                  R4      ;'       g    TpTP                  R4      p\        T\        4      '       d   \#        T4      pTR9   d   \%        \&        R,          T4      MRp	TP                  R4      p
T
R9  d   Rp
TP                  R4      p\        T\(        4      '       g   Rp\+        TT\        T\(        4      '       d   TMRTTP                  R4      ;'       g    RT	\-        TP                  R4      4      TT
4	      #   \        \        P
                  3 d     R# i ; i) z0Read provenance from a build-time install stamp.Nz	utf-8-sig)rA   r   ÚupdateMechanismzinstall-stamp.json at z. is missing a valid 'updateMechanism' (one of z, z„). The build lane that wrote this stamp must pass --update-mechanism to scripts/write_install_stamp.py (or bake the field directly).ÚpayloadÚlightu�    marks this artifact as 'light' (no agent runtime). No Python process can legitimately run from a light artifact â€” this build is mispackaged.Ú0r   r5   r;   rS   ú	rev-parsere   ÚbaseVersionr#   ÚdisplayVersionr   Úbuildr   Ú
commitDater   r   >   Úcir;   ÚnixÚlocalÚdockerÚfallbackúcommit-build)	r‰   r�   r‹   rŽ   r�   r;   r�   rŒ   r#   >   rŒ   rŽ   údesktop-app)r~   Ú	read_textÚjsonrm   rH   ÚJSONDecodeErrorrp   Údictrn   r   ÚRuntimeErrorÚjoinÚsetr   rV   rX   rO   ra   r   r   r^   r   r   )Ú
stamp_fileÚrawÚdatar   Ústamp_sourceÚlive_commitr   r&   r   r   r   r   s               r   Ú_stamp_version_inforž   �   s~  € ä$Ó&€JØÒÙðØ×"Ñ"¨KÐ"Ó8ˆÜ�zŠz˜#‹ˆô �dœD×!Ò! X°TÔ%9Ùð ‡x�xÐ!Ó"Ô*;Ô;ÜØ$ Z Lð 1)Ø)-¯©Ô3DÓ)EÐ(Fð GKðKó
ð 	
ð ‡x�x�	Ó˜gÔ%ÜØ$ Z Lð 1<ð <ó
ð 	
ð �X‰X�hÓ×'Ð' 4€Fß”S˜“[ S EÔ)áÜ�t—x‘x Ó)×/Ð/¨RÓ0€LØ�uÔ *×"3Ñ"3°fÕ"<×!DÑ!D×!FÒ!FÜ˜z×0Ñ0°+¸vÓFˆß˜;Ô0Ùà—8‘8˜MÓ*×7Ð7¨i€LØ—h‘hÐ/Ó0×@Ð@°L€OØ�x‰x˜
Ó#€HÜ�(œC× Ò Ü% hÓ/ˆð Ð^Ô^ô 	ŒWÐjÕkÐmyÔzàð ð
 —8‘8˜NÓ+€LØÐ;Ô;Øˆà—(‘(˜<Ó(€KÜ�k¤3×'Ò'ØˆäØØÜ˜x¬×-Ò-‰°4ØØ�‰�Ó×"Ð"˜dØÜˆT�X‰X�gÓÓØØó
ð 
øôo ”T×)Ñ)Ð*ô Úðús   ’(J ÊJ2Ê1J2Úinclude_untrackedc               ó$   € V ^8„  d   QhRRRRRR/# )r   r8   r   rŸ   r   r   r   r   )r   s   "r   r   r   Ð   s!   € ÷ 7ñ 7 ð 7¸Dð 7È[ñ 7r!   c               ó  € \        V R R4      p\        V RR4      p\        V RRRR4      pRpV'       d"   VP                  4       '       d   \        V4      p . ROpV'       g   VP                  R	4       \        P
                  ! VR
R
RR^\        V 4      RR7      pVP                  ^ 8H  ;'       d.    \        VP                  ;'       g    RP                  4       4      p\        V RRRRR4      p	T	;'       g    RP                  4        U
u. uF*  p
\        P                  ! V
4      '       g   K!  V
R,          NK,  	  pp
V'       d   \!        VR R7      MRpV'       d   \#        \        V RRRV R24      4      MRpV'       g   \%        V 4      ;'       g    R w  rÍ\        V R RR4      pVR8X  d   V'       d   RT V'       d   RMR 2pM\'        WÍWŽ4      p\)        WÏWÒVRW…4      #   \        \        P                  3 d    Rp EL$i ; iu up
i )!r†   re   r   z--show-currentÚlogz-1z--format=%ctNr;   z-unoTr<   r=   Fr>   r5   rs   z--mergedz--listzv[0-9]*:é   NNc                ó–   € \         ;QJ d#    . R  V P                  R4       4       F  NK  	  5# ! R  V P                  R4       4       4      # )c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5i)N)r^   )Ú.0Úparts   & r   Ú	<genexpr>Ú6_git_version_info.<locals>.<lambda>.<locals>.<genexpr>÷   s   é € Ð-UÑDT¸D¬c°$¯i¨iÓDTùs   ‚Ú.)ÚtupleÚsplit)rN   s   &r   Ú<lambda>Ú#_git_version_info.<locals>.<lambda>÷   s4   € ¯¬Ñ-UÀEÇKÁKÐPSÔDTÓ-U¯Ð(U¨Ñ-UÀEÇKÁKÐPSÔDTÓ-UÔ(Ur!   )Úkeyr#   zrev-listz--countrj   z..HEADz	--short=7zgit.r4   )r;   z--no-optional-locksÚstatusz--porcelain)r#   N)rO   Úisdigitr^   ÚappendrF   rG   r   rL   r   rJ   rK   rH   rI   Ú
splitlinesr   rq   Úmaxra   rv   r$   r   )r8   rŸ   r   r   Úcommit_date_rawr   Ústatus_commandÚdirty_resultr   Útagsrs   Úreleasesr   r   r0   r&   s   &$              r   Ú_git_version_inforº   Ð   s  € Ü�h ¨VÓ4€Fô �h Ð*:Ó;€FÜ˜x¨°°nÀfÓM€OØ"€Kß˜?×2Ñ2×4Ò4Ü˜/Ó*ˆðò Qˆß Ø×!Ñ! &Ô)Ü!—~’~ØØØ °	ØÜ�H“Øô
ˆð ×'Ñ'¨1Ñ,×ZÐZ´°|×7JÑ7J×7PÐ7PÈb×6WÑ6WÓ6YÓ1Zˆô �H˜e Z°¸À9ÓM€Dð —J�J˜B×*Ñ*Ô,óá,ˆCÜ×"Ò" 3×'ô 	ˆˆB�ˆÙ,ð ð ÷ ô 	ˆHÑUÕVØ"ð ÷ 
ô "Ü�˜: y°A°l°^À6Ð2JÓKôàð ÷ Ü!8¸Ó!B×!WÐ!WÐFWÑˆÜ˜H k°;ÀÓG€LØ�yÔ §\Ø   ¿5©xÀbÐ.IÐJ‰ä*¨<À5ÓWˆäØ x¸ÀÈóð øô1 ”Z×/Ñ/Ð0ô Ø‹ðüòs+   ÁAG" Â0G" Ã	G" Ä
HÄ-HÇ"HÈHr€   Ú_cached_version_infoc               ó   € V ^8„  d   QhRR/# )r   r   ÚNoner   )r   s   "r   r   r     s   € ÷  ñ   4ñ  r!   c                 ó
   € Rs R# )zTest-only cache reset.N)r»   r   r!   r   Ú_reset_version_info_cacher¿     s
   € ð  Òr!   c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   r     s   € ÷ ñ ˜+ñ r!   c                 óÄ   € \         e   \         #  \        4       p V f   \        4       pVe   \	        V4      p V f   \        RRRRRR4      p V s V #   \         d    Rp  LDi ; i)z=Return cached provenance from install stamp, git, or unknown.Nr#   )r»   rž   r–   r[   rº   r   )Úinfor8   s     r   Úget_version_inforÃ     sx   € ô Ò'Ü#Ð#ðÜ"Ó$ˆð
 ‚|Ü$Ó&ˆØÒÜ$ XÓ.ˆDð ‚|Ü˜9 i°°t¸TÀ9ÓMˆàÐØ€Køô ô ØŠðús   �
A ÁAÁAc               ó    € V ^8„  d   QhRRRR/# )r   Úrefreshr   r   r•   r   )r   s   "r   r   r   4  s   € ÷ ñ ˜tð °ñ r!   c           
     óÜ   € V '       d   Rs \        4       pRVP                  RVP                  '       d   VP                  R,          MRRVP                  RVP                  RVP
                  /# )u‡  Return the running install's code identity as a flat dict.

Shape: ``{"sha": full sha | None, "short_sha": str | None, "version":
base package version | None, "source": str, "commit_date": epoch s | None}`` â€” what the update
receipt, runtime inventory, and gateway status stamping consume.
Backed by :func:`get_version_info` (install stamp first, live git
second, unknown third), so every consumer shares one resolution
policy. Returned dicts are fresh copies, never the shared cache.

``refresh=True`` drops the per-process cache first â€” the updater uses
it to re-read identity after swapping the checkout out from under the
running process.
NÚshaÚ	short_sha:Né   Nri   r   r   )r»   rÃ   r   r   r   r   )rÅ   rÂ   s   & r   Úget_code_identityrÊ   4  s^   € ÷ Ø#ÐÜÓ€Dàˆt�{‰{Ø¨¯¯¨�T—[‘[ –_¸Ø�4×$Ñ$Ø�$—+‘+Ø�t×'Ñ'ðð r!   )FN)F) Ú__conditional_annotations__Ú__doc__Ú
__future__r   r“   rF   rl   Údataclassesr   Úpathlibr   Útypingr   r   Úhermes_cli.stewardr   Úhermes_cli.update_channelr   r   r$   rO   r[   ra   rv   r~   rž   rº   r»   r,   r¿   rÃ   rÊ   )rË   s   @r   Ú<module>rÓ      s�   øðô	õ #ã Û Û Ý !Ý ß  å 0Ý 3ñ �$Ô÷Bð Bó ðB÷*õ	?õõ+õõ2&õIð^7À5÷ 7ðx ,0Ð Ð(Ó /õ õ÷>ñ r!   