+
    jHàj|¾  ã                   ó¼  € R t ^ RIt^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RI	H
t
 ^ RIHt ^ RIHt ^ RIHt ]P"                  ! R4      tR R	 lt^tRftR
RRR/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 ltR R ltR R ltRgR  R! llt R"R/R# R$ llt!R% R& lt"R' R( lt#R) R* lt$R+ R, lt%R- t&R. R/ lt'R0 R1 lt(R2 R3 lt)R4 R5 lt*R6 R7 lt+R8 R9 lt,R: R; lt-R< R= lt.R> R? lt/R@R@RAR@RBR@RCR@RDRDRERDRFRDRGRG/t0RH RI lt1RJ RK lt2RL RM lt3RN RO lt4RP RQ lt5RR RS lt6RT RU lt7RV RW lt8RX RY lt9RZ R[ lt:R\ R] lt;R^ R_ lt<R` Ra lt=RbRRcR/Rd Re llt>R# )ha‡  Post-update maintenance for ``hermes update``: pre-update backup snapshot, state-db verify/restore, curator/FTS notices, FHS path guard, completion summary.

Split out of ``update_cmd.py``, which re-imports every name so ``hermes_cli.update_cmd.<name>``
still resolves/monkeypatches. Origin helpers are imported lazily per function (no cycle;
test patches on ``update_cmd`` stay effective).
N)Úsuppress)ÚPath)ÚOptional)Ú_best_effort)ÚUTCzhermes_cli.update_cmdc                ó4   € V ^8„  d   QhR\         R\        RR/# )é   Úproject_rootÚdesktopÚreturnN©r   Úbool)Úformats   "Ú@/home/ubuntu/.hermes/hermes-agent/hermes_cli/update_cmd_maint.pyÚ__annotate__r      s!   € ÷ 'ñ '¬Dð '¼dð 'Àtñ 'ó    c               ó$   € ^ RI Hp V! RR7       R# )zHHistorical updater hook: never complete inside the pre-swap interpreter.©Ústop_for_relaunchT©Ú
incompleteN©Úhermes_cli._old_updaterr   )r	   r
   r   s   &$ r   Ú_prepare_updated_checkoutr      ó   € å9Ù ×&r   Tz;iex (irm https://hermes-agent.nousresearch.com/install.ps1)FzBcurl -fsSL https://hermes-agent.nousresearch.com/install.sh | bashc                óF   € V ^8„  d   QhR\         R\        \         ,          /# )r   Úsqlite_versionr   )ÚstrÚlist)r   s   "r   r   r   ,   s   € ÷ 
ñ 
´Sð 
¼TÄ#½Yñ 
r   c                ót   € ^ RI Hp RV  R2R\        \        V! 4       P	                  4       4      ,           R2.# )uÈ   Shared ``âš  Update partially complete`` wording for a vulnerable post-update SQLite, so the
two completion banners cannot drift. The lead names the consequence, the second line the
exact fix command.©Ú_mu8   âš  Update partially complete â€” your Python's SQLite (zJ) has a known corruption bug. Hermes works, but sessions could be damaged.z   Fix: run the installer again (zD) which installs a safe Python, then run `hermes doctor` to confirm.)Úhermes_cli.update_cmdr!   Ú_REINSTALL_ONE_LINERr   Ú_is_windows)r   r!   s   & r   Ú _sqlite_partial_completion_linesr%   ,   sQ   € õ )à
BÀ>ÐBRð SGð 	Gà
*Ô+?ÄÁRÃT×EUÑEUÓEWÓ@XÕ+YÐ*Zð [Mð 	Mðð r   c                ó$   € V ^8„  d   QhR\         /# ©r   r   )Údict)r   s   "r   r   r   9   s   € ÷ 8ñ 8œ4ñ 8r   c                 ó¸   € ^ RI Hp  V ! 4       ;'       g    / p\        V\        4      '       d   VP	                  R/ 4      M/ p\        V\        4      '       d   V# / # )z:``updates`` section of config.yaml; ``{}`` on any failure.©Úload_configÚupdates)Úhermes_cli.configr+   Ú
isinstancer(   Úget)r+   Úcfgr,   s      r   Ú_load_updates_cfgr1   9   sI   € å-Ù
‹-×
Ð
˜2€CÜ(2°3¼×(=Ò(=ˆc�g‰g�i Ô$À2€GÜ  ¬$×/Ò/ˆ7Ð7°RÐ7r   c                ó   € V ^8„  d   QhRR/# ©r   r   N© )r   s   "r   r   r   A   s   € ÷ 'ñ ' Tñ 'r   c                 ó$   € ^ RI Hp  V ! RR7       R# )zHHistorical updater hook; module-graph surgery cannot complete an update.r   Tr   Nr   r   s    r   Ú_purge_stale_hermes_modulesr6   A   r   r   c                ó   € V ^8„  d   QhRR/# r3   r4   )r   s   "r   r   r   G   s   € ÷ ñ ¨ñ r   c                  ó    € ^ RI Hp  V ! 4        R# )é    r   Nr   r   s    r   Ú_reload_updated_runtime_modulesr:   G   ó   € å9áÖr   c                ó   € V ^8„  d   QhRR/# r3   r4   )r   s   "r   r   r   N   s   € ÷ dñ d¨ñ dr   c                 ó²  €  ^ RI Hp  V P                  4       '       g   R# V P                  4       pTP                  R4      '       d   R#  T P                  4       p\        ^T^,          4      p\        4        \        R4       \        RT R24       \        R4       \        R4       \        R	4       R#   \         d     R# i ; i  \         d    ^¨p L{i ; i)
uÛ   Curator heads-up after update. Fires only when enabled AND never run â€” the window where
the first pass (deferred one ``interval_hours``) is pending, so the user can preview or
disable it first. Silent on steady state.©ÚcuratorNÚlast_run_atu   â„¹ Skill curatorzC  Background skill maintenance is enabled. First pass is deferred ~zwd after installation; only agent-created skills are in scope and nothing is ever auto-deleted (archive is recoverable).z,  Preview now:  hermes curator run --dry-runz$  Pause it:     hermes curator pausezV  Docs:         https://hermes-agent.nousresearch.com/docs/user-guide/features/curator)	Úagentr?   Ú
is_enabledÚ
load_stateÚ	Exceptionr/   Úget_interval_hoursÚmaxÚprint)r?   ÚstateÚhoursÚdayss       r   Ú_print_curator_first_run_noticerK   N   sÕ   € ðÝ!Ø×!Ñ!×#Ò#ÙØ×"Ñ"Ó$ˆð ‡y�y�×ÒÙðØ×*Ñ*Ó,ˆô ˆq�%˜2•+Ó€DÜ	„GÜ	Ð
ÔÜ	ðØˆ6ð Kð	Lôô
 
Ð
8Ô9Ü	Ð
0Ô1Ü	Ð
bÖcøô% ô Úðûô ô ØŠðús(   ‚B4  B4 Á
C Â4CÃCÃCÃCc                ó   € V ^8„  d   QhRR/# r3   r4   )r   s   "r   r   r   l   s   € ÷ jñ j¨dñ jr   c            	     óx  €  ^ RI Hp  \        V ! 4       ;'       g    / P                  R4      ;'       g    / P                  RR4      4      P	                  4       P                  4       pVR8X  d   R#  ^ RIHp ^ RI	H
p T! 4       R	,          pTP                  4       '       g   R#  TP                  4       P                  R$,          pTR
8  d   R# RpRp. p T! TRR7      p^ RIHp	 T	! TP"                  4      pTP%                  TP"                  4      p\'        TP"                  P)                  R4      P+                  4       ;'       g[    TP"                  P)                  R4      P+                  4       ;'       g*    TP"                  P)                  R4      P+                  4       4      p
 Te2   \-        \        4      ;_uu_ 4        TP/                  4        RRR4       M T'       g   T
'       g   R# T
'       d.   \1        4        \1        R4       \1        R4       \1        R4       R# \1        4        T'       dQ   TR,          pTR8X  d!   \1        R4       \1        RTR RTR R24       MI\1        R4       \1        RTR RTR R24       M)TR8X  d   \1        R4       M\1        R 4       \1        R!4       \1        R"4       \1        R#4       R#   \         d    Rp ELpi ; i  \         d     R# i ; i  \         d     R# i ; i  \         dO     TeG   \-        \        4      ;_uu_ 4        TP/                  4        RRR4       R#   + '       g   i     R# ; iR# i ; i  + '       g   i     EL�; i  TeE   \-        \        4      ;_uu_ 4        TP/                  4        RRR4       i   + '       g   i     i ; ii ; i)%z Advertise the opt-in FTS storage rebuild when state.db still needs one.

``sessions.fts_optimize_notice``: ``advise`` (default), ``require`` (firmer), ``off``.
r*   ÚsessionsÚfts_optimize_noticeÚadviseÚoffN©Úget_hermes_home)Ú	SessionDBústate.dbg      à?FT)Údb_pathÚ	read_only)Úfts_layout_driftzESELECT 1 FROM state_meta WHERE key = 'fts_rebuild_high_water' LIMIT 1zfSELECT 1 FROM sqlite_master WHERE type = 'table' AND name LIKE 'fts\_v22\_trash\_%' ESCAPE '\' LIMIT 1z]SELECT 1 FROM state_meta WHERE key IN ('fts_cjk_rebuild_high_water', 'fts_cjk_stale') LIMIT 1u,   â—† Session database optimization incompletez‘  A previous `hermes sessions optimize-storage` run was interrupted. Search still works; re-run the command to resume and finish reclaiming disk:z$    hermes sessions optimize-storageg333333ã?Úrequireu%   â—† Session database upgrade requiredu|     Your search index uses the OLD storage layout and should be upgraded. The new layout typically frees ~60% of state.db (â‰ˆú.1fz GB of your current z5 GB) and is required for continued optimal operation.u.   â—† Reclaim ~60% of your session database diskui     Your search index uses the old storage layout. Upgrading it typically frees ~60% of state.db â€” about z GB.u7   â—† Search index rebuild required by your notice policyu!   â—† Search index update availablez§  Your search index is on the compact layout from an earlier optimization, but a later release changed it. Running the command again rebuilds it in the current layout.z8  Run when convenient:  hermes sessions optimize-storagezs  It runs in the foreground with a progress bar, is safe to interrupt/re-run, and never changes your conversations.é   @)r-   r+   r   r/   ÚstripÚlowerrD   Úhermes_constantsrS   Úhermes_staterT   ÚexistsÚstatÚst_sizeÚOSErrorÚhermes_state_ftsrX   Ú_connÚ_db_has_legacy_inline_ftsr   ÚexecuteÚfetchoner   ÚcloserG   )r+   ÚmoderS   rT   rV   Úsize_gbÚdbÚlegacy_inlineÚdriftrX   ÚinterruptedÚest_reclaims               r   Ú$_print_fts_optimize_available_noticerq   l   sR  € ð
Ý1Ü‘[“]×(Ð( b×-Ñ-¨jÓ9×?Ð?¸R×DÑDÐEZÐ\dÓeÓf×lÑlÓn×tÑtÓvˆð ˆu„}ÙðÝ4Ý*ñ Ó *Õ,€GØ�>‰>×ÒÙðØ—,‘,“.×(Ñ(¨IÕ6ˆð �„}ÙØ	€BØ€MØ€EðÙ˜w°$Ô7ˆå5Ù  §¡Ó*ˆØ×4Ñ4°R·X±XÓ>ˆô Ø�H‰H×Ñð?ó÷ ‰h‹j÷ð ð �x‰x×ÑðLó÷ ‰h‹j÷ð ð �x‰x×ÑðJó÷ ‰h‹jó
‰ð" Š>Üœ)×$Õ$Ø—‘”
÷ %Ð$ð ÷ ŸÙçÜŒÜÐ<Ô=Üð*ô	
ô
 	Ð4Ô5Ùä	„Gßà •mˆØ�9ÔÜÐ9Ô:Üðà" 3Ð'Ð';¸GÀC¸=ð I<ð=õô ÐBÔCÜð>Ø>IÈ#Ð=Nð O#Ø#*¨3 -¨tð5õð �9ÔÜÐKÕLäÐ5Ô6Üð?ô	
ô
 
Ð
DÔEÜ	ð	Böøô ô Ø‹ðûô ô Úðûô ô Úðûô< ô ØàŠ>Üœ)×$Õ$Ø—‘”
÷ %×$×$Ò$úñ ðú÷ %×$Ð$ûð Š>Üœ)×$Õ$Ø—‘”
÷ %×$×$Ð$úð úsš   ‚K ›K ´3K Á1K Â$!K- ÃB"K? Å8.K? ÇMËKËKËK*Ë)K*Ë-K<Ë;K<Ë?MÌ
M/ Ì&MÍM	ÍMÍM/ ÍM,	Í/N9ÎN%	Î	N9Î%N5Î0	N9c                ó   € V ^8„  d   QhRR/# r3   r4   )r   s   "r   r   r   Ù   s   € ÷ "ñ "¨$ñ "r   c                 óJ  €  ^ RI Hp  V P                  4       pTP	                  R4      pT'       g   R# TP	                  R4      T8X  d   R# TP	                  R4      ;'       g    RpT'       g   R# RT9   dR   \        4        \        R\        T4       24       TP                  4        F  p\        R	T 24       K  	  \        R
4       \        \        4      ;_uu_ 4        Y!R&   T P                  T4       RRR4       R#   \         d     R# i ; i  + '       g   i     R# ; i)z£Print the latest background curator run summary (rename map) once, stamping
``last_run_summary_shown_at``. Silent when never run, already shown, or no rename info.r>   Nr@   Úlast_run_summary_shown_atÚlast_run_summaryÚ Ú
u   â„¹ Skill curator â€” last run ú  zP  (This message shows once per curator run. View anytime: hermes curator status))
rA   r?   rC   rD   r/   rG   Ú_format_time_agoÚ
splitlinesr   Ú
save_state)r?   rH   r@   ÚsummaryÚlines        r   Ú _print_curator_recent_run_noticer~   Ù   sù   € ðÝ!Ø×"Ñ"Ó$ˆð —)‘)˜MÓ*€KßÙØ‡y�yÐ,Ó-°Ô<ÙØ�i‰iÐ*Ó+×1Ð1¨r€GßÙð ˆw„ÜŒÜÐ/Ô0@ÀÓ0MÐ/NÐOÔPØ×&Ñ&Ö(ˆDÜ�B�t�f�+Öñ )äÐ`Ôaä	”)×	Õ	Ø-8Ð)Ñ*Ø×Ñ˜5Ô!÷ 
Ñ	øô) ô Úðú÷( 
×	Ð	ús   ‚C? ÃDÃ?DÄDÄD"	c                ó0   € V ^8„  d   QhR\         R\         /# )r   Úiso_tsr   ©r   )r   s   "r   r   r   ø   s   € ÷ ñ œSð ¤Sñ r   c                ó~  €  ^ RI H pHp VP                  V 4      pVP                  f   VP	                  \
        R7      p\        VP                  \
        4      V,
          P                  4       4      pV^<8  d   R# VR8  d   V^<,           R2# VR8  d   VR,           R2# VR,           R2#   \         d     R	# i ; i)
zGRender an ISO timestamp as `Xh ago` / `Xd ago` / `Xm ago`. Best effort.)ÚdatetimeÚtimezone)Útzinfozjust nowi  zm agoi€Q zh agozd agoÚrecently)
rƒ   r„   Úfromisoformatr…   Úreplacer   ÚintÚnowÚtotal_secondsrD   )r€   rƒ   r„   ÚtsÚsecss   &    r   ry   ry   ø   s²   € ðß/Ø×#Ñ# FÓ+ˆØ�9‰9ÒØ—‘¤3�Ó'ˆBÜ�H—L‘L¤Ó%¨Õ*×9Ñ9Ó;Ó<ˆØ�"Œ9ÙØ�$Œ;Ø˜b•j�\ Ð'Ð'Ø�%Œ<Ø˜d•l�^ 5Ð)Ð)Ø˜%•-� Ð&Ð&øÜô Úðús$   ‚A7B- Á;B- ÂB- Â!B- Â-B<Â;B<c                ó   € V ^8„  d   QhRR/# r3   r4   )r   s   "r   r   r     s   € ÷ 'ñ ' dñ 'r   c                 ó$   € ^ RI Hp  V ! RR7       R# )zGHistorical updater hook; scans now run only in fresh completion Python.r   Tr   Nr   r   s    r   Ú_reload_process_scan_modulesr�     r   r   c                ón   € V ^8„  d   QhR\         \        ,          R\        \        ,          R,          RR/# )r   Únode_failuresÚalready_restarted_unitsNr   )r   r   Úset)r   s   "r   r   r     s0   € ÷ ñ Üœ•9ðÜ7:¼3µxÀ$µðà	ñr   c                ó    € ^ RI Hp V! 4        R# )zHHistorical updater hook; do not continue a pre-PM update after the swap.r   Nr   )r’   r“   r   s   && r   Ú _finish_dashboard_update_cleanupr–     s   € õ :áÖr   r“   c                ój   € V ^8„  d   QhR\         \        ,          R,          R\         \        ,          /# )r   r“   Nr   )r”   r   r‰   )r   s   "r   r   r     s)   € ÷ &ñ &ÄÄCÅÈ4Åð &Ô[^Ô_bÕ[cñ &r   c                ó\  € ^ RI HpHp ^ RIHp  V! 4       P                  RV \        V! 4       4      R7      pTP                  R4      ;'       g    R Uu0 uF  p\        T4      kK  	  ppT'       g   T# \        4        \        R4       \        R4       \        R4       T#   \         d{   p\        P                  RT4       T! RR\        T4      P                   RT 24       \        4        \        R	T 24       \        R
4       \        R4       \        4       u Rp?# Rp?ii ; iu upi )aÎ  Refresh managed dashboards or stop stale manual ones after an update; returns the PIDs it
stopped and could not bring back, so the receipt records them ``failed`` (#109290).

*already_restarted_units*: systemd unit names (no ``.service``) the fleet-restart loop
already handled (restarted, declined, or failed; each already reported), so a Serve-only
install isn't restarted a second time here and a declined or failed unit isn't retried (#141021).

See #83595.
)r!   Ú_record_update_steprR   T)Úrestart_managedr“   Ú
scope_homez(Post-update dashboard cleanup failed: %sÚdashboard_cleanupFú: u;   âš  Could not refresh running dashboard/serve process(es): zD  If one is still running, restart it so it serves the updated code:zT    hermes dashboard --port <port>   (or: systemctl --user restart hermes-dashboard)NÚunrecoveredu\   âš  A web dashboard/serve process was stopped during update and could not be auto-restarted.z-  Re-launch it when you want the web UI back:z"    hermes dashboard --port <port>r4   )r"   r!   r™   r^   rS   Ú_kill_stale_dashboard_processesr   rD   ÚloggerÚwarningÚtypeÚ__name__rG   r”   r/   r‰   )r“   r!   r™   rS   Ústop_resultÚexcÚpidrž   s   $       r   Ú_refresh_dashboard_after_updater§     s  € ÷ >Ý0ðÙ“d×:Ñ:Ø Ð:QÜ™?Ó,Ó-ð ;ó 
ˆð  (3§¡°}Ó'E×'KÐ'KÈÐ'KÓLÑ'K ”3�s–8Ñ'K€KÐLßØÐä	„GÜ	Ð
hÔiÜ	Ð
9Ô:Ü	Ð
.Ô/ØÐøô) ô ô
 	�‰ÐAÀ3ÔGÙÐ/°¼4À»9×;MÑ;MÐ:NÈbÐQTÐPUÐ8VÔWÜŒÜÐKÈCÈ5ÐQÔRÜÐTÔUÜÐdÔeÜ‹u�ûðüò Ms$   �'B! ÁD)Â!D&Â,A/D!ÄD&Ä!D&c                ó(   € V ^8„  d   QhR\         RR/# )r   Úmessager   Nr�   )r   s   "r   r   r   C  s   € ÷ 
>ñ 
>¤cð 
>¨dñ 
>r   c                ó4  € ^ RI Hp \        V  V! 4        24       \        P                  P                  RR4      p\        V4      ^ 8X  dN   \        ;QJ d    R V 4       F  '       d   K   RM	  RM! R V 4       4      '       d   \        RV R24       R	# R	# R	# )
z¹Print the outcome (with branch @ sha so drift is visible) plus, when launched by the
dashboard with an action id, a receipt line the Desktop matches after restart.

See #47359, #58764.
)Ú_branch_head_suffixÚHERMES_ACTION_IDrv   c              3   ó*   "  € T F	  qR 9   x € K  	  R# 5i)Ú0123456789abcdefNr4   )Ú.0Úchars   & r   Ú	<genexpr>Ú+_print_update_completion.<locals>.<genexpr>L  s   é € Ð#UÉ9À4Ð,>Ö$>Ë9ùs   ‚FTz=== hermes-update completed z ===N)r"   r«   rG   ÚosÚenvironr/   ÚlenÚall)r©   r«   Ú	action_ids   &  r   Ú_print_update_completionr¸   C  sy   € õ :Ü	ˆWˆIÑ)Ó+Ð,Ð
-Ô.Ü—
‘
—‘Ð1°2Ó6€IÜ
ˆ9ƒ~˜Ô§£Ñ#UÉ9Ó#U§§¢Ñ#UÉ9Ó#U× UÒ UÜÐ,¨Y¨K°tÐ<Ö=ñ !VÑr   c                ó2   € V ^8„  d   QhR\         R,          /# r3   r�   )r   s   "r   r   r   P  s   € ÷ 
ñ 
œs T�zñ 
r   c                 óR  € ^ RI Hp   ^ RIp\        V ! 4       P                  R,          R4      ;_uu_ 4       pVP                  V4      P                  R/ 4      P                  R4      pRRR4       X'       d   \        V4      # R#   + '       g   i     L%; i  \         d     R# i ; i)u¬   ``version`` from the checkout's pyproject.toml (not importlib.metadata, which still
describes the OLD version after a pull). None on any failure â€” cosmetic, never breaks.r    Nzpyproject.tomlÚrbÚprojectÚversion)	r"   r!   ÚtomllibÚopenÚPROJECT_ROOTÚloadr/   r   rD   )r!   r¾   Úfhr½   s       r   Ú_read_project_versionrÃ   P  s„   € õ )ðÛÜ‘"“$×#Ñ#Ð&6Õ6¸×=Ô=ÀØ—l‘l 2Ó&×*Ñ*¨9°bÓ9×=Ñ=¸iÓHˆG÷ >ç&Œs�7‹|Ð0¨DÐ0÷ >×=ûô ô Úðús4   ˆ.B ¶1BÁ'B Á7
B ÂB ÂB	ÂB ÂB&Â%B&c                ó2   € V ^8„  d   QhR\         R,          /# r3   r�   )r   s   "r   r   r   ]  s   € ÷ 	9ñ 	9œ3 �:ñ 	9r   c                 óž   € ^ RI Hp  ^ RIHp V! \	        V ! 4       P
                  4      RR7      pVP                  '       d   VP                  # R# )zÑThe checkout's runtime identity, computed exactly as ``write_source_stamp`` publishes it.

pyproject.toml is an inert 0.0.0 on source checkouts; the release a checkout
runs is derived from its reachable tags.
r    )Ú_git_version_infoT)Úinclude_untrackedN)r"   r!   Úhermes_cli.version_inforÆ   r   rÀ   ÚcommitÚderived_version)r!   rÆ   Úinfos      r   Ú_checkout_versionrÌ   ]  s<   € õ )Ý9ÙœT¡"£$×"3Ñ"3Ó4ÈÔM€DØ#'§;§; ;ˆ4×ÑÐ8°DÐ8r   c                ó>   € V ^8„  d   QhR\         R,          R\         /# )r   Úpre_versionNr   r�   )r   s   "r   r   r   i  s   € ÷ "ñ "¬#°­*ð "¼ñ "r   c                ó¤   € R R lp\        4       pV '       d$   V'       d   W8w  d   RV! V 4       RV! V4       R2# V'       d   RV! V4       R2# R# )ut  Completion line with ``vA â†’ vB`` when known; plain when either side is unknown or
the version did not change.

Ported from PrimeIntellect-ai/prime-agent#630: after a successful self-update, show both versions
(``v0.19.4 â†’ v0.20.0``) so the user can see what they actually got. Falls back to the plain message when
either side is unknown or the version did not change.
c                ó0   € V ^8„  d   QhR\         R\         /# )r   r½   r   r�   )r   s   "r   r   Ú._update_complete_message.<locals>.__annotate__q  s   € ÷ Cñ C”sð Cœsñ Cr   c                 óJ   € V R ,          P                  4       '       d   RV  2# T # ):Né   NÚv)Úisdigit)r½   s   &r   ÚshownÚ'_update_complete_message.<locals>.shownq  s%   € à '¨¥× 3Ñ 3× 5Ò 5��7�)ˆ}ÐB¸7ÐBr   u   âœ“ Update complete! (u    â†’ Ú)u   âœ“ Update complete!)rÌ   )rÎ   rÖ   Úpost_versions   &  r   Ú_update_complete_messagerÚ   i  sY   € õCô %Ó&€Lß—|¨Ô(CØ'©¨kÓ(:Ð';¸5ÁÀ|ÓATÐ@UÐUVÐWÐWßØ'©¨lÓ(;Ð'<¸AÐ>Ð>Ù!r   c                 óŠ   € ^ RI Hp  V ! \        \        P                  4      4      pVRJ;'       d    VP
                  '       * V3# )zAReturn whether the interpreter used after update has safe SQLite.)Úprobe_sqlite_runtimeN)Úhermes_cli.sqlite_runtimerÜ   r   ÚsysÚ
executableÚwal_reset_vulnerable)rÜ   rË   s     r   Ú"_post_update_sqlite_runtime_statusrá   }  s9   € å>á¤¤S§^¡^Ó 4Ó5€DØ�tÐ×=Ð= D×$=Ñ$=Ô =¸tÐCÐCr   c                ó0   € V ^8„  d   QhR\         R\        /# )r   r©   r   )r   r   )r   s   "r   r   r   …  s   € ÷ ñ ¬sð ´tñ r   c                ó2  € ^ RI Hp V P                  R4      '       g   \        V 4       R# V! 4       w  r#Vf   \        P                  R4       Ve	   V'       d   \        V 4       R# \        4        \        VP                  4       F  p\        V4       K  	  R# )zFPrint a success completion only after probing the next Hermes runtime.)rá   õ   âœ“Fz:Post-update SQLite runtime probe unavailable; not blockingT)	r"   rá   Ú
startswithr¸   r    ÚdebugrG   r%   Úsqlite_version_string)r©   rá   Úsqlite_runtime_okÚsqlite_infor}   s   &    r   Ú!_print_verified_update_completionrê   …  s{   € åHØ×Ñ˜e×$Ò$Ü  Ô)ÙÙ%GÓ%IÑ"ÐØÒô 	�‰ÐQÔRØÒ×/Ü  Ô)ÙÜ	„GÜ0°×1RÑ1RÖSˆÜˆdŽñ Tár   c                óV   € V ^8„  d   QhR\         R\        R\        R,          R\        /# )r   r’   Údesktop_build_okÚpre_update_versionNr   )r   r   r   )r   s   "r   r   r   ™  s0   € ÷ ñ ¬Dð ÄDð Ô^aÐdhÕ^hð Ômqñ r   c                ó    € ^ RI Hp V! 4        R# )zLHistorical updater hook; old soft-build results cannot establish completion.r   Nr   )r’   rì   rí   r   s   $$$ r   Ú_print_update_summaryrï   ™  r;   r   c                ó<   € V ^8„  d   QhR\         R\         R\        /# )r   Ú
state_pathÚ
snap_stater   r   )r   s   "r   r   r      s!   € ÷ 'ñ '´ð 'Ä$ð 'Ì4ñ 'r   c                óV  € ^ RI Hp ^ RIHp VP	                  4        V! VRRR7      P                  R4      '       g   R# V! W4      '       g:   \        R4       \        R4       \        R	4       \        R
4       \        R4       R# V! V RRR7      p\        VP                  R4      4      # )zêRestore through backup's authority reservation and pre-publication epoch floor.

Use the single-database primitive, not whole-profile restore: post-update config
and unrelated files must not roll back with a damaged transcript store.
)Úverify_sqlite_integrity)Ú_safe_restore_dbT©Úcheck_headerÚ
run_pragmaÚvalidFu@     âœ— Auto-restore refused or failed; state.db was not restored.zG    Stop the owning runtime and close database handles before retrying.zJ    If the canonical runtime epoch is unreadable, do not restore in place:zN    use `hermes sessions recover --source <snapshot> --output <separate-path>`z2    to salvage transcripts into a separate output.)Úhermes_cli.backuprô   Úhermes_cli.backup_restorerõ   ra   r/   rG   r   )rñ   rò   rô   rõ   Úrestoreds   &&   r   Ú_restore_state_db_from_snapshotrý      s�   € õ :Ý:à‡O�OÔÙ" :¸DÈTÔR×VÑVÐW^×_Ò_ÙÙ˜J×3Ò3ÜÐPÔQÜÐWÔXÜÐZÔ[ÜÐ^Ô_ÜÐBÔCÙÙ& zÀÐQUÔV€HÜ�—‘˜WÓ%Ó&Ð&r   c                ó4   € V ^8„  d   QhR\         R\        RR/# )r   ÚhomeÚlabelr   N)r   r   )r   s   "r   r   r   ·  s&   € ÷ "Oñ "O¬4ð "O¼3ð "OÀ4ñ "Or   c               ó²  €  ^ RI HpHp V R,          pVP                  4       '       g   R# V! VRRR7      pVP	                  R4      '       d(   \
        P                  RWP	                  R4      4       R# \        4        \        R	V R
2VP	                  RR4      ,           4       V! V 4      pVP                  4       '       g   \        R4       R# \        R VP                  4        4       RR7       F‚  pVR,          pVP                  4       '       g   K$  V! VRRR7      P	                  R4      '       g   KF   \        WH4      '       d   \        RVP                   RV R24       M\        R4         R# 	  \        R4       R#   \         d   p	\        RT	 24        Rp	?	L0Rp	?	ii ; i  \         d"   p	\
        P                  RY4        Rp	?	R# Rp	?	ii ; i)z¨Integrity check + auto-restore for ONE home's state.db from its newest valid snapshot.
Never raises: a guard that crashes the update tail is worse than what it detects.©Ú_quick_snapshot_rootrô   rU   NTrö   rù   z*Post-update state.db integrity OK (%s): %sr©   u(   âš  state.db is corrupted after update (z): úunknown erroru*     âš  No pre-update snapshot for this homec              3   óT   "  € T F  qP                  4       '       g   K  Vx € K   	  R # 5i©N)Úis_dir)r¯   Úds   & r   r±   Ú3_verify_and_restore_one_state_db.<locals>.<genexpr>É  s   é € ÐMÑ+> aÇ(Á(Ç*§¢Ó+>ùs   ‚(ž
()Úreverseu"     âœ“ Auto-restored from snapshot ú (rØ   uF     âœ— Auto-restore did not complete; see the restore diagnostic above.u%     âœ— Auto-restore file copy failed: u6     âš  No valid pre-update snapshot found for this homez*Post-update state.db guard (%s) failed: %s)rú   r  rô   r`   r/   r    ræ   rG   ÚsortedÚiterdirrý   Únamerc   rD   )
rÿ   r   r  rô   rñ   ÚokÚ	snap_rootÚsnap_dirrò   r¥   s
   &$        r   Ú _verify_and_restore_one_state_dbr  ·  sœ  € ðOßSØ˜JÕ&ˆ
Ø× Ñ ×"Ò"ÙÙ$ Z¸dÈtÔTˆØ�6‰6�'�?Š?Ü�L‰LÐEÀuÏfÉfÐU^ÓN_Ô`ÙÜŒÜÐ8¸¸¸sÐCÀbÇfÁfÈYÐXgÓFhÕhÔiÙ(¨Ó.ˆ	Ø×Ñ×!Ò!ÜÐ>Ô?ÙÜÑM¨9×+<Ñ+<Ô+>ÓMÐW[×\ˆHØ! JÕ.ˆJØ×$Ñ$×&Ò&ÙÙ*¨:ÀDÐUYÔZ×^Ñ^Ð_f×gÒgÙðEÜ2°:×JÒJÜÐ>¸x¿}¹}¸oÈRÐPUÈwÐVWÐXÕYäÐbÕcò ñ ]ô 	ÐFÖGøô ô EÜÐ=¸c¸UÐC×DÑDûðEûô ô OÜ�‰ÐAÀ5×NÒNûðOúsr   ‚&F* «!F* Á%F* Á4AF* ÃA%F* Ä5F* Ä8-FÅ%F* Å&FÅ1F* Å5F* ÆF'ÆF"ÆF* Æ"F'Æ'F* Æ*GÆ5GÇGc                ó   € V ^8„  d   QhRR/# r3   r4   )r   s   "r   r   r   Ü  s   € ÷ Tñ T°4ñ Tr   c                 óè   € ^ RI Hp  V ! 4       p\        VRR7       \        R4      ;_uu_ 4        ^ RIHp V! V4       F  w  r4\        VRV 2R7       K  	  RRR4       R#   + '       g   i     R# ; i)z®Integrity guard for the ROOT state.db AND every sibling profile's (the snapshot covers
siblings, so the guard must too or a corrupt profile DB goes undetected).

See #97994.
rR   zdefault home)r   z/Sibling-profile state.db guard sweep failed: %s©Ú_sibling_profile_homeszprofile N)r"   rS   r  r   rú   r  )rS   rÿ   r  r  Úprofile_homes        r   Ú)_verify_and_restore_state_dbs_post_updater  Ü  s[   € õ 6ÙÓ€DÜ$ T°Õ@Ü	ÐG×	HÕ	HÝ<Ù"8¸Ö">ÑˆDÜ,¨\À8ÈDÈ6ÐAR×Sñ #?÷ 
I×	H×	HÒ	Hús   ®(A Á A1	c                ó   € V ^8„  d   QhRR/# r3   r4   )r   s   "r   r   r   ë  s   € ÷ 9ñ 9°ñ 9r   c                 óâ   € ^ RI Hp  V ! 4       p^ RIHp V! V4       \	        \
        4      ;_uu_ 4        ^ RIHp V! V4       F  w  rEV! V4       K  	  RRR4       R#   + '       g   i     R# ; i)u  Drop the cached live plugin catalog under the active home AND every sibling profile's.

The checkout is shared across profiles, so an update's code swap changes every profile's
catalog truth at once: a live snapshot cached before the swap would out-vote the newer
in-tree catalog (the pin it just bumped, the entry it just added) for the rest of the cache
TTL (#119340). Mirrors the state.db guard's home + siblings iteration. Never raises â€”
:func:`plugin_catalog.invalidate_live_cache_for_home` is best-effort per home.
rR   )Úinvalidate_live_cache_for_homer  N)r"   rS   Úhermes_cli.plugin_catalogr  r   rD   rú   r  )rS   rÿ   r  r  Ú_namer  s         r   Ú&_invalidate_live_plugin_catalog_cachesr  ë  sR   € õ 6ÙÓ€DÝHÙ" 4Ô(Ü	”)×	Õ	Ý<Ù#9¸$Ö#?ÑˆEÙ*¨<Ö8ñ $@÷ 
×	×	Ò	ús   ³ AÁA.	c                ó   € V ^8„  d   QhRR/# r3   r4   )r   s   "r   r   r   þ  s   € ÷ -ñ -¨4ñ -r   c            	     ó@  € ^ RI Hp  V ! RR7      pVR,          '       d8   \        R\        VR,          4       RRP	                  VR,          4       24       VP                  R4      '       d8   \        R	\        VR,          4       R
RP	                  VR,          4       24       VP                  R4      '       d+   \        R\        VR,          4       R24       \        R4       VP                  R4      '       d    \        R\        VR,          4       R24       VP                  R4      '       d8   \        R\        VR,          4       RRP	                  VR,          4       24       VR,          '       g'   VP                  R4      '       g   \        R4       R# R# R# )zaRun ``sync_skills`` (copies new, updates changed, respects user deletions) and print its summary.)Úsync_skillsT©ÚquietÚcopiedz  + z new: ú, Úupdatedu     â†‘ z
 updated: Úuser_modifiedz  ~ z user-modified (kept)uM       â†’ see them: hermes skills list-modified  (diff/reset to resume updates)Úcleanedu     âˆ’ z removed from manifestÚ	relocatedu     â†’ z moved to new upstream paths: u     âœ“ Skills are up to dateN)Útools.skills_syncr!  rG   rµ   Újoinr/   )r!  Úresults     r   Ú!_print_bundled_skills_sync_reportr-  þ  sS  € å-Ù˜tÔ$€FØˆh×ÔÜ�”S˜ Õ)Ó*Ð+¨6°$·)±)¸FÀ8Õ<LÓ2MÐ1NÐOÔPØ‡z�z�)×ÒÜ�”s˜6 )Õ,Ó-Ð.¨j¸¿¹À6È)ÕCTÓ9UÐ8VÐWÔXØ‡z�z�/×"Ò"Ü�”S˜ Õ0Ó1Ð2Ð2GÐHÔIÜÐ]Ô^Ø‡z�z�)×ÒÜ�”s˜6 )Õ,Ó-Ð.Ð.DÐEÔFØ‡z�z�+×ÒÜ�”s˜6 +Õ.Ó/Ð0Ð0NÈtÏyÉyÐY_Ð`kÕYlÓOmÐNnÐoÔpØ�(×Ô F§J¡J¨y×$9Ò$9ÜÐ+Ö,ñ %:Ñr   c                ó   € V ^8„  d   QhRR/# r3   r4   )r   s   "r   r   r     s   € ÷ KQñ KQ ñ KQr   c            
     óR  € ^ RI Hp  V ! 4       P                  P                  R8w  d   R#  \        P
                  ! 4       ^ 8w  d   R#  \        R4      pTP                  4       '       g   TP                  4       '       g   R# \        P                  P                  R4      ;'       g    Rp \        P                  ! RRR	T 2R
\        P                  P                  RR4       2RRRR.RRRR^
RR7      pTP                   ^ 8X  d   R# RpRpRpR! Fû  p\        T4      T,          pTP#                  4       '       g   K-   TP%                  RRR7      p	\(        ;QJ d*    R T	P+                  4        4       F  '       g   K   RM	  RM! R T	P+                  4        4       4      '       d   K™   TP-                  RRR7      ;_uu_ 4       p
T
P/                  RT,           R,           T,           R,           4       RRR4       \1        RT 24       RpKý  	  T'       d   \1        R 4       R# R#   \         d     R# i ; i  \        \        P                  3 d     R# i ; i  \&         d     EKY  i ; i  + '       g   i     L‚; i  \&         d   p\1        RT RT 24        Rp?EK“  Rp?ii ; i)"a	  Ensure /usr/local/bin is on PATH for RHEL-family root non-login shells (su, sudo -s,
tmux), where neither /etc/bashrc nor .bash_profile adds it. Mirrors install.sh. Idempotent;
no-op on non-Linux/non-root/non-FHS or when ``bash -i -c 'command -v hermes'`` resolves.r    ÚlinuxNz/usr/local/bin/hermesÚHOMEz/rootÚenvz-izHOME=zTERM=ÚTERMÚdumbÚbashz-czcommand -v hermesTzutf-8rˆ   F)Úcapture_outputÚtextÚencodingÚerrorsÚtimeoutÚcheckz"export PATH="/usr/local/bin:$PATH"uK   # Hermes Agent â€” ensure /usr/local/bin is on PATH (RHEL non-login shells)z	utf-8-sig)r9  r8  c              3   óž   "  € T FC  pR V9   ;'       d2    RV9   ;'       d%    VP                  4       P                  R4      '       * x € KE  	  R# 5i)z/usr/local/binÚPATHÚ#N)Úlstriprå   )r¯   r}   s   & r   r±   Ú)_ensure_fhs_path_guard.<locals>.<genexpr>N  sH   é € ð 
á-�ð  Ñ$×]Ð]¨°4©×]Ð]ÀÇÁÃ×@XÑ@XÐY\Ó@]Ô<]Ô]Û-ùs   ‚A“A -AÚa)r8  rw   u     âš  Could not update r�   u&     âœ“ Added /usr/local/bin to PATH in z?    (reload your shell or run 'source ~/.bashrc' to pick it up))z.bashrcz.bash_profile)r"   r!   rÞ   Úplatformr³   ÚgeteuidÚAttributeErrorr   Ú
is_symlinkr`   r´   r/   Ú
subprocessÚrunÚFileNotFoundErrorÚTimeoutExpiredÚ
returncodeÚis_fileÚ	read_textrc   Úanyrz   r¿   ÚwriterG   )r!   Úfhs_linkrÿ   ÚprobeÚ	path_lineÚpath_commentÚ	wrote_anyÚ	candidater0   ÚexistingÚfÚes               r   Ú_ensure_fhs_path_guardrX    sg  € õ )Ù	ƒt‡x�x×Ñ˜GÔ#ÙðÜ�:Š:‹<˜1ÔÙð ô
 Ð+Ó,€HØ×Ñ× Ò ¨¯©×):Ò):Ùô �:‰:�>‰>˜&Ó!×,Ð, W€DðÜ—’àØØ˜�v�ØœŸ
™
Ÿ™ v¨vÓ6Ð7Ð8ØØØØ#ð	ð"  Ø °	ØØô+
ˆð2 ×Ñ˜1ÔÙà4€IØ`€LØ€IÛ1ˆ	Ü�4‹j˜9Õ$ˆØ�{‰{�}Š}Ùð	Ø—}‘}¨IÀ�}ÓLˆH÷ ‹3ñ 
à ×+Ñ+Ô-ó
�3�3Š3ñ 
à ×+Ñ+Ô-ó
÷ 
ò 
ñ ð	Ø—‘˜#¨�×0Ô0°AØ—‘˜˜|Õ+¨dÕ2°YÕ>ÀÕEÔF÷ 1ô
 	Ð6°s°eÐ<Ô=ØŠ	ñ+ 2÷, ÜÐOÖPñ øôA ô ÚðûôD œz×8Ñ8Ð9ô Úðûô ô 	Ûð	ú÷ 1×0ûäô 	ÜÐ+¨C¨5°°1°#Ð6Ô7Þûð	úsl   ªH$ Â*A	H6 Ä<IÆ(I>Ç.I+Ç1I>È$H3È2H3È6IÉIÉI(É'I(É+I;É6I>É;I>É>J&Ê	J!Ê!J&c                ó   € V ^8„  d   QhRR/# r3   r4   )r   s   "r   r   r   _  s   € ÷ -ñ -˜dñ -r   c                 ó^   € ^ RI Hp  ^ RIHp V P	                  V! 4       P
                  4       R# )zAHistorical export; launcher policy belongs to the launcher owner.©Ú
_launchersr    N)Ú
hermes_clir\  r"   r!   Ú
expose_clirÀ   ©r\  r!   s     r   Ú_ensure_acp_launcherr`  _  s   € å%Ý(Ø×Ñ™"›$×+Ñ+Ö,r   rQ   ÚfalseÚnoneÚdisabledÚfullÚzipÚtrueÚquickc                ó$   € V ^8„  d   QhR\         /# r'   r�   )r   s   "r   r   r   m  s   € ÷ ñ ¬Sñ r   c                ó¼  € \        V RR4      '       d   R# \        V RR4      '       d   R#  \        4       P                  RR4      pVR
J d   R# VRJ d   R# \        P                  \        V4      P                  4       P                  4       4      pVf   \        P                  RV4       R# V#   \         d#   p\        P                  RT4       Rp R	p?L�R	p?ii ; i)uã   Backup mode ``off``/``quick``/``full``. CLI flags win (``--no-backup`` beats ``--backup``);
config accepts mode strings plus legacy booleans (trueâ†’full, falseâ†’off, which also disables
the quick snapshot). Default ``quick``.Ú	no_backupFrQ   Úbackuprd  Úpre_update_backuprg  z/Could not load config for pre-update backup: %sNTu<   Unknown updates.pre_update_backup value %r â€” using 'quick')Úgetattrr1   r/   rD   r    ræ   Ú_BACKUP_MODE_ALIASESr   r\   r]   r¡   )ÚargsÚrawr¥   rj   s   &   r   Ú_resolve_pre_update_backup_moderq  m  sÀ   € ô ˆt�[ %×(Ò(ÙÜˆt�X˜u×%Ò%ÙðÜÓ!×%Ñ%Ð&9¸7ÓCˆð
 ˆdƒ{ÙØ
ˆeƒ|ÙÜ×#Ñ#¤C¨£H§N¡NÓ$4×$:Ñ$:Ó$<Ó=€DØ‚|Ü�‰ÐUÐWZÔ[ÙØ€Køô ô Ü�‰ÐFÈÔLØ�ûðús   ¬B. Â.CÂ9CÃCc                ó(   € V ^8„  d   QhR\         RR/# )r   Úsnapshot_idr   Nr�   )r   s   "r   r   r   ‡  s   € ÷ ñ ´ð ¸ñ r   c                ó  € ^ RI HpHp ^ RIHp V! 4       R,          pVP                  4       '       g   R# V! VRR\        R7      pVP                  R4      '       d   R# \        RVP                  R	R
4       24       V! V! 4       4      V ,          R,          pVP                  4       '       g   \        R4       MBV! VRRR7      P                  R4      '       d   \        R4       \        R4       M\        R4       \        4        R# )z£Verify live state.db after the snapshot: a concurrent process (antivirus, killed
gateway, Windows filter driver) can corrupt it and we'd otherwise exit 0 silently.r  rR   rU   NT)r÷   rø   Ú	max_bytesrù   u6     âš  state.db integrity check FAILED after snapshot: r©   r  uD     âš  Snapshot does not contain state.db (was skipped or too large).rö   u3     âœ“ Snapshot copy is valid â€” continuing update.z>    If state.db is lost after update it will be auto-restored.ua     âœ— Snapshot copy ALSO failed integrity â€” the source was already corrupted before the backup.)	rú   r  rô   r-   rS   r`   Ú"_PRE_UPDATE_SNAPSHOT_MAX_FILE_SIZEr/   rG   )rs  r  rô   rS   Ú	_src_pathÚ
_integrityÚ_snap_states   &      r   Ú_verify_state_db_after_snapshotrz  ‡  sÚ   € ÷ PÝ1ÙÓ! JÕ.€IØ×Ñ×ÒÙÙ(Ø °ÔAcô€Jð ‡~�~�g×ÒÙÜ	ÐBÀ:Ç>Á>ÐR[Ð]lÓCmÐBnÐ
oÔpÙ&¡Ó'8Ó9¸KÕGÈ*ÕT€KØ×Ñ×ÒÜÐTÕUÙ	  ¸4ÈDÔ	Q×	UÑ	UÐV]×	^Ò	^ÜÐCÔDÜÐNÕOäÐqÔrÜ	†Gr   c                ó:   € V ^8„  d   QhR\         \        ,          /# r'   ©r   r   )r   s   "r   r   r      s   € ÷ ñ œh¤s�mñ r   c                 ó   € ^ RI Hp  ^ RIHp V! R\        \
        R7      pV'       d   \        V4       \        RV 24       \        R4      ;_uu_ 4        ^ RIH	p V! \        \
        R7      pV'       dn   \        R	R
P                  \        V4      4      ,           4       V ! RRR
P                  R \        VP                  4       4       4       4      4       ^ RIHp WEn        RRR4       V#   + '       g   i     T# ; i)zYQuick snapshot of the root home plus every sibling profile; returns the root snapshot id.)r™   )Úcreate_quick_snapshotz
pre-update)r   ÚkeepÚmax_file_sizeu   â—† Pre-update snapshot: z$Sibling profile snapshots failed: %s)Ú(create_pre_update_snapshots_all_profiles)r  r€  u!   â—† Sibling profile snapshot(s): r%  Úsibling_profile_snapshotsTc              3   ó4   "  € T F  w  rV R V 2x € K  	  R# 5i)Ú=Nr4   )r¯   ÚkrÔ   s   &  r   r±   Ú'_run_quick_snapshots.<locals>.<genexpr>·  s   é € ÐPÑ1O©¨˜Q˜C˜q  �*Ó1Oùs   ‚N)r"   r™   rú   r~  Ú_PRE_UPDATE_SNAPSHOT_KEEPrv  rz  rG   r   r�  r+  r  ÚitemsÚhermes_cli.update_cmd_configÚupdate_cmd_configÚ_LAST_SIBLING_SNAPSHOTS)r™   r~  rs  r�  Ú_sibling_snapsÚ_cfgs         r   Ú_run_quick_snapshotsrŽ     sÑ   € å9Ý7Ù'ØÔ!:ÔJlô€K÷ Ü'¨Ô4ÜÐ)¨+¨Ð7Ô8ô 
Ð<×	=Õ	=ÝNÙAÜ*Ô:\ô
ˆ÷ ÜÐ5¸¿	¹	Ä&ÈÓBXÓ8YÕYÔZÙØ+ØØ—	‘	ÑP´¸×8LÑ8LÓ8NÔ1OÓPÓPôõ
 8à+9Ô(÷ 
>ð Ð÷ 
>Ö	=ð Ðús   ÁBC,Ã,C=	c                ó   € V ^8„  d   QhRR/# r3   r4   )r   s   "r   r   r   ¿  s   € ÷ .ñ .˜$ñ .r   c            	     ó”  €  ^ RI Hp   \	        4       P                  R^4      p\        R4       \        P                  ! 4       p T ! \        T4      R7      p\        P                  ! 4       T,
          pTf   \        R
4       \        4        R#  TP                  4       P                  p^ RIHp  ^ RIHpHp	 T	! 4        RTP#                  T! 4       4       2p
\        RT
 RT! T4       RTR R24       \        RT 24       \        R4       \        4        R#   \         d%   p\        RT R24       \        4         Rp?R# Rp?ii ; i  \         d    ^p EL7i ; i  \         d/   p\        RT 24       \        R	4       \        4         Rp?R# Rp?ii ; i  \         d    ^ p ELi ; i  \         d    \%        T4      p
 Lïi ; i)zTZip HERMES_HOME under ``backups/`` (restorable via ``hermes import``). Never raises.)Úcreate_pre_update_backupu5   âš  Pre-update backup: could not load backup module (z); continuing update.NÚbackup_keepu!   â—† Creating pre-update backup...)r  u     âš  Backup failed: z  Continuing with update.uI     âš  Backup skipped (no files found or write failed); continuing update.)Úformat_bytes)rS   Údisplay_hermes_homeÚ/z  Saved:    r  r%  rZ   zs)z  Restore:  hermes import zH  Disable:  set updates.pre_update_backup: quick (or off) in config.yaml)rú   r‘  rD   rG   r1   r/   Ú_timeÚ	monotonicr‰   ra   rb   rc   Úhermes_cli.sizefmtr“  r^   rS   r”  Úrelative_tor   )r‘  r¥   Ú_keepÚt0Úout_pathÚelapsedÚ
size_bytesr“  rS   r”  Údisplay_paths              r   Ú_run_full_backupr   ¿  s§  € ðÝ>ðÜ!Ó#×'Ñ'¨°qÓ9ˆô 
Ð
-Ô.Ü	�ŠÓ	€BðÙ+´°U³Ô<ˆô �oŠoÓ "Õ$€GàÒÜÐYÔZÜŒÙðØ—]‘]“_×,Ñ,ˆ
õ 0ð%ßIÙ-Ó/Ð0°°(×2FÑ2FÁÓGXÓ2YÐ1ZÐ[ˆô 
ˆL˜˜ b©°jÓ)AÐ(BÀ"ÀWÈSÀMÐQSÐ
TÔUÜ	Ð& x jÐ
1Ô2Ü	Ð
TÔUÜ	†GøôU ô ÜÐEÀcÀUÐJ_Ð`ÔaÜŒÝûðûô ô Ø‹ðûô ô ÜÐ% c UÐ+Ô,ÜÐ)Ô*ÜŒÝûð	ûô ô Ø‹
ðûô ô %Ü˜8“}Šð%úsd   ‚D ‰E
 ÁE ÂF Â/(F. ÄEÄ#EÅEÅ
EÅEÅFÅ)#FÆFÆF+Æ*F+Æ.GÇGc                ó:   € V ^8„  d   QhR\         \        ,          /# r'   r|  )r   s   "r   r   r   ð  s   € ÷ )ñ )¤H¬S¥Mñ )r   c                ó¦  € \        V 4      pVR8X  d+   \        V RR4      '       d   \        R4       \        4        R# Rp \        4       pRpV'       g%   \        R
V R24       \        R4       \        4        VR8w  d   V'       d   \        4        V# \        4        V#   \         d'   p\
        P                  RT4       RT R	2p Rp?LRp?ii ; i)u£  Run the pre-update backup; return the quick-snapshot id (None when off/failed). Never raises.

``off`` â€” nothing. ``quick`` (default) â€” snapshot of critical small files under
``state-snapshots/``, files over 1 GiB skipped so a bloated state.db can't stall the update.
``full`` â€” quick snapshot PLUS a zip of HERMES_HOME under ``backups/`` (``hermes import``).

Explicit user opt-out is honored fully. See #34600.
rQ   rj  Fu,   â—† Pre-update backup: skipped (--no-backup)Nrv   zPre-update snapshot failed: %sr  rØ   u@     âš  Pre-update snapshot FAILED â€” no recovery point was savedÚ.zN  Continuing with update (set updates.pre_update_backup: off to silence this).rd  )rq  rm  rG   rŽ  rD   r    r¡   r   )ro  rj   rs  Úsnapshot_detailr¥   s   &    r   Ú_run_pre_update_backupr¥  ð  sÅ   € ô +¨4Ó0€Dàˆu„}Ü�4˜ e×,Ò,ÜÐ@ÔAÜŒGáà€KðÜ*Ó,ˆð
 ˆßô
 	ÐPÐQ`ÐPaÐabÐcÔdÜÐ^Ô_ÜŒàˆv„~ßÜŒGØÐäÔØÐøô) ô &Ü�‰Ð7¸Ô=Ø˜s˜e 1˜+�ûð&ús   Á 
B ÂCÂ*CÃCc                ó(   € V ^8„  d   QhR\         RR/# )r   Úbranchr   Nr�   )r   s   "r   r   r     s   € ÷ Iñ I¬ð I°ñ Ir   c                ó(  € ^ RI Hp ^ RIHp  V! 4       P	                  V! 4       P
                  4      pV'       d   \        RT RV^8X  d   RMR 24       V! 4       P                  4         V! 4       P                  V 4       R#   \         d:   pT! R\        T4      ;'       g    \        T4      P                  4        Rp?LXRp?ii ; i  \         d=   pT! R	\        T4      ;'       g    \        T4      P                  R
R7        Rp?R# Rp?ii ; i)aX  Clear stale ``__pycache__`` (else gateway restart ImportErrors on names absent from old
bytecode), re-stamp the fingerprint, refresh the bootstrap cache scripts.

Never fails the committed update: a failed sweep is a ``bytecode_sweep`` follow-up and the
fingerprint stays un-stamped, so the launch-time sweep (fingerprint mismatch) retries it.
r    ©Úrecord_followupu     âœ“ Cleared z stale __pycache__ directorÚyÚiesÚbytecode_sweepNÚbootstrap_scriptsz'the next `hermes update` refreshes them©Úretry)r"   r!   Úhermes_cli.update_receiptrª  Ú_clear_bytecode_cacherÀ   rG   Ú_record_bytecode_fingerprintrD   r   r¢   r£   Ú _refresh_bootstrap_cache_scripts)r§  r!   rª  Úremovedr¥   s   &    r   Ú_sweep_bytecode_after_updater¶    sê   € õ )Ý9ðJÙ“$×,Ñ,©R«T×->Ñ->Ó?ˆßÜ�N 7 )Ð+FÈgÐYZÌlÁsÐ`eÐFfÐgÔhÙ
‹×)Ñ)Ô+ðIÙ
‹×-Ñ-¨fÖ5øô ô JÙÐ(¬#¨c«(×*HÐ*H´d¸3³i×6HÑ6H×IÑIûðJûô ô IÙÐ+¬S°«X×-KÐ-K¼¸c»×9KÑ9KØG÷	Ió 	IûðIús4   Ž,B »/B Á+C
 ÂCÂ/CÃCÃ
DÃ1DÄDc                ó$   € V ^8„  d   QhR\         /# r'   r�   )r   s   "r   r   r   4  s   € ÷ 
7ñ 
7¤Sñ 
7r   c                 ó2  € V '       d   V P                  R 4      '       d   R# V '       g   R# . pR FJ  w  r#\        V P                  V. 4      4      pV'       g   K*  VP                  VP                  V4      4       KL  	  V'       d   RP	                  V4      # R# )Úskipped_opt_outzopted out (--no-skills)zsync failedr%  z
up to date))r$  z+{} new)r&  u   â†‘{} updated)r'  z~{} user-modified)r/   rµ   Úappendr   r+  )ÚrÚpartsÚkeyÚfmtÚcounts   &    r   Ú_profile_skill_sync_statusrÀ  4  su   € ßˆQ�U‰UÐ$×%Ò%Ù(ßÙØ€EÛq‰ˆÜ�A—E‘E˜#˜r“NÓ#ˆß‰5Ø�L‰L˜Ÿ™ EÓ*Ö+ñ r÷  %ˆ4�9‰9�UÓÐ6¨,Ð6r   c                ó   € V ^8„  d   QhRR/# r3   r4   )r   s   "r   r   r   A  s   € ÷ >ñ > Tñ >r   c                 ó|  € \        \        4      ;_uu_ 4        ^ RIHp Hp V ! 4       pV'       dV   \        4        \        R4       V F:  p \        RVP                   R\        V! VP                  RR7      4       24       K<  	  R	R	R	4       \        \        4      ;_uu_ 4        ^ R
IH	p V! RR7      pV'       d4   \        4        \        R\        V4       RRP                  V4       24       R	R	R	4       \        \        4      ;_uu_ 4        ^ RIHp V! RR4      P                  4       pV'       d   \        RV R24       R	R	R	4       R	#   \         d)   p\        RTP                   RT R24        R	p?EK4  R	p?ii ; i  + '       g   i     EL; i  + '       g   i     L°; i  + '       g   i     R	# ; i)zRBest-effort per-profile syncs: bundled skills, ``.env`` backfill, Honcho profiles.)Úlist_profilesÚseed_profile_skillsu-   â†’ Syncing bundled skills to all profiles...rx   r�   Tr"  z	: error (rØ   N)Úbackfill_profile_envsu   â†’ Seeded .env for z# profile(s) (copied from default): r%  )Úimport_provider_moduleÚhonchoÚcliz
-> Honcho: synced z profile(s))r   rD   Úhermes_cli.profilesrÃ  rÄ  rG   r  rÀ  ÚpathrÅ  rµ   r+  Úplugins.memoryrÆ  Úsync_honcho_profiles_quiet)	rÃ  rÄ  Úall_profilesÚpÚperÅ  Ú
backfilledrÆ  Úsynceds	            r   Ú_sync_profiles_after_updaterÒ  A  sR  € ô 
”)×	Õ	ßJÙ$“ˆßÜŒGÜÐAÔBÛ!�ð7Ü˜B˜qŸv™v˜h bÔ)CÑDWÐXY×X^ÑX^ÐfjÔDkÓ)lÐ(mÐnÖoñ "÷ 
ô 
”)×	Õ	å=Ù*°Ô6ˆ
ßÜŒGÜÐ(¬¨Z«Ð(9Ð9\Ð]a×]fÑ]fÐgqÓ]rÐ\sÐtÔu÷ 
ô 
”)×	Õ	Ý9Ù'¨°%Ó8×SÑSÓUˆßÜÐ(¨¨°Ð<Ô=÷	 
Ñ	øô !ô 7Ü˜B˜qŸv™v˜h i°¨t°1Ð5×6Ó6ûð7ú÷ 
×	Ð	ú÷ 
×	ú÷ 
×	Ð	úsN   ˜2FÁ6EÂFÂ$AFÄ5F*ÅF 	ÅE;	Å4FÅ;F 	Æ FÆF	ÆF'	Æ*F;	c                ó   € V ^8„  d   QhRR/# r3   r4   )r   s   "r   r   r   b  s   € ÷ /ñ /¨$ñ /r   c                 óÎ  € ^ RI p \        4       P                  RR4      '       g   R# \        P                  P                  RR4      P                  4       '       d   R# V P                  RRR7      f   R# \        P                  R8X  d   \        R	4       \        R
4       R# \        R4       \        P                  R8X  d   ^ RI
Hp V! RR7       R# V P                  RRR7       R# )zOReconcile an installed optional package, never a user-selected external binary.NÚrefresh_cua_driverTÚHERMES_CUA_DRIVER_CMDrv   z
cua-driver)Úallow_outdatedÚwin32uO   
â†’ Windows cua-driver refresh deferred (autostart registration requires UAC).zI  Run `hermes computer-use install --upgrade` in an interactive terminal.u2   
â†’ Preparing pinned cua-driver (Computer Use)...Údarwin)Úinstall_cua_driverF)Úshow_installer_progress©Úexplicit)Úpmr1   r/   r³   r´   r\   Úinstalled_packagerÞ   rB  rG   Úhermes_cli.tools_config_cuarÚ  Úensure)rÞ  rÚ  s     r   Ú _refresh_cua_driver_after_updaterâ  b  s°   € ãäÓ×"Ñ"Ð#7¸×>Ò>ÙÜ	‡z�z‡~�~Ð-¨rÓ2×8Ñ8×:Ò:ÙØ	×Ñ˜L¸ÐÓ>ÒFÙÜ
‡|�|�wÔô 	Ð`ÔaÜÐYÔZÙÜ	Ð
?Ô@Ü
‡|�|�xÔõ 	CÙ°5×9à
�	‰	�,¨ˆ	Ö.r   c                ó   € V ^8„  d   QhRR/# r3   r4   )r   s   "r   r   r   |  s   € ÷ ?ñ ?¨Tñ ?r   c                 óÈ  € ^ RI p ^ RIHp ^ RIHpHp ^ RIHp ^ RIH	p V! 4       '       g   V! 4       '       g   R# V! V! V! 4       4      P                  4       4       F>  pV P                  V4      e   K  \        RV RV R24        V P                  VR	R
7       K@  	  R#   T P                  \        3 d+   p\        RT RT 24       \        RT 24        Rp?K€  Rp?ii ; i)aã  Give the install its optional default tools: the PM defaults (agent-browser +
Chromium, cua-driver). The Browser Use CLI engine (browser-harness) is a venv dependency.

Runs at the end of both the installers (via the source completion) and
``hermes update``: a source update re-syncs only the venv, so a tool that became
a default after this install was created would never arrive otherwise. Declined
packages stay declined (pm/defaults.py). A failed download warns and never fails.
N)Údefault_packages)Úlazy_installs_allowedÚsealed)ÚLockfile)Úlockfile_pathu   
â†’ Installing z: (default tool; opt out with `hermes pm install --without z`)...TrÜ  u     âš  z was not installed: z"    Retry with: hermes pm install )rÞ  Úpm.defaultsrå  Ú
pm.installræ  rç  Úpm.lockrè  Úpm.pathsré  Únamesrß  rG   rá  ÚInstallErrorrc   )rÞ  rå  ræ  rç  rè  ré  r  r¥   s           r   Ú#_install_default_tools_after_updaterð  |  sÑ   € ó Ý,ß8Ý Ý&ñ ‡x‚xÑ,×.Ò.ÙÙ ¡©-«/Ó!:×!@Ñ!@Ó!BÖCˆØ×Ñ Ó%Ò1ÙÜÐ! $ Ð'aÐbfÐagÐglÐmÔnð	?Ø�I‰I�d TˆIÖ*ó Døð —‘¤Ð)ô 	?Ü�F˜4˜&Ð 4°S°EÐ:Ô;ÜÐ6°t°fÐ=×>Ò>ûð	?ús   ÂB Â C!Â7CÃC!c                ó   € V ^8„  d   QhRR/# r3   r4   )r   s   "r   r   r   š  s   € ÷ 3ñ 3¨Dñ 3r   c                 óR   € ^ RI Hp  V ! 4       pV'       d   \        RV R24       R# R# )z\Surface a GB-scale /rollback store the user may not know is on (see the helper's docstring).)Úcheckpoint_footprint_noticeu   
[1;33mâ„¹  z[0mN)Útools.checkpoint_maintenanceró  rG   )ró  Únotices     r   Ú"_print_checkpoint_footprint_noticerö  š  s'   € åHÙ(Ó*€FßÜÐ! & ¨Ð1Ö2ñ r   c                ó   € V ^8„  d   QhRR/# r3   r4   )r   s   "r   r   r   ¢  s   € ÷ ñ °4ñ r   c                 ó6  aa€ ^ RI HoHp Hp ^ RIHo R V3R llpR\        3RV 3RV3R\        3R	VV3R
 l3RV3R\        3R\        3R\        3R\        33
 F(  w  r4\        V4      ;_uu_ 4        V! 4        RRR4       K*  	  R#   + '       g   i     K?  ; i)zšBest-effort notices (FTS optimize, curator) and self-heals (FHS PATH, ACP launcher,
Windows bin launchers, cua-driver refresh) that run after the summary.)r!   rK   r~   r[  c                ó   € V ^8„  d   QhRR/# r3   r4   )r   s   "r   r   Ú?_print_post_update_notices_and_self_heals.<locals>.__annotate__¨  s   € ÷ 4ñ 4 tñ 4r   c                  óB   <€ ^ RI Hp  V ! S! 4       P                  4       R# )r9   )Úmigrate_windows_bin_pathN)Úhermes_cli._install_repairrü  rÀ   )rü  r!   s    €r   Ú_migrate_windows_bin_pathÚL_print_post_update_notices_and_self_heals.<locals>._migrate_windows_bin_path¨  s   ø€ õ 	HÙ ¡£×!2Ñ!2Ö3r   zFTS optimize notice failed: %sz#Curator first-run notice failed: %sz$Curator recent-run notice failed: %szFHS PATH guard check failed: %sz CLI launcher exposure failed: %sc                  óD   <€ S P                  S! 4       P                  4      # r  )r^  rÀ   r_  s   €€r   Ú<lambda>Ú;_print_post_update_notices_and_self_heals.<locals>.<lambda>´  s   ø€ °Z×5JÑ5JÉ2Ë4×K\ÑK\Ô5]r   z)Windows bin launcher migration failed: %szcua-driver refresh failed: %sz"Default PM tool install failed: %sz&Checkpoint footprint notice failed: %sz#Relay exporter migration failed: %sN)r"   r!   rK   r~   r]  r\  rq   rX  râ  rð  rö  Ú_migrate_relay_exporter_envr   )rK   r~   rþ  r©   Ústepr\  r!   s        @@r   Ú)_print_post_update_notices_and_self_healsr  ¢  s«   ù€ ÷ lÑkÝ%÷4ð 4ð 
*Ô+OÐPØ	.Ð0OÐPØ	/Ð1QÐRØ	*Ô,BÐCØ	+Õ-]Ð^Ø	4Ð6OÐPØ	(Ô*JÐKØ	-Ô/RÐSØ	1Ô3UÐVð 
/Ô0KÐLó‰ˆô ˜'×"Õ"ÙŒF÷ #Ñ"ó÷ #×"Ð"ús   Á1BÂBc                ó   € V ^8„  d   QhRR/# r3   r4   )r   s   "r   r   r   Á  s   € ÷ 'ñ ' Tñ 'r   c                  ó    € ^ RI Hp  V ! 4        R# )r9   ©Ú run_relay_migration_after_updateN)Úhermes_cli.relay_plugin_migrater	  r  s    r   r  r  Á  s   € ÝPÙ$Ö&r   Úcompletion_messageÚ	followupsc                ó$   € V ^8„  d   QhR\         /# r'   )r   )r   s   "r   r   r   Æ  s   € ÷ iñ iô 
ñir   c                óP  a aaaaa€ ^ RI Ho VV3R lp^ RIHoHp ^ RIHp	 V! RV	4       \        P                  R8X  d   V'       d   \        4        \        R4        ^ RI
Hp
 V
! 4        \        R4      ;_uu_ 4        \!        4        RRR4        ^ RIHp ^ RIHp V! \)        V! 4       P*                  4      3/ V! 4       B '       d   \        R4       \        R4      ;_uu_ 4        ^ RIH p T! T! 4       P*                  4      '       d   \        R4       RRR4       \        R4      ;_uu_ 4        \C        4        RRR4       \        R4      ;_uu_ 4        \        4        \        R4       \E        4        RRR4       T! R\F        4       T! RTT TT3R l4       \        4        \I        T;'       g    \K        T4      4      p\M        \        4      ;_uu_ 4        ^ RI'H(pH)p . T! 4       OT! 4       O F  p\        T4       K  	  RRR4       \        R4      ;_uu_ 4        \U        4        RRR4       T'       g-   T;'       g    RPW                  R4      '       d   S! R R!R"R#7       T#   \         d    \        P                  R	R
R7        EL%i ; i  + '       g   i     EL; i  \,        \.        P0                  3 d   p\3        TRR4      ;'       g    \5        T4      P7                  4       P9                  4       R$R ;'       g    \;        T4      P<                  .p\        RT^ ,           R24        Rp?ELgRp?ii ; i  + '       g   i     EL6; i  + '       g   i     EL$; i  + '       g   i     ELý; i  + '       g   i     EL‚; i  + '       g   i     ELp; i)%u_  Post-build housekeeping and completion, returning the SQLite runtime verdict.

Ancillary repairs and notices are best-effort. The profile sync and the config migration run
after a failed build too and never fail the committed update. A config-migration failure is
printed as ``âš ``, recorded as a receipt follow-up and appended to ``followups`` so the tail
stays owed. Profile sync is best-effort per profile (``_sync_profiles_after_update`` prints
that profile's error and carries on); only a sync that escapes the step is owed. An unsafe
runtime withholds success (and is reported) but is not tail work.
r©  c                 óî   <€  V! 4        R #   \         \        3 dX   p\        T4      ;'       g    \        T4      P                  pS! Y4       Se   SP                  Y34        R p?R #  R p?R # R p?ii ; ir  )rD   Ú
SystemExitr   r¢   r£   rº  )r  rG  r¥   Úreasonr  rª  s   &&  €€r   Ú	owed_stepÚ/_run_post_update_maintenance.<locals>.owed_stepÕ  sc   ø€ ð	1ÙŽEøÜœ:Ð&ô 	1Ü˜“X×3Ð3¤ c£×!3Ñ!3ˆFÙ˜DÔ)ØÒ$Ø× Ñ  $ ×0Ò0õ %ûð	1ús   ƒ ŒA4�AA/Á/A4)Ú!_check_and_apply_config_migrationr!   )Úrepair_windows_home_aclÚwindows_home_aclrÙ  u    â„¹ macOS: if Hermes re-prompts for permissions you already granted (toggle shows ON), the stored grant is stale â€” run `tccutil reset ScreenCapture com.nousresearch.hermes` (repeat per affected service), toggle it ON in System Settings, then fully quit & relaunch once.)Úensure_tcc_anchorz macOS TCC anchor refresh skippedT)Úexc_infoz/Post-update state.db integrity check failed: %sN)Úfetch_full_commit_graph)Ú_no_prompt_git_kwargsuA     âœ“ Fetched release history (commits only) for version identityÚstderru)     âš  Could not refresh release history (zB); the version label may be stale or unknown until the next updatez+Model catalog seed during update failed: %s)Úseed_cache_from_checkoutu1     âœ“ Model catalog cache refreshed from checkoutz1Live plugin catalog cache invalidation failed: %sz$Skills sync during update failed: %su   â†’ Syncing bundled skills...Úprofile_syncÚconfig_migrationc                  ó   <€ S ! SSSR 7      # ))Ú
assume_yesÚgateway_modeÚpre_update_snapshot_idr4   )r  r   r!  r"  s   €€€€r   r  Ú._run_post_update_maintenance.<locals>.<lambda>  s   ø€ Ñ*KØ¨LÐQgõ+r   )Úconsume_rewritten_noticeÚ!recorded_standalone_warning_lineszPost-update notices failed: %srä   Úsqlite_runtimez2the selected Python links an unsafe SQLite runtimezrun the installer againr¯  éÿÿÿÿ),r±  rª  r"   r  r!   Úhermes_cli.update_windows_aclr  rÞ   rB  rG   Úhermes_cli.macos_tcc_anchorr  rD   r    ræ   r   r  Úhermes_cli.gitlockr  r  r   rÀ   rc   rF  ÚSubprocessErrorrm  r   r\   rz   r¢   r£   Úhermes_cli.model_catalogr  r  r-  rÒ  rê   rÚ   r   Ú!hermes_cli.gateway_multiplex_moder$  r%  r  rå   )r   r!  r"  Úhad_desktop_app_before_updaterí   r  r  r  r!   r  r  r  r  r¥   Údetailr  Úupdate_completer$  r%  r}   r  rª  s   ddd$$$d             @@r   Ú_run_post_update_maintenancer1  Æ  sß  ý€ õ :ö1÷ LÝEÙÐ Ð"9Ô:ô ‡|�|�xÔ×$AÜŒÜð*ô	
ðHåAÙÔô
 
ÐG×	HÕ	HÜ1Ô3÷ 
Ið
IÝ>Ý?Ù"¤4©«×(9Ñ(9Ó#:ÑVÑ>SÓ>U×VÐVÜÐUÔVô 
ÐC×	DÕ	DÝEÙ#¡B£D×$5Ñ$5×6Ò6ÜÐEÔF÷ 
Eô 
ÐI×	JÕ	JÜ.Ô0÷ 
Kô 
Ð<×	=Õ	=ÜŒÜÐ-Ô.Ü)Ô+÷ 
>ñ
 ˆnÔ9Ô:áÐ ÷ #ô ô 
„GÜ7Ð8J×8zÐ8zÔNfÐgyÓNzÓ{€Oô 
”)×	Õ	ßqØWÑ.Ó0ÐWÑ3TÓ3VÓWˆDÜ�$ŽKñ X÷ 
ô
 
Ð6×	7Õ	7Ü1Ô3÷ 
8÷ Ð 2× ;Ð ;°e×GÑGÈ×NÒNÙÐ(Ð*^Ø7õ	9àÐøôs ô HÜ�‰Ð7À$ˆ×GðHú÷ 
I×	HÐ	Hûô ”Z×/Ñ/Ð0ô IÜ˜#˜x¨Ó.×:Ð:´#°c³(×AÑAÓC×NÑNÓPÐQSÐQTÐU×mÐmÔZ^Ð_bÓZc×ZlÑZlÐYmˆÜÐ9¸&À½)¸ð  EGð  H÷  	Iò  	IûðIú÷
 
E×	DÐ	Dú÷ 
K×	JÐ	Jú÷ 
>×	=Ð	=ú÷ 
×	Ð	ú÷
 
8×	7Ð	7úsz   ÁI+ Á>JÂAJ( Ã(/MÄ2MÅ M,Ç+N È"NÉ+"JÊJÊJ%	Ê(MËAL<Ì	-L<Ì<MÍM	ÍM)	Í,M=	Î N	ÎN%	r[   r  )?Ú__doc__ÚloggingÚ
contextlibr   r³   rF  rÞ   Útimer–  Úpathlibr   Útypingr   Úhermes_cli.update_cmd_commonr   rƒ   r   Ú	getLoggerr    r   r‡  rv  r#   r%   r1   r6   r:   rK   rq   r~   ry   r�   r–   r§   r¸   rÃ   rÌ   rÚ   rá   rê   rï   rý   r  r  r  r-  rX  r`  rn  rq  rz  rŽ  r   r¥  r¶  rÀ  rÒ  râ  rð  rö  r  r  r1  r4   r   r   Ú<module>r:     sˆ  ðñó Ý Û 	Û Û 
Û Ý Ý å 5Ý ð 
×	Ò	Ð2Ó	3€õ'ð Ð ð &-Ð "ð
 	Ð
GØ	ÐOðÐ õ
õ8õ'õõdõ<jõZ"õ>õ&'÷ð&ÐRV÷ &õR
>õ
õ	9õ"ò(Dõõ(õ'õ."OõJTõ9õ&-õ&KQõ\-ð 
ˆ5�'˜5 &¨%°¸UØ
ˆF�E˜6 6¨6ØˆWðÐ õõ4õ2õ>.õb)õXIõ0
7õ>õB/õ4?õ<3õõ>'ð
ià+/ðià;?÷iñ ir   