+
    jHàj^C  ã                  ó  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIHt ^ RIH	t	 R t
R RRRRR	R/R
 R llltRRR	R/R R lltRRRR/R R lltRRRR/R R lltR R ltR R ltR R ltR R R lltRRRR/R R lltR R ltR# )!aR  ``hermes plugins update`` plus the provenance verbs around it: ``adopt``, ``trust-update-url`` and the
read-only ``check-updates``; the dashboard update path shares the same pull/re-clone core.

Sibling of :mod:`hermes_cli.plugins_cmd` (the facade re-exports the names other modules use and is
imported late here, never at module level).
)ÚannotationsN)ÚPath)ÚAnyc                 ó   € ^ RI Hp  V # )z`The facade, read at call time: tests patch ``plugins_cmd.<name>`` and sibling calls must see it.©Úplugins_cmd)Ú
hermes_clir   r   s    ÚB/home/ubuntu/.hermes/hermes-agent/hermes_cli/plugins_cmd_update.pyÚ_pcr
      s   € å&ØÐó    ÚinteractiveFÚforceÚscan_decision_cbc               ó(   € V ^8„  d   QhRRRRRRRR/# )é   Útargetr   r   Úboolr   ÚreturnÚstr© )Úformats   "r	   Ú__annotate__r      s1   € ÷ jñ j ð jÐaeð jØ#ðjØGJñjr   c               óp  € \        4       P                  4       pVP                  V P                  / 4      pVP                  R4      RJ d    \        4       P	                  V! V4      4      h^ RIHp	 V	P                  V P                  V 4       V R,          P                  4       '       gv   VP                  R4      p
\        V
\        4      '       d	   V
'       g   \        4       P	                  V! 4       4      hVe   V! 4        \        W
VP                  R4      WVR7      # Ve   V! 4        ^ RIHp V! WWVR	7      # )
uó  Shared ``update`` core: refuse pinned checkouts, ``git pull`` (or re-install from the
recorded source when the tree carries no ``.git`` â€” subdirectory installs), record the new
revision. Returns the pull output; raises :class:`PluginOperationError` on any refusal.
*pinned_msg(install_record)* / *not_git_msg()* build the caller-specific error text. Both paths
scan the candidate tree the same way: *force* or a truthy *scan_decision_cb* accepts a caution
verdict, nothing accepts a dangerous one.ÚpinnedT©Úplugins_cmd_catalogz.gitÚsourceÚrevision)r   r   )Úupdate_plugin)r   r   r   )r
   Ú_read_install_metadataÚgetÚnameÚPluginOperationErrorr   r   Úrefuse_if_installed_removedÚexistsÚ
isinstancer   Ú_reclone_plugin_updateÚhermes_cli.plugins_transactionr   )r   Ú
pinned_msgÚnot_git_msgÚbefore_pullr   r   r   ÚmetadataÚinstall_recordÚcatalogr   r   s   &&&&$$$     r	   Ú_pull_plugin_updater.      sú   € ô ‹u×+Ñ+Ó-€HØ—\‘\ &§+¡+¨rÓ2€NØ×Ñ˜(Ó# tÓ+Ü‹e×(Ñ(©°NÓ)CÓDÐDõ :Ø×'Ñ'¨¯©°VÔ<Ø�V�O×#Ñ#×%Ò%Ø×#Ñ# HÓ-ˆÜ˜&¤#×&Ò&¯fÜ“%×,Ñ,©[«]Ó;Ð;ØÒ"ÙŒMÜ% f°n×6HÑ6HÈÓ6TØ,1ôVð 	VàÒÙŒÝ<á˜ÀÔiÐir   c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R/# )
r   r   r   r   r   Úprevious_revisionÚobjectr   r   r   r   )r   s   "r	   r   r   6   s8   € ÷ Iñ I 4ð I°ð IÈð IÐ[_ð IØ58ñIr   c               óŒ  a a
€ ^ RI Ho
 \        4       P                  VRVVV
V 3R lR7      w  rVp\	        \        4       P                  4       P                  VP                  / 4      P                  R4      ;'       g    R4      p\        V\        4      '       d   TMRp	V'       d	   W‰8X  d   R# RV R	V	R
,           RVR
,           2# )a³  Update a subdirectory install by re-cloning its source and atomically replacing the tree.

These installs carry no local ``.git``, so the staged replacement also carries user-owned
config/data from *target* before publication instead of silently deleting it (#122006).
Replacing the tree needs the install core's ``force``; accepting a caution scan is a separate
decision (*force* / *scan_decision_cb*), the same as the git-pull path.
)Ú_carry_user_filesTc                ó   <€ S! SVR 4      # ©Nr   )Ú	_manifestÚtreer3   r   s   &&€€r	   Ú<lambda>Ú(_reclone_plugin_update.<locals>.<lambda>F   s   ø€ Ñ,=¸fÀdÈDÔ,Qr   )r   Úaccept_cautionr   Úbefore_swapr   Ú zAlready up to date.zRe-installed from z: :Né   Nz..)	Úhermes_cli.plugins_cmd_catalogr3   r
   Ú_install_plugin_corer   r   r    r!   r%   )r   r   r0   r   r   Ú
new_targetr6   Ú_namer   Úpreviousr3   s   f&&$$     @r	   r&   r&   6   s±   ù€ õ Aä#&£5×#=Ñ#=ØØØØ)ÝQð $>ó $Ñ €J˜5ô ”3“5×/Ñ/Ó1×5Ñ5°j·o±oÀrÓJ×NÑNÈzÓZ×`Ð`Ð^`Óa€HÜ$.Ð/@Ä#×$FÒ$FÑ ÈB€Hß�HÔ(Ù$Ø ˜x r¨(°2­,¨°r¸(À2½,¸ÐHÐHr   Tc          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   r!   r   r   r   r   r   r   r   r   )r   s   "r	   r   r   O   s1   € ÷ 2ñ 2�Sð 2 $ð 2Àð 2ÐUYð 2Ðfjñ 2r   c               ó6  a aa€ ^ RI Ho ^ RIHp ^ RIHp VP                  V4      pV'       d   VP                  S WSVR7      # \        TVV 3R lV 3R lVV 3R lTTV'       d
   V! SR4      MR	R
7      p\        VS4       \        4       P                  V4      p	V	P                  R4      ;'       g    VP                  p
\        4       P                  Wš4      pV'       db   ^ RIHpHp V! W«4      '       g   V! W«4      '       d>   V'       d   \        4       P%                  SW«RR7       MSP'                  RV
 RV
 R24       VP)                  4       pRV9   d   SP'                  RS  R24       R# SP'                  RS  R24       SP'                  RV R24       R# )a  Update one installed plugin, printing progress and consent prompts; True when it moved.

Every update is scanned. A caution verdict on a git update asks ``Update anyway? [y/N]`` when
*interactive*; *force* (``--force``) accepts it without asking. A dangerous verdict always blocks.
Refusals raise :class:`~hermes_cli.plugins_cmd_catalog.RepinConsentRequired` or
``PluginOperationError`` with nothing changed; :func:`cmd_update` turns them into exit 1 and
``hermes plugins update`` with no name records them per plugin and moves on.
)Úescaper   )Úinteractive_scan_decision)r   c                óx   <€ R S RV P                  R4       RS! \        V P                  RR4      4      4       R2# )úPlugin 'ú' is pinned to r   z*. To move it, run `hermes plugins install r   ú<source>z* --force --ref <40-character commit SHA>`.)r    r   )ÚrecrE   r!   s   &€€r	   r8   Úupdate_one.<locals>.<lambda>`   sF   ø€ Ø�t�f˜O¨C¯G©G°JÓ,?Ð+@ð A'Ù'-¬c°#·'±'¸(ÀJÓ2OÓ.PÓ'QÐ&Rð S0ñ0r   c                 ó   <€ R S  R2# )rH   z@' was not installed from git (no .git directory). Cannot update.r   ©r!   s   €r	   r8   rL   d   s   ø€ �(˜4˜&Ð `Ñar   c                 ó.   <€ S P                  R S R24      # )z[dim]Updating z	...[/dim])Úprint)Úconsoler!   s   €€r	   r8   rL   e   s   ø€ ˜GŸM™M¨N¸4¸&À	Ð*JÔKr   ÚUpdateN)r*   r   r   r   r!   )Údeclared_set_changedÚpending_capabilitiesÚupdate)Úcontextz[yellow]Plugin zE has new capabilities; review them with `hermes plugins capabilities z`.[/yellow]úAlready up to dateu    [green]âœ“[/green] Plugin [bold]z[/bold] is already up to date.Fz[/bold] updated.z[dim]ú[/dim]T)Úrich.markuprE   r   r   Úhermes_cli.plugins_cmd_installrF   Úcatalog_install_recordÚcmd_update_catalogr.   Ú_post_pull_housekeepingr
   Ú_read_manifestr    r!   Ú$_declared_capabilities_from_manifestÚhermes_cli.plugin_capabilitiesrS   rT   Ú_run_capability_consentrP   Ústrip)r!   r   rQ   r   r   r-   rF   ÚsidecarÚoutputÚupdated_manifestÚ	plugin_idÚdeclared_capsrS   rT   ÚoutrE   s   f&f$$          @r	   Ú
update_oneri   O   sƒ  ú€ õ #Ý9ÝHØ×,Ñ,¨VÓ4€GßØ×)Ñ)¨$°ÀÐVaÐ)ÓbÐbÜ Øõ	1ô 	bÝKØØßITÑ2°7¸HÔEÐZ^ô
`€Fô ˜F GÔ,ô “u×+Ñ+¨FÓ3ÐØ ×$Ñ$ VÓ,×;Ð;°·±€IÜ“E×>Ñ>Ð?OÓ[€Mßß]Ù 	×9Ò9Ñ=QÐR[×=kÒ=kßÜ“×-Ñ-¨g°yÐYaÐ-Õbà—‘ °	¨{Ð:ð  AJð  @Kð  KVð  Wô  Xà
�,‰,‹.€CØ˜sÔ"Ø�‰Ð8¸¸Ð>\Ð]Ô^ÙØ‡M�MÐ4°T°FÐ:JÐKÔLØ‡M�M�E˜#˜˜fÐ%Ô&Ùr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r!   r   r   r   r   r   ÚNoner   )r   s   "r	   r   r   „   s(   € ÷ 9ñ 9�Sð 9¨$ð 9¸dð 9Ètñ 9r   c               ó(  € ^ RI Hp \        4       P                  4       p\        4       P	                  V \        4       P                  4       V4      p \        WWAVR7       R#   T d,   p\        4       P                  TRT  RT 24        Rp?R# Rp?i\        4       P                   d)   p\        4       P                  TRT 24        Rp?R# Rp?i\        4       P                   d)   p\        4       P                  TRT 24        Rp?R# Rp?ii ; i)zT``hermes plugins update <name> [--force]``: :func:`update_one`, exit 1 on a refusal.)ÚRepinConsentRequired)r   r   z[yellow]Update of z not applied:[/yellow] Nz[red]Blocked:[/red] z[red]Error:[/red] )
r>   rm   r
   Ú_consoleÚ_require_installed_pluginÚ_plugins_dirri   Ú_failÚPluginScanBlockedr"   )r!   r   r   rm   rQ   r   Úexcs   &$$    r	   Ú
cmd_updatert   „   sÐ   € åCÜ‹e�n‰nÓ€GÜ‹U×,Ñ,¨T´3³5×3EÑ3EÓ3GÈÓQ€Fð9Ü�4 È×OøØô VÜ‹�‰�GÐ1°$°Ð7NÈsÈeÐT×UÒUûÜ‹5×"Ñ"ô ;Ü‹�‰�GÐ3°C°5Ð9×:Ò:ûÜ‹5×%Ñ%ô 9Ü‹�‰�GÐ1°#°Ð7×8Ò8ûð9ús0   ÁA! Á!DÁ( BÂDÂ*CÃDÃ)DÄDc               ó    € V ^8„  d   QhRRRR/# )r   r   r   r   rk   r   )r   s   "r	   r   r   “   s   € ÷ /ñ / Dð /°dñ /r   c                óN   € \        V 4       \        4       P                  W4       R# )zFAfter publication: drop stale bytecode and copy any new example files.N)Ú_clear_plugin_bytecoder
   Ú_copy_example_files)r   rQ   s   &&r	   r]   r]   “   s   € ô ˜6Ô"ÜƒE×Ñ˜fÖ.r   c               ó    € V ^8„  d   QhRRRR/# ©r   r!   r   r   rk   r   )r   s   "r	   r   r   ›   s   € ÷ 7ñ 7�Cð 7˜Dñ 7r   c           	     óX  a€ ^ RI Hp V! 4       p\        4       P                  4       p\        4       P	                  WV4      o^ RIHpHp \        V3R lV! V4       4       R4      pVf,   VP                  RV  R24       \        P                  ! ^4       VP                  VP                  JdC   VP                  RV  RVP                  P                   R24       \        P                  ! ^4       VP                  '       g,   VP                  RV  R	24       \        P                  ! ^4        \        4       P!                  VP                  4       \        4       P%                  4       pSP&                  V9   d,   VP                  RV  R24       \        P                  ! ^4       \        4       P)                  4       p	V	'       d   \        4       P+                  SV	4      MRp
RRRV
R\        4       P-                  VP                  R4      /VSP&                  &   \        4       P/                  V4       TP                  RT  RVP                   RV
R,          ;'       g    R R24       R#   \"         d6   pTP                  R
T 24       \        P                  ! ^4        Rp?ELSRp?ii ; i)u	  Adopt a self-cloned plugin dir into the provenance sidecar.

Reads the dir's git origin URL, validates it, writes the sidecar row
â€” from then on a normal git install (check-updates + update). The
ONLY mutation path for self-cloned dirs (settled: explicit verbs).
©ÚConsole)ÚProvenanceClassÚplugins_provenancec              3  ó`   <"  € T F#  qP                   SP                   8X  g   K  Vx € K%  	  R # 5ir5   rN   )Ú.0Úpr   s   & €r	   Ú	<genexpr>Úcmd_adopt.<locals>.<genexpr>ª   s"   øé € ÐUÑ;�q¿v¹vÈÏÉÑ?T—’Ó;ùs   ƒ.¤
.Nú[red]Error:[/red] Plugin 'z' not classifiable.z' is u0   , not self-cloned â€” there is nothing to adopt.zU' has no readable git origin remote. Add one (git remote add origin <url>) and retry.z;[red]Error:[/red] The dir's origin url is not installable: z' already has a provenance row.r<   r   Fr   r   u!   [green]âœ“[/green] Adopted [bold]z[/bold] (source: z, revision: ºNé   NÚunknownz#). It is now a tracked git install.)Úrich.consoler}   r
   rp   ro   Úhermes_cli.plugins_provenancer~   r   ÚnextrP   ÚsysÚexitÚklassÚSELF_CLONEDÚvalueÚ
origin_urlÚ_resolve_git_urlÚ
ValueErrorr   r!   Ú_resolve_git_executableÚ_git_head_revisionÚ_canonical_sourceÚ_write_install_metadata)r!   r}   rQ   Úplugins_dirr~   r   ÚprovÚer+   Úgit_exer   r   s   &          @r	   Ú	cmd_adoptrœ   ›   s3  ø€ õ %á‹i€GÜ“%×$Ñ$Ó&€KÜ‹U×,Ñ,¨TÀÓH€FçQäÔUÑ.¨{Ô;ÓUÐW[Ó\€DØ‚|Ø�‰Ð2°4°&Ð8KÐLÔMÜ�Š�ŒØ‡z�z˜×4Ñ4Ó4Ø�‰Ø(¨¨¨e°D·J±J×4DÑ4DÐ3Eð F9ð 9ô	
ô 	�Š�ŒØ�?�?ˆ?Ø�‰Ø(¨¨ð /Gð Gô	
ô 	�Š�ŒðÜ‹×Ñ˜tŸ™Ô/ô
 ‹u×+Ñ+Ó-€HØ‡{�{�hÔØ�‰Ð2°4°&Ð8WÐXÔYÜ�Š�Œä‹e×+Ñ+Ó-€Gß<CŒs‹u×'Ñ'¨°Ô8È€Hà�%Ø�HØ”#“%×)Ñ)¨$¯/©/¸4Ó@ð€HˆV�[‰[Ñô
 ƒE×!Ñ! (Ô+Ø‡M�MØ
+¨D¨6ð 2Ø—O‘OÐ$ L°¸#µ×1KÐ1KÀ)Ð0Lð M+ð	+öøô# ô Ø�‰ÐSÐTUÐSVÐWÔXÜ�Š��Šûðús   Ä.#I) É)J)É4*J$Ê$J)c               ó    € V ^8„  d   QhRRRR/# rz   r   )r   s   "r	   r   r   Õ   s   € ÷ 0ñ 0˜sð 0 tñ 0r   c           	     ó¨  € ^ RI Hp V! 4       p\        4       P                  4       p\        4       P	                  WV4      p^ RIHp V! V4      pVP                  VP                  4      p\        V\        4      '       g,   VP                  RV  R24       \        P                  ! ^4       VP                  R4      ;'       g    Rp\        4       P                  V4      p	T	;'       g    / P                  R4      ;'       g    Rp
W¨8X  d   VP                  RV  R24       R# V
e   ^ R	IHp  V! V
4      p
W§R&   WvVP                  &   \        4       P%                  V4       TP                  RT  RT;'       g    R RT
;'       g    R 24       R#   \"         d9   pTP                  RT  R
T R24       \        P                  ! ^4        Rp?L™Rp?ii ; i)uñ   The ONLY path that moves a saved update_url tag.

A needs-fixing mismatch (manifest update_url vs the saved tag) is
resolved here: confirms the manifest's url into the sidecar row,
prints old â†’ new. Refuses when there is nothing to trust.
r|   )Úread_sidecar_rowsr…   uC   ' has no provenance row â€” nothing to trust. Reinstall it instead.Ú
update_urlNz$[yellow]Nothing to trust:[/yellow] 'z' has no update_url mismatch.)Úhttps_update_urlz' z. Not trusted.u!   [green]âœ“[/green] Trusted [bold]z[/bold] update_url:
  old: z(none)z
  new: )r‰   r}   r
   rp   ro   rŠ   rŸ   r    r!   r%   ÚdictrP   rŒ   r�   r^   Úhermes_cli.plugins_updatesr¡   r“   r—   )r!   r}   rQ   r˜   r   rŸ   ÚrowsÚrowÚsavedÚmanifestÚclaimedr¡   rs   s   &            r	   Úcmd_trust_update_urlr©   Õ   s­  € õ %á‹i€GÜ“%×$Ñ$Ó&€KÜ‹U×,Ñ,¨TÀÓH€Få?á˜[Ó)€DØ
�(‰(�6—;‘;Ó
€CÜ�cœ4× Ò Ø�‰Ø(¨¨ð /6ð 6ô	
ô 	�Š�Œà�G‰G�LÓ!×)Ð) T€EÜ‹u×#Ñ# FÓ+€HØ�~ˆ~˜2×"Ñ" <Ó0×8Ð8°D€GØÔØ�‰Ø2°4°&ð 9#ð #ô	
ñ 	ØÒÝ?ð	Ù& wÓ/ˆGð
  ˆÑØˆ�‰ÑÜƒE×!Ñ! $Ô'Ø‡M�MØ
+¨D¨6ð 2Ø×#Ð#˜8Ð$ð %Ø×%Ð%˜XÐ&ð	(öøô ô 	Ø�M‰MÐ6°t°f¸B¸s¸eÀ>ÐRÔSÜ�HŠH�Q�K‰Kûð	ús   Ä+F ÆGÆ.GÇGc               ó    € V ^8„  d   QhRRRR/# )r   Úargsz
Any | Noner   rk   r   )r   s   "r	   r   r     s   € ÷ *Dñ *D˜Jð *D°$ñ *Dr   c           	     ó  € ^ RI Hp ^ RIHp V! 4       p\	        4       P                  4       p^ RIHp ^ RIH	pH
p V! V4      pV! V4      p	V! W˜4       \        V RR4      '       dA   \        \        P                  ! V	 U
u. uF  qªP                  4       NK  	  up
^R7      4       R# V! R	RR
7      pVP!                  RRR7       VP!                  RRR7       VP!                  R4       VP!                  R4       VP!                  R4       V	 F´  p
V
P"                  '       d   RV
P"                   R2pM6V
P$                  RJ d   RpM#V
P$                  RJ d   RpMRV
P&                   R2pTP)                  V
P*                  V
P,                  V
P.                  ;'       g    RR,          V
P0                  ;'       g    RV4       K¶  	  VP                  4        VP                  V4       VP                  4        VP                  R4       R# u up
i )z;Read-only: is any installed plugin outdated? NEVER mutates.r|   )ÚTable)Ú
run_checks)Úrecord_check_resultsÚsnapshot_installsÚjsonF)ÚindentNzPlugin updates)ÚtitleÚ
show_linesÚNameÚbold)ÚstyleÚClassÚdimÚCurrentÚLatestÚStatusz[red]needs fixing[/red]
[dim]rX   Tz[green]update available[/green]z[dim]up to date[/dim]z[yellow]unknown[/yellow]
[dim]Ú-r†   zl[dim]Check-only. Apply with: hermes plugins update <name>, or hermes plugins update to update them all[/dim])r‰   r}   Ú
rich.tabler­   r
   rp   r£   r®   Úhermes_cli.plugins_cadencer¯   r°   ÚgetattrrP   r±   ÚdumpsÚto_jsonÚ
add_columnÚneeds_fixingÚupdate_availableÚreasonÚadd_rowr!   rŽ   ÚcurrentÚlatest)r«   r}   r­   rQ   r˜   r®   r¯   r°   Úchecked_installsÚresultsÚrÚtableÚstatuss   &            r	   Úcmd_check_updatesrÏ     s§  € å$Ý á‹i€GÜ“%×$Ñ$Ó&€Kå5çRá(¨Ó5ÐÙ˜Ó%€GÙ˜Ô3äˆt�V˜U×#Ò#ÜŒd�jŠj©wÓ7©w¨!Ÿ)™)ž+©wÑ7ÀÔBÔCÙáÐ(°UÔ;€EØ	×Ñ�V 6ÐÔ*Ø	×Ñ�W EÐÔ*Ø	×Ñ�YÔØ	×Ñ�XÔØ	×Ñ�XÔÛˆØ�>�>ˆ>Ø5°a·n±nÐ5EÀVÐL‰FØ×Ñ 4Ó'Ø6‰FØ×Ñ 5Ó(Ø,‰Fà6°q·x±x°jÀÐGˆFØ�‰Ø�F‰F�A—G‘G˜aŸi™i×.Ð.¨3°Õ4°a·h±h·o°oÀ#Àvö	
ñ ð ‡M�M„OØ‡M�M�%ÔØ‡M�M„OØ‡M�Mð Cö Dùò1 8s   Á>HÚaccept_capabilitiesc               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r!   r   rÐ   r   r   r   zdict[str, Any]r   )r   s   "r	   r   r   5  s0   € ÷ *Zñ *Z sð *ZÀDð *ZÐY]ð *ZÐjxñ *Zr   c               óî  a € ^ RI Hp ^ RIHp ^ RIHp \        4       P                  S 4      pVf$   RRRRS  R	\        4       P                  4        R
2/# VP                  V4      p V'       d×   TP                  YgV'       d   R MRR7      p\        VP                  4      p	VP                  VP                  ,          p
VP                  '       d   \        4       P!                  W©4      M. pVP                  '       d   V! VP                  4      M/ pRRRVP                  RVP"                  RVP                  '       * RVRV	/VC# \%        VV 3R lV 3R lVR7      p\5        T\        4       P7                  4       4       RT9   pT'       d   / MT! TP*                  4      pRRRS RTRT/TC#   TP&                   d[   pRRRRR\)        T4      RTP*                  RTP"                  RTP,                  RTP/                  TP,                  4      /u Rp?# Rp?i\        4       P0                   d   p/ T! T4      CRS /Cu Rp?# Rp?i\        4       P2                   d   pRRR\)        T4      /u Rp?# Rp?ii ; i)a  The one non-interactive update for the dashboard and Desktop: ``git pull`` inside
``~/.hermes/plugins/<name>``; catalog installs re-pin instead. Nothing changes on a refusal:
a re-pin that widens the plugin returns ``{"ok": False, "consent_required": True, "delta": {...}}``
(retry with *accept_capabilities*), and a git update the security scan blocks returns
``{"ok": False, "scan_blocked": True, "scan_verdict", "scan_findings"}`` (retry a caution verdict
with *force* after the user saw the findings; a dangerous verdict never updates).r   )Úactivate_plugin_now)Úscan_blocked_resultNÚokFÚerrorrH   z' was not found under Ú.c                ó   € R # )Tr   )Ú_deltas   &r	   r8   Ú.dashboard_update_user_plugin.<locals>.<lambda>F  s   € ¹Dr   )Ú
consent_cbTr!   ÚshaÚ	unchangedÚpython_dependenciesÚwarningsc           	     óZ   <€ R S RV P                  R4       RV P                  RR4       R2# )rH   rI   r   z; run `hermes plugins install r   rJ   z5 --force --ref <40-character commit SHA>` to move it.)r    )rK   r!   s   &€r	   r8   rÚ   O  s<   ø€ Ø˜4˜& °·±¸
Ó0CÐ/Dð E/Ø/2¯w©w°xÀÓ/LÐ.Mð N?ñ?r   c                 ó   <€ R S  R2# )rH   z-' is not a git checkout; cannot pull updates.r   rN   s   €r	   r8   rÚ   S  s   ø€ �h˜t˜fÐ$QÑRr   )r   Úconsent_requiredÚdeltaÚdelta_linesrW   rd   )r   r   Úhermes_cli.plugins_activationrÓ   rZ   rÔ   r
   Ú_user_installed_plugin_dirrp   r[   Úrepin_catalog_pluginÚlistrß   ÚparentÚinstalled_nameÚchangedÚ_python_dependency_summaryrÜ   r.   rm   r   r!   rã   Úsurface_delta_linesrr   r"   r]   rn   )r!   rÐ   r   r-   rÓ   rÔ   r   rc   Úresultrß   r@   ÚdepsÚ	activatedÚmsgrs   rÝ   s   f$$             r	   Údashboard_update_user_pluginrò   5  sK  ø€ õ :ÝAÝBÜ‹U×-Ñ-¨dÓ3€FØ‚~Ø�e˜W¨°°Ð6LÌSËU×M_ÑM_ÓMaÐLbÐbcÐ&dÐeÐeØ×,Ñ,¨VÓ4€Gð0ßØ×1Ñ1Ø×EXÒ-@Ð^bð 2ó dˆFä˜FŸO™OÓ,ˆHØŸ™¨×)>Ñ)>Õ>ˆJØMSÏ^Ï^È^”3“5×3Ñ3°JÔIÐacˆDØFLÇnÇnÀnÑ+¨F×,AÑ,AÔBÐZ\ˆIØ˜$ ¨×(=Ñ(=¸uÀfÇjÁjÐR]Ðci×cqÑcqÔ_qØ)¨4°¸XðTØIRðTð Tä!Øô@ô SØôˆô ˜F¤C£E§N¡NÓ$4Ô5Ø$¨Ñ+€Iß‘Ñ%8¸¿¹Ó%E€IØ�$˜  h°°[À)ÐYÈyÐYÐYøð ×'Ñ'ô [Ø�eÐ/°°wÄÀCÃÈ&ÐRU×RZÑRZÐ\aÐcf×cjÑcjØ˜Ÿ™ M°7×3NÑ3NÈsÏyÉyÓ3Yð[õ 	[ûä‹5×"Ñ"ô :Ø9Ñ% cÓ*Ð9¨F°DÑ9Õ9ûÜ‹5×%Ñ%ô 0Ø�e˜W¤c¨#£hÐ/Õ/ûð0úsW   Á&F* Á.BF* Ã=AF* ÅF* Æ*I4Æ;AHÈ
I4ÈI4È,H?È9I4È?I4ÉI/É)I4É/I4c               ó    € V ^8„  d   QhRRRR/# )r   r   r   r   Úintr   )r   s   "r	   r   r   b  s   € ÷ ñ  4ð ¨Cñ r   c                ó   € ^ p V P                  R4       FS  pVP                  4       '       g   K  \        P                  ! VRR7       YP	                  4       '       d   ^ M^,          pKU  	  V#   \
         d     T# i ; i)zÿRemove ``__pycache__`` dirs under a just-updated plugin checkout. Plugin dirs sit outside
the repo, so the launch-time bytecode sweep never covers them and stale bytecode after a pull
can ImportError in the next process. Never raises.

See #60242, #6207.
Ú__pycache__T)Úignore_errors)ÚrglobÚis_dirÚshutilÚrmtreer$   ÚOSError)r   ÚremovedÚ	cache_dirs   &  r	   rw   rw   b  sv   € ð €GðØŸ™ mÖ4ˆIØ×Ñ×!Ô!Ü—’˜i°tÕ<Ø× 0Ñ 0× 2Ò 2™1¸Õ9’ñ 5ð €Nøô ô ØØ€Nðús   „'A. °<A. Á.A=Á<A=r5   )Ú__doc__Ú
__future__r   r±   rú   rŒ   Úpathlibr   Útypingr   r
   r.   r&   ri   rt   r]   rœ   r©   rÏ   rò   rw   r   r   r	   Ú<module>r     s¿   ðñõ #ã Û Û 
Ý Ý òñjÐhmð jØ&+ðjØ>B÷jð jð>IÐbgð IØ,0÷Ið22Èð 2Ð\a÷ 2ðj9°ð 9ÀU÷ 9õ/õ7õt0÷f*DðZ*ZÈ5ð *ZÐ`e÷ *Z÷Zr   