+
    jHàjv  ã                  ó  a € 0 t $ R t^ RIHt ^ RIt^ RIHt ^ RIHt ^ RI	H
t
Ht ^ RIHtHtHtHt ]P"                  ! ]4      tRtR R	 lt]! R
R7       ! R R4      4       tRR R llt]R]R]R/tR]R&   R R ltR R ltR R ltR# )a  Image-managed install refusal contract.

A refusal prints the real update command for the deployment kind, records a
``refused`` receipt (so fleet tooling sees "this install cannot self-update,
use <command>" instead of a silent non-update), and exits 2 on CLI surfaces.
)ÚannotationsN)Ú	dataclass)ÚPath)ÚCallableÚOptional)ÚSTEWARD_APT_TERMUXÚSTEWARD_DESKTOPÚSTEWARD_DOCKERÚSTEWARD_NIXzUThis build doesn't get updates. Ask the developer who gave it to you for a new build.c               ó    € V ^8„  d   QhRRRR/# )é   Úproject_rootr   ÚreturnÚbool© )Úformats   "Ú?/home/ubuntu/.hermes/hermes-agent/hermes_cli/update_contract.pyÚ__annotate__r      s   € ÷ Lñ L $ð L¨4ñ Ló    c                óB   € ^ RI Hp V! V 4      P                  R4      R8H  # )é    )Úread_install_stampÚsourceúcommit-build)Úhermes_cli.stewardr   Úget)r   r   s   & r   Úis_commit_buildr      s    € Ý5á˜lÓ+×/Ñ/°Ó9¸^ÑKÐKr   T)Úfrozenc                  ó:   € ] tR t^t$ RtR]R&   R]R&   R]R&   RtR# )ÚUpdateRefusalz;Why an in-place update is refused, and what to run instead.ÚstrÚcodeÚmessageÚupdate_commandr   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__Ú__static_attributes__r   r   r   r   r      s   ‡ áEà
ƒIØƒLØ×r   r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r!   r    Úmethodr"   zOptional[Callable[[str], str]]r   r   r   )r   s   "r   r   r   '   s0   € ÷ 	Jñ 	J�3ð 	J ð 	JÐ.Lð 	JÐXeñ 	Jr   c                óv   € ^ RI HpHp V! V4      pVe
   V! V4      pMVR8X  d   V! 4       MTp\        WVR7      # )zeRefusal for ``method``: ``message(command)`` if given, else docker's full message / the bare command.)Úformat_docker_update_messageÚ%recommended_update_command_for_methodÚdocker©r!   r"   r#   )Úhermes_cli.configr.   r/   r   )r!   r,   r"   r.   r/   ÚcommandÚtexts   &&&    r   Ú_refusalr5   '   s>   € çeá3°FÓ;€GØÒÙ�wÓ‰à17¸8Ô1CÑ+Ô-ÈˆÜ˜dÀÔIÐIr   r0   ÚnixÚaptzdict[str, str]Ú_STEWARD_UPDATE_METHODSc               ó    € V ^8„  d   QhRRRR/# )r   Ústewardr    r   r   r   )r   s   "r   r   r   =   s   € ÷ hñ h˜cð h mñ hr   c                óÚ   a a€ ^ RI Ho \        P                  S 4      pVR8X  d   \	        S V4      # Ve   \	        S VV V3R l4      # S \
        8X  d   RMRS  2p\        S S! S 4      VR7      # )z)Refusal for a tree sealed by ``steward``.)Ústeward_update_messager0   c                ó   <€ S! S4      # ©Nr   )Ú_commandr:   r<   s   &€€r   Ú<lambda>Ú"_steward_refusal.<locals>.<lambda>E   s   ø€ Ñ:PÐQXÔ:Yr   z*Manage updates from within the desktop appzupdate via r1   )r   r<   r8   r   r5   r   r   )r:   r,   r3   r<   s   f  @r   Ú_steward_refusalrB   =   sw   ù€ å9ä$×(Ñ(¨Ó1€FØ�ÔÜ˜ Ó(Ð(ØÒÜ˜ Õ)YÓZÐZð ”oÔ%ñ 	5à˜7˜)Ð$ð ô
 ˜gÑ/EÀgÓ/NÐ_fÔgÐgr   c               ó    € V ^8„  d   QhRRRR/# )r   r   r   r   zOptional[UpdateRefusal]r   )r   s   "r   r   r   R   s   € ÷ @ñ @¨Dð @Ð5Lñ @r   c                óH  a€ \        V 4      '       d   \        R\        R4      #  ^ RIHp V! 4       oSe:   SP
                  '       g   \        RRV3R l4      # \        RSP                  4      #   ^ R
IHp V! V 4      pVf/   ^ RIHp V! 4       '       d   ^ RIHpHp \        \"        VVR7      # MVR8w  d   \%        V4      #   ^ RIHpHp	 V! V 4      p
V
R8X  d   \        RV
4      # V	! V
4      '       g   V
R8X  d   \        V
R8X  d   Wª4      # RV
4      #  R#   \         d!   p\        P                  R	T4        Rp?LÏRp?ii ; i  \         d!   p\        P                  RT4        Rp?L©Rp?ii ; i  \         d"   p\        P                  RT4        Rp?R# Rp?ii ; i)z÷Return an :class:`UpdateRefusal` when in-place update must not run.

``None`` means the install is eligible for in-place update (git checkout or unknown-but-
mutable). Never raises; on any internal error it falls back to the heuristic layer only.
r   Ú )Úread_image_provenanceNzimage-marker-invalidr0   c                ó(   <€ R SP                    RV  2# )uI   âœ— This install is image-managed, but its provenance marker is invalid (zE).
  In-place update is disabled. Update by pulling a new image:
    )Úerror)r3   Ú
provenances   &€r   r@   Ú+evaluate_update_admission.<locals>.<lambda>d   s#   ø€ ð*Ø*4×*:Ñ*:Ð);ð <'à'. iñ1r   zimage-markerz4Image provenance check failed (using heuristics): %s)Úsealed_steward)Ú	is_termux)ÚSOURCE_ON_TERMUX_UPDATE_COMMANDÚSOURCE_ON_TERMUX_UPDATE_MESSAGEr1   Úunknownz"Steward admission check failed: %s)Údetect_install_methodÚis_nix_install_methodr7   r6   z)Install-method admission check failed: %s)r   r   ÚCOMMIT_BUILD_UPDATE_MESSAGEÚhermes_cli.image_provenancerF   Úvalidr5   ÚmanagerÚ	ExceptionÚloggerÚdebugr   rK   Úhermes_constantsrL   rM   rN   r   rB   r2   rP   rQ   )r   rF   ÚexcrK   r:   rL   rM   rN   rP   rQ   r,   rI   s   &          @r   Úevaluate_update_admissionr[   R   s£  ø€ ô �|×$Ò$Ü˜^Ô-HÈ"ÓMÐMðRÝEá*Ó,ˆ
ØÒ!Ø×#×#Ð#ô  Ð 6¸ô Có ð ô ˜N¨J×,>Ñ,>Ó?Ð?ð "ð&@Ý5á  Ó.ˆØŠ?Ý2á�{Š{ßoä$Ü+Ø;Ø#Bôð ð ð ˜	Ô!Ü# GÓ,Ð,ð "ð	GßRá& |Ó4ˆØ�XÔÜ˜H fÓ-Ð-Ù  ×(Ò(¨F°e¬OÜ f°¤o˜FÓIÐI¸5À&ÓIÐIð -<ñ øôO ô RÜ�‰ÐKÈS×QÑQûðRûô2 ô @Ü�‰Ð9¸3×?Ñ?ûð@ûô ô GÜ�‰Ð@À#×FÐFÙûðGúsq   ¥"D ÁD ÁD Á1$E ÂE Â1E Ã"E5 Ã(E5 Ã6E5 ÄE5 ÄEÄ$D?Ä?EÅE2ÅE-Å-E2Å5F!Æ FÆF!c               ó    € V ^8„  d   QhRRRR/# )r   Úrefusalr   r   ÚNoner   )r   s   "r   r   r   •   s   € ÷ Bñ B Mð B°dñ Br   c                óP  €  ^ RI HpHpHp V! 4        RV P                   R2pY@P
                  '       d   RV P
                   2MRV P                   2,          pV! RRV4       V! RV P                  R	7       R#   \         d"   p\        P                  R
T4        Rp?R# Rp?ii ; i)zóWrite a minimal ``refused`` receipt for a blocked update attempt.

Gives fleet tooling a durable record that an update was ATTEMPTED and refused ("not updatable in
place, use <command>") instead of a silent nothing. Best-effort; never raises.
)Úbegin_update_receiptÚfinalize_update_receiptÚrecord_stepznot updatable in place (Ú)z; use: z; Ú	admissionFÚrefused)Ústop_reasonz$Could not record refusal receipt: %sN)
Úhermes_cli.update_receiptr`   ra   rb   r!   r#   r"   rV   rW   rX   )r]   r`   ra   rb   ÚdetailrZ   s   &     r   Úrecord_refusal_receiptri   •   s—   € ð	BßhÑháÔØ+¨G¯L©L¨>¸Ð;ˆØ×8N×8NÐ8N�G˜G×2Ñ2Ð3Ñ4ÐVXÐY`×YhÑYhÐXiÐTjÕjˆÙ�K ¨Ô/Ù 	°w·|±|×DøÜô BÜ�‰Ð;¸S×AÒAûðBús   ‚A5A9 Á9B%ÂB Â B%r>   )Ú__conditional_annotations__r(   Ú
__future__r   ÚloggingÚdataclassesr   Úpathlibr   Útypingr   r   r   r   r   r	   r
   Ú	getLoggerr$   rW   rR   r   r   r5   r8   r)   rB   r[   ri   )rj   s   @r   Ú<module>rq      sš   øðôõ #ã Ý !Ý ß %ç _Ó _à	×	Ò	˜8Ó	$€ð \ð õ
Lñ �$Ô÷ð ó ð÷	Jð  �HØ�Ø˜ð+Ð ˜ó õhõ*@÷FBr   