+
    jHàjw…  ã                  ó<  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIHtHt ^ RI	H
t
HtHtHt ^ RIHtHtHt ]P&                  ! ]4      t]
 ! R R4      4       t]
 ! R R	4      4       tRER
 R lltRRRRRRRRRRRR/tRRRRRRRRRRRR/tRFt]! RR04      tR R ltR R ltRGR R llt ]R R  l4       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/ R0 lt)R1 R2 lt*R3 R4 lt+R5 R6 lt,R7 R8 lt-R9 R: lt.R;RR<RR=RR>R/R? R@ llt/RA RB lt0RC RD lt1R# )HaM  Runtime inventory + update plan for the fleet-update pipeline.

One read-only pass answering, BEFORE any mutation: which Hermes runtimes run on this machine, how
each is deployed, which ones this update touches, and how each restarts. Every collector is a
side-effect-free probe, so ``hermes update --plan`` is safe on a live fleet.
)ÚannotationsN)ÚcontextmanagerÚsuppress)Ú	dataclassÚfieldÚasdictÚfields)ÚAnyÚCallableÚOptionalc                  ó’   € ] tR t^t$ RtR]R&   R]R&   RtR]R&   RtR]R	&   RtR
]R&   Rt	R
]R&   Rt
R]R&   ]! ]R7      tR]R&   RtR# )ÚRuntimeRecordz9One running (or expected) Hermes runtime on this machine.ÚstrÚkindÚprofileNúOptional[int]ÚpidÚmanualÚ
supervisorúOptional[str]Úcode_shaÚcode_versionÚ Úrestart_via©Údefault_factoryÚdictÚdetail© )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__r   r   r   r   r   r   r   r   Ú__static_attributes__r   ó    Ú@/home/ubuntu/.hermes/hermes-agent/hermes_cli/update_inventory.pyr   r      sP   ‡ áCà
ƒIØƒLØ€CˆÓØ€J�ÓØ"€HˆmÓ"à"&€L�-Ó&Ø€K�ÓÙ¨Ô.€FˆD×.r&   r   c                  ó¼   € ] tR t^#t$ RtRtR]R&   RtR]R&   RtR]R	&   R
t	R]R&   R
t
R]R&   ]! ]R7      tR]R&   ]! ]R7      tR]R&   R R lt]R R l4       tRtR
# )Ú
UpdatePlanz@The full pre-update picture: install shape + runtimes + actions.Úunknownr   Úinstall_methodTÚboolÚupdatable_in_placezhermes updateÚupdate_mechanismNr   Úexpected_shaÚexpected_versionr   ÚlistÚprofilesÚruntimesc               ó   € V ^8„  d   QhRR/# )é   Úreturnúdict[str, Any]r   )Úformats   "r'   Ú__annotate__ÚUpdatePlan.__annotate__/   s   € ÷ ñ ˜ñ r&   c                	ó   € \        V 4      # ©N)r   )Úselfs   &r'   Úto_dictÚUpdatePlan.to_dict/   s   € Ü�d‹|Ðr&   c               ó    € V ^8„  d   QhRRRR/# )r5   Údatar7   r6   r)   r   )r8   s   "r'   r9   r:   3   s   € ÷ 	ñ 	˜^ð 	°
ñ 	r&   c                óH  € \        V 4       Uu0 uF  q"P                  kK  	  ppT ! R/ VP                  4        UUu/ uF  w  rEWC9   g   K  VR8w  g   K  WEbK  	  uppB p\        \        4       Uu0 uF  q"P                  kK  	  ppVP	                  R4      ;'       g    .  UUUu. uFP  p\        V\        4      '       g   K  \        R/ VP                  4        UUu/ uF  w  rEWG9   g   K  WEbK  	  uppB NKR  	  upppVn        V# u upi u uppi u upi u uppi u upppi )zMInverse of :meth:`to_dict` (the plan crosses the post-swap hand-off as JSON).r3   r   )Údataclass_fieldsÚnameÚitemsr   ÚgetÚ
isinstancer   r3   )	ÚclsrA   ÚfÚfields_ÚkÚvÚplanÚrecord_fieldsÚrs	   &&       r'   Ú	from_dictÚUpdatePlan.from_dict2   sõ   € ô $4°CÔ#8Ó9Ñ#8˜a—6”6Ñ#8ˆÐ9ÙÑY t§z¡z¤|ÔX¡|™t˜q°q±|”dÈÈZÉ”d�a’d¡|ÒXÑYˆÜ)9¼-Ô)HÓIÑ)H AŸœÑ)HˆÐIð —X‘X˜jÓ)×/Ð/¨RÐ/õ
á/�´:¸aÄ×3Fô PŒMÑO¨a¯g©g¬iÔN©i¡d a¸1Ñ;MœT˜QšT©iÒNÔOÙ/ó
ˆŒð ˆùò :ùÛXùÚIùãNùô
s@   ŽD»
DÁ
DÁDÁ0DÂ%DÃDÃ
DÃ+DÃ1
DÄDr   )r   r    r!   r"   r#   r+   r$   r-   r.   r/   r0   r   r1   r2   r3   r>   ÚclassmethodrP   r%   r   r&   r'   r)   r)   #   sq   ‡ áJà#€N�CÓ#Ø#Ð˜Ó#Ø+Ð�cÓ+Ø"&€L�-Ó&Ø&*Ð�mÓ*Ù¨4Ô0€HˆdÓ0Ù¨4Ô0€HˆdÓ0õð ô	ó ô	r&   r)   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r5   r   ÚintÚservice_pidsÚsetÚwindows_service_pidsú
set | Noner6   r   r   )r8   s   "r'   r9   r9   ?   s*   € ÷ ñ  Cð °sð ÐR\ð Ðhkñ r&   c                ó  € V'       d	   W9   d   R# W9  d   R# \        \        4      ;_uu_ 4        ^ RIHpHp V! 4       '       d    RRR4       R# V! 4       '       d    RRR4       R#  RRR4       R#   + '       g   i     R# ; i)z.Classify how a live gateway PID is supervised.úwindows-servicer   )Úis_macosÚsupports_systemd_servicesNÚsystemdÚlaunchdÚservice)r   Ú	ExceptionÚhermes_cli.gatewayr[   r\   )r   rU   rW   r[   r\   s   &&&  r'   Ú_detect_supervisor_for_pidrb   ?   sk   € ç Ô ;ñ !Ø
ÔÙÜ	”)×	Õ	ßJá$×&Ò&Ø÷	 
Ñ	ñ
 �:Š:Ø÷ 
Ñ	ð
 ÷ 
ñ ÷ 
Ö	ñ ús   °A4ÁA4ÁA4Á4B	r]   r^   ÚdesktoprZ   úmanual-serveúrespawn-argvúdesktop-sshz6systemctl restart (drain-first SIGUSR1 when supported)z6launchctl kickstart -k (drain-first, per-label domain)z&Desktop app respawns its serve backendz;sc.exe stop before venv mutation, sc.exe start after updatez9stop before code swap, relaunch with recorded launch argszJthe remote Desktop that spawned it over SSH respawns it when it reconnectsc               ó$   € V ^8„  d   QhRRRRRR/# )r5   r   r   r   r6   r   )r8   s   "r'   r9   r9   k   s!   € ÷ 9ñ 9 3ð 9°ð 9¸ñ 9r&   c                ó.   € \         P                  V R4      # )u\  Machine-readable restart mechanism id for a runtime.

THE policy table (#91277 Phase 2): restart execution consumes these ids via
:func:`match_runtime_outcomes` / the update's restart phase, and the receipt records per-runtime
outcomes against them. Display strings are derived by :func:`describe_restart_mechanism` â€” never the
other way around.
r   )Ú_RESTART_MECHANISMSrF   )r   r   s   &&r'   Ú_restart_mechanismrj   k   s   € ô ×"Ñ" :¨xÓ8Ð8r&   c               ó$   € V ^8„  d   QhRRRRRR/# )r5   Ú	mechanismr   r   r6   r   )r8   s   "r'   r9   r9   v   s!   € ÷ ñ ¨#ð ¸ð Àñ r&   c                óZ   € \         P                  V 4      ;'       g    VR8w  d   RV R2# R# )z5Human-readable description of a restart mechanism id.Údefaultz
hermes -p z gateway restartzhermes gateway restart)Ú_MECHANISM_DESCRIPTIONSrF   )rl   r   s   &&r'   Údescribe_restart_mechanismrp   v   s;   € ä"×&Ñ& yÓ1÷ ð Ø29¸YÔ2Fˆ*�W�IÐ-Ð.ðØLdðr&   c               ó8   € V ^8„  d   QhRRRRRRRRRRR	RR
RRR/# )r5   r   r   r   r   r   r   r   r	   r   Úextrar6   r   r   )r8   s   "r'   r9   r9   }   sN   € ÷ 	ñ 	Ø
ð	Øð	Ø"/ð	Ø=@ð	àð	à(+ð	à=@ð	ð ñ	r&   c                ól   € \        R	RT RTRTRTRV'       d   \        V4      MRRVR\        W14      /VB # )
zJA :class:`RuntimeRecord` with ``restart_via`` derived from its supervisor.r   r   r   r   r   Nr   r   r   )r   r   rj   )r   r   r   r   r   r   rr   s   &&&&&&,r'   Ú_runtimert   }   sd   € ô
 ñ ØðØ"ðØ(+ðØ8Bðç"*”�X”°ðàCOðô ' zÓ;ðð @Eñð r&   c               ó   € V ^8„  d   QhRR/# )r5   Úlabelr   r   )r8   s   "r'   r9   r9   Š   s   € ÷ 2ñ 2�#ñ 2r&   c              #  óv   "  €  Rx € R#   \          d"   p\        P                  RY4        Rp?R# Rp?ii ; i5i)zdRun one inventory collector; a failure is logged at debug and yields fewer rows, never an exception.Nz%s failed: %s)r`   ÚloggerÚdebug)rv   Úexcs   & r'   Ú_prober{   ‰   s-   é € ð2ÝøÜô 2Ü�‰�_ e×1Ò1ûð2üs    ‚9„
 ˆ9Š6•1«9±6¶9c               ó    € V ^8„  d   QhRRRR/# ©r5   rM   r)   r6   ÚNoner   )r8   s   "r'   r9   r9   ’   s   € ÷ Nñ N ð N°ñ Nr&   c           	     óü  € \        R 4      ;_uu_ 4        ^ RIHpHpHp V! 4       pV! 4       pT;'       g    TV n        VR9   ;'       d    V'       * T n        \        R4      ;_uu_ 4        ^ RIHp V! 4       pVe=   RV n        VP                  '       d$   VP                  '       d   VP                  V n        RRR4       V! V4      V n        RRR4       R#   + '       g   i     L'; i  + '       g   i     R# ; i)zInstall-method probe)Údetect_install_methodÚget_managed_systemÚ%recommended_update_command_for_methodzImage provenance probe)Úread_image_provenanceNF)Úgitr*   )r{   Úhermes_cli.configr€   r�   r‚   r+   r-   Úhermes_cli.image_provenancerƒ   ÚvalidÚmanagerr.   )rM   r€   r�   r‚   ÚmethodÚmanagedrƒ   Ú
provenances   &       r'   Ú_collect_install_shaperŒ   ’   sÊ   € Ü	Ð&×	'Õ	'ßvÑvá&Ó(ˆÙ$Ó&ˆØ%×/Ð/¨ˆÔØ"(Ð,>Ñ">×"NÐ"NÀwÄ;ˆÔô Ð,×-Õ-åIá.Ó0ˆJØÒ%Ø*/�Ô'Ø×#×#Ð#¨
×(:×(:Ð(:Ø*4×*<Ñ*<�DÔ'÷ .ñ !FÀfÓ MˆÔ÷' 
(Ñ	'÷ .×-ú÷ 
(×	'Ð	'ús5   ”5C*Á
 C*Á**C	ÂC	Â'C	Â8C*ÃC'Ã"C*Ã*C;	c               ó   € V ^8„  d   QhRR/# )r5   r6   zCallable[[int], str]r   )r8   s   "r'   r9   r9   ©   s   € ÷ [ñ [Ð 4ñ [r&   c                 ó¤  aa€ \        4       o\        R4      ;_uu_ 4        ^ RIHp  V ! RR7      ;'       g    \        4       oRRR4       \        4       o\        R4      ;_uu_ 4        ^ RIHp V! 4        Uu0 uF  p\        VP                  4      kK  	  upoRRR4       VV3R l#   + '       g   i     Lm; iu upi   + '       g   i     L/; i)	zU``pid -> supervisor`` over the service-PID sets; each probe degrades to an empty set.zService-PID probe)Ú_get_service_pidsT)Úall_profilesNz#Windows SCM service-ownership probe)Úfind_windows_gateway_servicesc                ó   <€ \        V SS4      # r<   )rb   )r   rU   rW   s   &€€r'   Ú<lambda>Ú(_supervisor_classifier.<locals>.<lambda>º   s   ø€ Ô1°#°|ÐEYÔZr&   )rV   r{   ra   r�   r‘   rT   Úgateway_pid)r�   r‘   r_   rU   rW   s      @@r'   Ú_supervisor_classifierr–   ©   s•   ù€ ä›€LÜ	Ð#×	$Õ	$Ý8á(°dÔ;×DÐD¼s»uˆ÷ 
%ô !$£ÐÜ	Ð5×	6Õ	6ÝDáHeÔHgÓhÑHg¸W¤ G×$7Ñ$7Ö 8ÑHgÑhÐ÷ 
7õ [ÐZ÷ 
%×	$üò  i÷ 
7×	6ús)    "B'Á'B?Á7B:ÂB?Â'B7	Â:B?Â?C	c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r5   rM   r)   Úprofile_homesr1   Úseenúset[int]r6   r~   r   )r8   s   "r'   r9   r9   ½   s/   € ÷ &hñ &h Jð &h¸tð &hÈ8ð &hÐX\ñ &hr&   c                óÎ  € \        4       p\        R4      ;_uu_ 4        ^ RIHpHp ^ RIHp V FÚ  w  rxV! V4      p	V	e?   V	w  r«W¢9   d   K  TP                  V
4       ^ RIH	p V! V4      pV'       d   TMV! V
4      pMFV! V4      p
V
e   W¢9   d   Kc  V! VR,          4      ;'       g    / pVP                  V
4       V! V
4      pV P                  P                  \        RWzWëP                  R4      VP                  R	4      4      4       KÜ  	  RRR4       \        R
4      ;_uu_ 4        ^ RIHp V! 4        F|  pVP                   V9  g   K  VP                  VP                   4       V P                  P                  \        RVP"                  VP                   V! VP                   4      4      4       K~  	  RRR4       R#   + '       g   i     L»; i  + '       g   i     R# ; i)uè   Per-profile gateways: control-socket identity first (declared by the process itself, including
supervisor provenance â€” no argv/PID inference), ``gateway_state.json`` fallback, then PID-file
mapped gateways no status record covers.zGateway-state inventory)Úlive_gateway_pid_for_homeÚread_runtime_status)Ú_socket_identityN)Úlaunch_supervisorzgateway_state.jsonÚgatewayr   r   zPID-file gateway inventory)Úfind_profile_gateway_processes)r–   r{   Úgateway.statusrœ   r�   Úhermes_cli.update_receiptrž   ÚaddÚgateway.control_socketrŸ   r3   Úappendrt   rF   ra   r¡   r   r   )rM   r˜   r™   r   rœ   r�   rž   r   ÚhomeÚsockr   ÚrecordrŸ   ÚdeclaredÚsupr¡   Úprocs   &&&              r'   Ú_collect_gateway_runtimesr­   ½   sv  € ô (Ó)€JÜ	Ð)×	*Õ	*ßQÝ>ã*‰MˆGÙ# DÓ)ˆDØÒØ"‘�Ø”;ÙØ—‘˜”ÝDñ -¨VÓ4�ß"*‘h±
¸3³‘ñ
 0°Ó5�Ø’; #¤+ÙÙ,¨TÐ4HÕ-HÓI×OÐOÈR�Ø—‘˜”Ù  “o�Ø�M‰M× Ñ ¤¨)°WÀ3Ï
É
ÐS]ÓH^Ð`f×`jÑ`jÐkyÓ`zÓ!{Ö|ñ- +÷	 
+ô6 
Ð,×	-Õ	-ÝEá2Ö4ˆDØ�x‰x˜tÖ#Ø—‘˜Ÿ™Ô"Ø—‘×$Ñ$¤X¨i¸¿¹ÀtÇxÁxÑQ[Ð\`×\dÑ\dÓQeÓ%fÖgñ 5÷ 
.Ñ	-÷7 
+×	*ú÷6 
.×	-Ð	-ús,   žAG Á34G Â(A%G Ä(GÅA*GÇ G	ÇG$	c               ó   € V ^8„  d   QhRR/# )r5   r6   r1   r   )r8   s   "r'   r9   r9   æ   s   € ÷ 
ñ 
 dñ 
r&   c                 óš   € \        \        4      ;_uu_ 4        ^ RIHp  V P	                  4       uuRRR4       #   + '       g   i     . # ; i)u  Loaded launchd dashboard/serve jobs for supervisor classification.

The probe itself is darwin-gated (``[]`` on every other host); here any failure also degrades
to ``[]`` â€” classification falls back to the spawner probe and never aborts the inventory.
See #116503.©Úmain_dashboardN)r   r`   Ú
hermes_clir±   Ú_loaded_launchd_backend_jobs)Ú_dashs    r'   Ú_loaded_backend_launchd_jobsrµ   æ   s4   € ô 
”)×	Õ	Ý6à×1Ñ1Ó3÷ 
×	×	Ñ	ð €Iús	   ˜9¹A
	c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r5   Úentryr   r   rT   Újobsr1   r6   z"tuple[str, str, int | None] | Noner   )r8   s   "r'   r9   r9   ó   s)   € ÷ ñ ¨4ð °cð Àð ÐJlñ r&   c           
     ód  € \        \        4      ;_uu_ 4        ^ RIHp ^ RIHp  \        P                  ! \        V P                  R4      ;'       g    R4      4      ;'       g    RpVP                  WW$! V4      R7      uuRRR4       #   \         d    Rp L2i ; i  + '       g   i     R# ; i)uÂ  ``(domain, label, live_pid)`` of the loaded launchd job owning this ledger row, if any.

A KeepAlive LaunchAgent backend's recorded spawner (the bootstrap shell) is long dead, so the
spawner probe alone misreads the row as ``manual-serve`` â€” and a respawn-argv restart then
fights the job's own KeepAlive respawn. The loaded-job match (live PID, an ancestor, or the
normalized ``ProgramArguments``) is the authoritative classification. See #116503.r°   )Ú_process_ancestorsÚargvr   N)Ú	ancestors)r   r`   r²   r±   Úhermes_cli.dashboard_procsrº   ÚshlexÚsplitr   rF   Ú
ValueErrorÚ_launchd_job_owning_backend)r·   r   r¸   r´   rº   Úcmdlines   &&&   r'   Ú_launchd_owner_for_ledger_entryrÃ   ó   s�   € ô 
”)×	Õ	Ý6ÝAð	Ü—k’k¤# e§i¡i°Ó&7×&=Ð&=¸2Ó">Ó?×GÐGÀ4ˆGð ×0Ñ0°¸tÐOaÐbeÓOfÐ0Óg÷ 
Ò	øô ô 	ØŠGð	ú÷ 
Ö	ñ ús4   ˜B¦>BÁ%BÁ(BÂBÂBÂBÂBÂB/	c               ó    € V ^8„  d   QhRRRR/# )r5   r   rT   r6   ztuple[str, str | None] | Noner   )r8   s   "r'   r9   r9     s   € ÷ ñ  sð Ð/Lñ r&   c                óœ   € \        \        4      ;_uu_ 4        ^ RIHp VP	                  V 4      uuRRR4       #   + '       g   i     R# ; i)a  ``(unit, scope)`` of the systemd unit whose live ``MainPID`` is *pid*, if any.

A unit-launched backend sets neither ``HERMES_SPAWN`` nor ``HERMES_PARENT_PID``, so the spawner
probe reads ``manual-serve`` and the update tells the user to "ask the owner to relaunch
`hermes dashboard`" for a process systemd owns (#141021). Ownership is the unit's MainPID, not
cgroup membership (a hand-started dashboard inside some unrelated unit's cgroup is still manual);
``None`` off Linux, when unreadable, or when no unit owns it.r°   N)r   r`   r²   r±   Ú_systemd_owner_for_pid)r   r´   s   & r'   Ú_systemd_owner_for_ledger_pidrÇ     s4   € ô 
”)×	Õ	Ý6à×+Ñ+¨CÓ0÷ 
×	×	Ñ	ñ ús	   ˜:ºA	c               ó    € V ^8„  d   QhRRRR/# )r5   r·   r   r6   r,   r   )r8   s   "r'   r9   r9     s   € ÷ 	ñ 	¨ð 	°ñ 	r&   c           	     ó°   € ^ RI Hp  T! \        P                  ! \	        V P                  R4      ;'       g    R4      4      4      #   \         d     R# i ; i)zýIs this row the backend a (possibly remote) Desktop spawned over SSH? The canonical argv
predicate also classifies rows written before the ledger carried ``isolated``, which is exactly
the pre-update serve the first update after this change inventories.)Úis_desktop_ssh_backend_argvr»   r   F)Úhermes_cli._startup_fastrÊ   r¾   r¿   r   rF   rÀ   )r·   rÊ   s   & r'   Ú_is_desktop_ssh_ledger_entryrÌ     sJ   € õ EðÙ*¬5¯;ª;´s¸5¿9¹9ÀVÓ;L×;RÐ;RÐPRÓ7SÓ+TÓUÐUøÜô Úðús   ˆ.A ·A ÁAÁAc               ó$   € V ^8„  d   QhRRRRRR/# )r5   rM   r)   r™   rš   r6   r~   r   )r8   s   "r'   r9   r9   !  s!   € ÷ &ñ & :ð &°Xð &À$ñ &r&   c                óÒ  € \        R4      ;_uu_ 4        ^ RIHpHp \	        4       pV! 4        EF˜  pVP                  R4      VP                  R4      rvV\        9  g   \        V\        4      '       d   Wq9   d   KN  VP                  V4       RVP                  R4      ;'       g    RRVP                  R4      ;'       g    RRVP                  R4      R	VP                  R	4      /pV'       d   \        WWV4      MR
p	V	'       d   RV	^ ,          V	^,          uq¨R&   VR&   MS\        V4      '       d   Rp
M?V! V4      RJ d   Rp
M0\        V4      ;p'       d   RV^ ,          V^,          uq¨R&   VR&   MRp
V P                  P                  \        \!        V4      \!        VP                  R4      ;'       g    R4      WzVR7      4       EK›  	  R
R
R
4       R
#   + '       g   i     R
# ; i)uq  Serve/dashboard backends from the spawn ledger â€” runtimes the gateway collectors can never see
(a manual `hermes serve --host <ip>` for a remote Desktop, a long-lived `hermes dashboard`).
ledger_entries() live-verifies (pid, create_time) so PID reuse never fabricates a row. Desktop-
supervised backends (spawner still alive) restart via the Desktop's own respawn, not ours.
A backend owned by a loaded launchd job is classified ``launchd`` (kickstart restart, never a
detached argv respawn) â€” the spawner probe cannot see that (#116503); one that is a systemd
unit's MainPID is ``systemd`` for the same reason (#141021).z Serve/dashboard ledger inventory)Úledger_entriesÚspawner_is_deadÚpurposer   r»   r   ÚhostÚportÚcreate_timeNr^   Úlaunchd_domainÚlaunchd_labelrf   Frc   r]   Úsystemd_unitÚsystemd_scoperd   r   rn   )r   )r{   Úhermes_cli.process_identityrÏ   rÐ   rµ   rF   Ú_SERVE_KINDSrG   rT   r¤   rÃ   rÌ   rÇ   r3   r¦   rt   r   )rM   r™   rÏ   rÐ   Úlaunchd_jobsr·   rÑ   r   r   Újobr   Úunits   &&          r'   Ú_collect_ledger_runtimesrÞ   !  s¡  € ô 
Ð2×	3Õ	3ßOä3Ó5ˆÙ#×%ˆEØ Ÿ9™9 YÓ/°·±¸5Ó1A�SØœlÔ*´*¸SÄ#×2FÒ2FÈ#Ì+ÙØ�H‰H�SŒMð ˜Ÿ	™	 &Ó)×/Ð/¨R°¸¿¹À6Ó9J×9PÐ9PÈbØ˜Ÿ	™	 &Ó)¨=¸%¿)¹)ÀMÓ:RðˆF÷ P\Ô1°%¸lÔKÐaeˆCßØPYÐ[^Ð_`Õ[aÐcfÐghÕciÐM�
Ð#3Ñ4°f¸_Ò6MÜ-¨e×4Ò4ð +‘
Ù  Ó'¨5Ó0Ø&‘
Ü6°sÓ;Ð;�Ö;ØNWÐY]Ð^_ÕY`ÐbfÐghÕbiÐK�
 >Ñ2°F¸?Ò4Kà+�
Ø�M‰M× Ñ ¤Ü�G“œc %§)¡)¨IÓ"6×"CÐ"C¸)ÓDÀcÐ^dô"÷ ñ1 &÷	 
4×	3×	3Ò	3ús%   ”BGÂ&GÃ-GÃ/GÄCGÇG&	c               ó   € V ^8„  d   QhRR/# )r5   r6   r)   r   )r8   s   "r'   r9   r9   J  s   € ÷ ñ  :ñ r&   c                 ó  € \        4       p \        V 4       \        R4      ;_uu_ 4        ^ RIHp V! RR7      pVP                  R4      V n        VP                  R4      V n        RRR4       . p\        R4      ;_uu_ 4        ^ R	IH	p V! 4       pV UUu. uF  w  rVVNK	  	  uppV n
        RRR4       \        4       p\        WV4       \        W4       V #   + '       g   i     Ly; iu uppi   + '       g   i     LL; i)
u¼   Build the pre-update plan. Read-only; never raises â€” every collector degrades independently.

The result is embeddable in the update receipt and printable via :func:`print_update_plan`.
zCode-identity probe)Úget_code_identityT)ÚrefreshÚshaÚversionNzProfile enumeration)Ú_profile_homes)r)   rŒ   r{   Úhermes_cli.version_inforá   rF   r/   r0   r£   rå   r2   rV   r­   rÞ   )rM   rá   Úidentityr˜   rå   rD   Ú_r™   s           r'   Úcollect_runtime_inventoryré   J  sÄ   € ô
 ‹<€DÜ˜4Ô Ü	Ð%×	&Õ	&Ý=á$¨TÔ2ˆØ$ŸL™L¨Ó/ˆÔØ (§¡¨YÓ 7ˆÔ÷ 
'ð €MÜ	Ð%×	&Õ	&Ý<á&Ó(ˆÙ-:Ô;©]¡' $›©]Ò;ˆŒ÷	 
'ô
 “U€DÜ˜d°4Ô8Ü˜TÔ(Ø€K÷ 
'×	&üó <÷	 
'×	&ús)   ©<CÂC/ÂC)
Â"	C/ÃC&	Ã)C/Ã/C?	c               ó    € V ^8„  d   QhRRRR/# r}   r   )r8   s   "r'   r9   r9   c  s   € ÷ dñ d˜Jð d¨4ñ dr&   c                óÂ  € \        R4       RV P                   2pV P                  '       dM   TRV P                   2V P                  '       d   RV P                  R,           2MR,           R,           ,          p\        V4       V P                  '       g$   \        R4       \        R	V P
                   24       \        R
V P                  '       d   RP                  V P                  4      MR 24       V P                  '       g   \        R4       R# \        R\        V P                  4       R24       V P                   Fš  pVP                  '       d   RVP                  R,           2MRp\        RVP                   RVP                   RVP                   RVP                   V 2	4       \        R\        VP                   VP                  4       24       Kœ  	  R# )u;   Human-readable plan â€” what the update will touch and how.zUpdate plan:z  Install: z (vz @ :Né   Nr   Ú)u-     âš  This install is NOT updatable in place.z    Update via: z  Profiles: z, z(none found)u<     Running Hermes services: none detected â€” code swap only.Nz  Running services to restart (z):õ       â€¢ ú [ú] pid õ    â€” z      restart: )Úprintr+   r0   r/   r-   r.   r2   Újoinr3   Úlenr   r   r   r   r   rp   r   )rM   ÚinstallÚruntimerã   s   &   r'   Úprint_update_planr÷   c  s�  € ä	ˆ.ÔØ˜D×/Ñ/Ð0Ð1€GØ××ÐØ�S˜×.Ñ.Ð/Ð0ÐUY×Uf×UfÐUf°c¸$×:KÑ:KÈBÕ:OÐ9PÑ4QÐlnÕoÐruÕuÕuˆÜ	ˆ'„NØ×"×"Ð"ÜÐ=Ô>ÜÐ  ×!6Ñ!6Ð 7Ð8Ô9Ü	ˆL°T·]·]°]˜Ÿ™ 4§=¡=Ô1ÈÐWÐ
XÔYØ�=�=ˆ=ÜÐLÔMÙÜ	Ð+¬C°·±Ó,>Ð+?¸rÐ
BÔCØ—=”=ˆØ.5×.>×.>Ð.>��G×$Ñ$ RÕ(Ð)Ñ*ÀBˆÜ�˜Ÿ™˜ b¨¯©Ð(9¸ÀÇÁ¸}ÈEÐRY×RdÑRdÐQeÐfiÐejÐkÔlÜ�Ô :¸7×;NÑ;NÐPW×P_ÑP_Ó `ÐaÐbÖcó !r&   c               ó$   € V ^8„  d   QhRRRRRR/# )r5   r   r   rÝ   Úobjectr6   r,   r   )r8   s   "r'   r9   r9   x  s&   € ÷ 
Jñ 
J¨ð 
J°Fð 
J¸tñ 
Jr&   c                óš   € \        V4      P                  R4      P                  R^4      R,          pV R8X  d   RMRV  2pVRV 2RV 209   # )	u�  Does *unit* name a ``hermes-serve*``/``hermes-dashboard*`` unit for *profile*? (OWN vocabulary;
the gateway's ``hermes-gateway*`` names never cover serve/dashboard runtimes.)

Exact names only â€” ``work`` must not claim ``hermes-serve-workbench`` â€” and a scope prefix
(``user/hermes-serve``) is tolerated because the restart phase records scope-qualified identities in
some lists. See #100479.
ú.serviceÚ/rn   r   Ú-zhermes-servezhermes-dashboardéÿÿÿÿ©r   ÚremovesuffixÚrsplit)r   rÝ   rD   Úsuffixs   &&  r'   Ú_serve_unit_matches_profiler  x  s]   € ô ˆt‹9×!Ñ! *Ó-×4Ñ4°S¸!Ó<¸RÕ@€DØ˜iÔ'‰R¨q°°	¨]€FØ�l 6 (Ð+Ð/?À¸xÐ-HÐIÑIÐIr&   c               ó$   € V ^8„  d   QhRRRRRR/# )r5   r   r   r_   rù   r6   r,   r   )r8   s   "r'   r9   r9   …  s&   € ÷ gñ g¨cð g¸Fð gÀtñ gr&   c                óž   € \        V4      P                  R4      P                  R^4      R,          pV R8X  d   VR9   # VRV  2RV  2RV  209   # )	uç  Match an exact gateway service/label (systemd/launchd/s6 shapes) to a profile.

Never substring-match: ``foo`` must not claim ``hermes-gateway-foobar.service``.
Launchd labels are ``ai.hermes.gateway`` / ``ai.hermes.gateway-<profile>`` â€” they do
not contain the substring ``hermes-gateway``, so a successful macOS kickstart must
still credit the planned default gateway. A scope prefix (``user/hermes-gateway``,
``gui/501/ai.hermes.gateway``) is stripped the same way serve units are.
rû   rü   rn   zhermes-gateway-zai.hermes.gateway-zgateway-rþ   >   r    úhermes-gatewayúgateway-defaultúai.hermes.gatewayrÿ   )r   r_   rD   s   && r'   Ú _gateway_service_matches_profiler	  …  si   € ô ˆw‹<×$Ñ$ ZÓ0×7Ñ7¸¸QÓ?ÀÕC€DØ�)ÔØÐ\Ñ\Ð\Ø�o g YÐ/Ð3EÀgÀYÐ1OÐS[Ð\cÐ[dÐQeÐfÑfÐfr&   c               ó$   € V ^8„  d   QhRRRRRR/# )r5   rO   r   ÚnamesrV   r6   r,   r   )r8   s   "r'   r9   r9   ”  s&   € ÷ Tñ T˜ð T¨sð T°tñ Tr&   c                óx   a € \         ;QJ d    V 3R  lV 4       F  '       g   K   R# 	  R# ! V 3R  lV 4       4      # )c              3  óP   <"  € T F  p\        SP                  V4      x € K  	  R # 5ir<   )r	  r   )Ú.0rD   rO   s   & €r'   Ú	<genexpr>Ú$_gateway_named_in.<locals>.<genexpr>—  s    øé € ÐSÉUÀTÔ/°·	±	¸4×@Ð@ËUùó   ƒ#&TF)Úany)rO   r  s   f&r'   Ú_gateway_named_inr  ”  s.   ø€ ÷ ‹3ÔSÉUÓS�3Œ3ÐSŠ3ÐSˆ3ÔSÉUÓSÓSÐSr&   Ústale_serve_pidsÚfailed_respawn_pidsÚexternal_gateway_pidsÚlive_gateway_pidsc               óD   € 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R/# )r5   rM   r)   Úrestarted_servicesr1   Úrelaunched_profilesÚexternally_supervised_profilesÚkilled_pidsrV   Úfailed_unitsr  rX   r  r  r  zdict[str, set[int]] | Noner6   úlist[dict[str, Any]]r   )r8   s   "r'   r9   r9   š  s|   € ÷ Xñ XØ
ðXØ-1ðXØHLðXà$(ðXà7:ðXàJNðXð !ðXð ?IðXð &ð	Xð
 2ðXð ñXr&   c       	        óŠ  aaaaaaaaa€ . p
 T;'       g    .  Uu0 uF  p\        V4      kK  	  upoT;'       g    .  Uu0 uF  p\        V4      kK  	  upo\        T;'       g    . 4      \        T;'       g    . 4      ,          oT;'       g    \        4        Uu0 uF  p\        V4      kK  	  upoVe   V Uu0 uF  p\        V4      kK  	  upMRoT;'       g    \        4        Uu0 uF  p\        V4      kK  	  upoT;'       g    R Uu0 uF  p\        V\        4      '       g   K  VkK  	  upoV	eY   V	P	                  4        UUUu/ uF9  w  rï\        V4      V Uu0 uF  p\        V\        4      '       g   K  VkK  	  upbK;  	  upppMRoR VVVV3R llp/ oV P
                   Fn  p\        V\        4      '       g   K  VP                  R8X  g   K.  V! V4      '       d   K>  SP                  VP                  ^ 4      ^,           SVP                  &   Kp  	  R VVVVVVVVV3	R llpV P
                   F¥  p\        V\        4      '       g   K  T
P                  RVP                  RVP                  R	VP                  R
VP                  RV! V4      /R Uu/ uF4  pTVP                  ;'       g    / 9   g   K   VVP                  V,          bK6  	  upC4       K§  	  V
# u upi u upi u upi u upi u upi u upi u upi u upppi u upi   \         d"   p\        P!                  RT4        Rp?T
# Rp?ii ; i)uì  Reconcile the plan's runtimes against what the restart phase DID.

The platform restart branches each re-discover their own targets, so a runtime the plan saw can
be missed with no signal. Returns one ``{kind, profile, pid, mechanism, outcome}`` row per
planned runtime; outcome is ``restarted``, ``stopped``, ``failed``, ``deferred``, ``external``
or ``unaccounted`` (no bookkeeping mentions it â€” the blind-spot tripwire). Never raises.
Serve/dashboard runtimes are reconciled in their OWN vocabulary and never borrow the gateway's
outcome: with ``stale_serve_pids`` a pre-update serve whose incarnation is gone counts as
``restarted``, one still alive is ``unaccounted``; without the probe an untouched serve stays
``unaccounted``. A Desktop-supervised serve is ``deferred`` only when the survivor probe RAN
and still lists its pid: the restart phase is forbidden to restart it out from under the app (it
hosts the live Desktop chats), so it is handed back to its supervisor and surfaced. Without a
probe result it remains ``unaccounted``, rather than claiming the app owns an unknown
incarnation. ``failed_respawn_pids`` (serves the dashboard cleanup stopped and could not bring
back) read ``failed`` before the probe, whose "gone" is exactly what a failed respawn looks like
(#109290). The probe itself fails closed (unreadable ledger -> every planned serve is listed as
surviving), so ``deferred`` means "not shown to be gone", not "observed alive". See #111494.

``live_gateway_pids`` (profile -> gateway PIDs alive for that profile AFTER the restart phase:
control-socket identity, or a runtime-status record whose PID is still live) carries the same
incarnation evidence for gateways: the plan identifies a gateway by the
profile it SERVES, while the restart bookkeeping names the SERVICE it runs under, and those two
disagree whenever a service serves a profile its name does not encode â€” a root-home launchd
label running the sticky active profile, a hash-suffixed systemd unit for a custom
``HERMES_HOME``. No name rule can bridge that, so a planned PID that is gone while a gateway
answers for the same profile counts as ``restarted``. A missing successor, or the planned PID
still answering, stays ``unaccounted`` â€” the tripwire keeps its teeth.

That credit needs an unambiguous baseline: a profile with SEVERAL planned gateway runtimes cannot
be attributed to one successor (the fleet probe publishes at most one row per profile), so one
replacement cannot have replaced two planned processes. Such a profile keeps the name-path
verdict instead of letting an untouched sibling vanish behind a successor that can only have
replaced one of them. That resolves conservatively on purpose: pairing a successor to the planned
process it replaced would need a start-time identity that neither the plan record nor the fleet
row carries, and a tripwire firing on an anomalous plan is the intended direction.

Credit is deliberately NOT gated on restart bookkeeping either: the failure this fallback exists
for already had bookkeeping (``restarted_services`` named the service label â€” only the
profileâ†”label name match failed), and a gateway launchd respawned by itself has no restart-phase
record at all while the fleet row still proves its successor runs the new code.

See #91277.
They never borrow the gateway's outcome: ``relaunched_profiles`` and ``hermes-gateway*`` name a
different process that shares the profile, nothing more. See #100479.

``external_gateway_pids``: gateway pids the post-restart fleet probe verified as serving a
DIFFERENT checkout than this updater (a ``profiles/<name>`` symlinked to a separate install).
An untouched gateway in that set is ``external`` â€” another install owns its restart â€” instead
of ``unaccounted``. No evidence keeps the tripwire armed. See #120240.
Nc               ó    € V ^8„  d   QhRRRR/# )r5   rO   r   r6   r,   r   )r8   s   "r'   r9   Ú,match_runtime_outcomes.<locals>.__annotate__á  s   € ÷ 	[ñ 	[ ]ð 	[°tñ 	[r&   c                ó¬   <€ V P                   e   V P                   S9   d   R# V P                  S9   d   R# \        V S4      ;'       g    \        V S4      # )zHTerminal verdict already available from the restart phase's bookkeeping.T)r   r   r  )rO   Ú
failed_setÚkilledÚ
relaunchedÚrestarted_sets   &€€€€r'   Ú_bookkeeping_resolvesÚ5match_runtime_outcomes.<locals>._bookkeeping_resolvesá  sF   ø€ à�u‰uÒ  Q§U¡U¨f¤_ÙØ�y‰y˜JÔ&ÙÜ$ Q¨
Ó3×ZÐZÔ7HÈÈMÓ7ZÐZr&   r    c               ó    € V ^8„  d   QhRRRR/# )r5   rO   r   r6   r   r   )r8   s   "r'   r9   r!  ô  s   € ÷ 4	Fñ 4	F˜ð 4	F¨#ñ 4	Fr&   c                óÊ  <	a € S P                   R J;'       d    S P                   S9   pS P                  \        9   dÜ   V'       d   R# S P                   S9   gA   \        ;QJ d    V 3R lS 4       F  '       g   K   RM	  RM! V 3R lS 4       4      '       d   R# Se   S P                   S9  d   R# S P                  \
        9   d	   Se   R# R# Se   R# \        ;QJ d    V 3R	 lS
 4       F  '       g   K   RM	  RM! V 3R	 lS
 4       4      '       d   R# R# S P                  S	9   d   R# V'       d   R# \        S S4      '       d   R# \        S S
4      '       d   R# Seð   S P                   eâ   SP                  S P                  4      pSP                  S P                  ^ 4      ^8„  pV'       d   S P                   V9  d   V'       g   R# V'       d?   \        P                  R
SS P                  ,          S P                  S P                   4       M>V'       g7   \        P                  RS P                  S P                   S P                  4       S P                   S9   d   R# R# )NÚstoppedc              3  óP   <"  € T F  p\        SP                  V4      x € K  	  R # 5ir<   ©r  r   )r  ÚurO   s   & €r'   r  Ú;match_runtime_outcomes.<locals>._outcome.<locals>.<genexpr>ù  s$   øé € Ð2qÑfpÐabÔ3NÈqÏyÉyÐZ[×3\Ð3\Ófpùr  TFÚfailedÚ	restartedÚdeferredÚunaccountedc              3  óP   <"  € T F  p\        SP                  V4      x € K  	  R # 5ir<   r-  )r  ÚsrO   s   & €r'   r  r/    s$   øé € Ð)kÑ]jÐXYÔ*EÀaÇiÁiÐQR×*SÐ*SÓ]jùr  u”   %s planned gateway runtimes for profile %r still need a verdict â€” successor evidence cannot attribute the restart, leaving pid %s on the name pathut   No post-restart gateway evidence for profile %r (planned pid %s via %s) â€” reconciling on restart bookkeeping aloneÚexternal)r   r   rÚ   r  r   ÚCLIENT_OWNED_SERVE_SUPERVISORSr   r  rF   rx   ry   r   )rO   Úkilled_hereÚliveÚ	ambiguousr6  Úfailed_respawnsr#  r$  Úpending_gatewaysr%  r&  Ústale_servesÚ
successorss   f   €€€€€€€€€r'   Ú_outcomeÚ(match_runtime_outcomes.<locals>._outcomeô  sÃ  ù€ ØŸ%™% tÐ+×?Ð?°·±¸±ˆKØ�v‰vœÔ%ßÙ$Ø—5‘5˜OÔ+¯s«sÔ2qÑfpÓ2q¯s¯sªsÔ2qÑfpÓ2q×/qÒ/qÙ#ØÒ+°·±¸\Ô0Iñ 'Ø—<‘<Ô#AÔAØ#Ò/ñ  *Ù(ØÒ+Ù(ß&)£cÔ)kÑ]jÓ)k§c§c¢cÔ)kÑ]jÓ)k×&kÒ&k�{Ð~Ðq~Ð~Ø�y‰y˜JÔ&Ù"ßÙ Ü   J×/Ò/ÙÜ   M×2Ò2Ù"ØÒ%¨!¯%©%Ò*;ð
 "—~‘~ a§i¡iÓ0�Ø,×0Ñ0°·±¸AÓ>ÀÑB�	ß˜AŸE™E¨Ô-·iÙ&ßÜ—L‘Lðaà(¨¯©Õ3°Q·Y±YÀÇÁõ÷
 ô —L‘LðCàŸ	™	 1§5¡5¨!¯-©-ôð
 "#§¡¨(Ô!2�:ÐE¸ÐEr&   r   r   r   rl   Úoutcomez)Runtime-outcome reconciliation failed: %sr   )r×   rØ   )r   rV   rT   rG   rE   r3   r   r   rF   r   r¦   r   r   r   r`   rx   ry   )rM   r  r  r  r  r  r  r  r  r  Úoutcomesr.  r5  Úpr   Úpidsr'  Ú_plannedr?  rO   rK   rz   r6  r;  r#  r$  r<  r%  r&  r=  r>  s   &$$$$$$$$$            @@@@@@@@@r'   Úmatch_runtime_outcomesrF  š  së  ÿø€ ðr &(€Hð]GØ'3×'9Ð'9°rÐ'9Ó;Ñ'9 ”c˜!–fÑ'9Ñ;ˆ
Ø*<×*BÐ*BÀÐ*BÓDÑ*B Aœ˜QžÑ*BÑDˆÜÐ,×2Ð2°Ó3´cÐ:X×:^Ð:^Ð\^Ó6_Õ_ˆ
Ø#.×#7Ð#7´#³%Ð#7Ó9Ñ#7˜Q”#�a–&Ñ#7Ñ9ˆØ=MÒ=YÑ(8Ó9Ñ(8 1œ˜AžÑ(8Ò9Ð_cˆØ,?×,HÐ,HÄ3Ã5Ð,HÓJÑ,H aœ3˜qž6Ñ,HÑJˆØ 5× ;Ð ;¸Ð ;ÓSÑ ;˜!Ä
È1Ìc×@R—A�AÑ ;ÑSˆð !Ò,ð Yj×XoÑXoÔXqÕrÑXqÁ}ÀwŒS�‹\¡tÓB¡t !¬z¸!¼S×/AŸA˜A¡tÑBÒBÑXqÔràð 	÷
	[ó 	[ð ,.ÐØŸœˆHÜ˜8¤]×3Ô3¸¿¹ÈÖ8RÙ1°(×;Ô;Ø5E×5IÑ5IÈ(×JZÑJZÐ\]Ó5^ÐabÕ5bÐ  ×!1Ñ!1Ó2ñ &÷
4	F÷ 4	Fð 4	Fðl —”ˆAÜ˜!œ]×+Ô+Ø—‘Ø˜QŸV™V Y°·	±	¸5À!Ç%Á%ÈÐVW×VcÑVcÐenÑpxÐyzÓp{ð mÙ0QÓkÑ0Q¨1ÐUVÐ[\×[cÑ[c×[iÐ[iÐgiÑUjœ˜˜1Ÿ8™8 A�;šÑ0QÑkðmöñ ð €Oùò{ <ùÚDùâ9ùÚ9ùÚJùÚSùâBùÔrùòb løäô GÜ�‰Ð@À#×FÐFØ€OûðGúsí   �L –L ›K'¯L »L Á K,ÁL Á%L Á9L ÂL ÂK1Â0L Â;K6ÃL ÃL Ã*K;Ã>L Ä
L ÄL Ä,L Ä2L ÅL
Å"LÅ?LÆL
Æ7L ÇL ÇL Ç+A'L ÉAL ÊLÊ8LËLËL Ë'L ÌL
Ì
L ÌMÌ!L=Ì=Mc               ó    € V ^8„  d   QhRRRR/# )r5   rB  r  r6   r,   r   )r8   s   "r'   r9   r9   5  s   € ÷ 7ñ 7Ð*>ð 7À4ñ 7r&   c                ó’  € V  Uu. uF4  qP                  R4      R8X  g   K  VP                  R4      R8X  g   K2  VNK6  	  ppV'       dI   \        4        \        R4       V F-  p\        RVR,           RVR	,           R
VR,           R24       K/  	  V  Uu. uF4  qP                  R4      R8X  g   K  VP                  R4      R8w  g   K2  VNK6  	  ppV'       de   \        4        \        R4       V FI  pVP                  R4      R8X  d   RMRp\        RVR,           RVR	,           R
VR,           RV 24       KK  	  V  Uu. uF  qP                  R4      R8X  g   K  VNK  	  ppV'       dH   \        4        \        R4       V F,  p\        RVR,           RVR	,           R
VR,           24       K.  	  V  Uu. uF  qP                  R4      R8X  g   K  VNK  	  ppV'       g   R# \        4        \        R4       V F6  p\        RVR,           RVR	,           R
VR,           RVR,           24       K8  	  \        R4       \        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   \        R4       \        R4       \        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       dè   ^ RIHp V Fv  pVP                  R4      \
        9   g   K  VP                  R 4      '       g   K8  V! VR ,          VP                  R!4      4       F  p\        R"V R#VR,           24       K  	  Kx  	  \        ;QJ d    R$ V 4       F  '       g   K   RM	  RM! R$ V 4       4      '       d,   \        P                  R%8X  d   \        R&4       \        R'4       R# u upi u upi u upi u upi )(u+  Print a loud warning for runtimes the restart phase never touched.

Returns True when at least one planned runtime is unaccounted; the caller escalates like a
STALE/DOWN fleet row (an owed ``gateway_restart`` follow-up) â€” a promised restart silently missed is the class this phase
exists to kill.
rA  r2  rl   re   uf     âš  Manual serve restarts deferred to their owner (reminders retained until the old processes exit):rî   r   rï   r   rð   r   zW: relaunch `hermes serve` / `hermes dashboard`, or reconnect Desktop for an SSH backenduP     â„¹ Left to the Desktop app (still on pre-update code until it is relaunched):rf   zZowned by a Desktop connected over SSH; it picks up the update when that Desktop reconnectsz.relaunch the Desktop app to pick up the updaterñ   r6  uR     â„¹ Left to their own install (separate checkout, not restarted by this update):r3  Fu7     âš  Planned runtimes the restart phase never touched:u       âœ— u    â€” planned mechanism: z'    Restart them manually, then verify:c              3  óP   "  € T F  qP                  R 4      \        9  x € K  	  R# 5i©r   N©rF   rÚ   ©r  Úos   & r'   r  Ú.report_unaccounted_runtimes.<locals>.<genexpr>[  s   é € Ð
=±f°�5‰5�‹=¤Ö,³fùó   ‚$&Tz<      hermes gateway restart                # active profilez;      hermes -p <profile> gateway restart   # named profilec              3  óP   "  € T F  qP                  R 4      \        9   x € K  	  R# 5irJ  rK  rL  s   & r'   r  rN  ^  s   é € Ð
9±&¨Q�5‰5�‹=œLÖ(³&ùrO  )Ú_systemd_restart_commandsr×   rØ   z      z	   # pid c              3  óŒ   "  € T F:  qP                  R 4      \        9   ;'       d    VP                  R4      '       * x € K<  	  R# 5i)r   r×   NrK  rL  s   & r'   r  rN  h  s4   é € Ð[ÑTZÈq�u‰u�V‹}¤Ñ,×JÐJ°Q·U±U¸>Ó5JÔ1JÔJÓTZùs
   ‚"A¥AÚlinuxzJ      systemctl --user restart hermes-serve.service   # unit-managed servez2      relaunch `hermes serve` / `hermes dashboard`)rF   rò   r  Úhermes_cli.main_dashboardrQ  rÚ   ÚsysÚplatform)	rB  rM  r   r2  Úactionr6  ÚmissedrQ  Úcommands	   &        r'   Úreport_unaccounted_runtimesrZ  5  s/  € ñ "Óm™�A§U¡U¨9Ó%5¸Ñ%CŒaÈÏÉÈkÓHZÐ^lÑHl�aˆa™€FÐmßÜŒÜÐvÔwÛˆAÜ�H˜Q˜v�Y˜K r¨!¨I­,¨°v¸aÀ½h¸Zð  H_ð  `ö  añ á#Óo™8�a§u¡u¨YÓ'7¸:Ñ'E”È!Ï%É%ÐP[ÓJ\Ð`nÑJn—�™8€HÐoßô 	ŒÜÐ`ÔaÛˆAàŸ™˜{Ó+¨}Ô<ñ sØBrð ä�H˜Q˜v�Y˜K r¨!¨I­,¨°v¸aÀ½h¸ZÀuÈVÈHÐUÖVñ ñ $ÓF™8�a§u¡u¨YÓ'7¸:Ñ'E—�™8€HÐFßäŒÜÐbÔcÛˆAÜ�H˜Q˜v�Y˜K r¨!¨I­,¨°v¸aÀ½h¸ZÐHÖIñ á!ÓG™�A§U¡U¨9Ó%5¸Ñ%F�aˆa™€FÐGßÙÜ	„GÜ	Ð
CÔDÛˆÜ�˜˜6�˜ 2 a¨	¥l ^°6¸!¸E½(¸ÐC[Ð\]Ð^iÕ\jÐ[kÐlÖmñ ä	Ð
3Ô4ß
ƒsÑ
=±fÓ
=‡s‡s‚sÑ
=±fÓ
=×=Ò=ÜÐLÔMÜÐKÔLß
ƒsÑ
9±&Ó
9‡s‡s‚sÑ
9±&Ó
9×9Ò9õ 	HãˆAØ�u‰u�V‹}¤Ö,°·±°~×1FÔ1Fá8¸¸>Õ9JÈAÏEÉEÐRaÓLbÖc�GÜ˜F 7 )¨9°Q°uµX°JÐ?Ö@ó  dñ ÷
 ‹3Ñ[ÑTZÓ[�3�3Š3Ñ[ÑTZÓ[×[Ò[Ü�|‰|˜wÔ&ÜÐbÔcÜÐFÔGÙùòa nùò pùò Gùò Hs9   …N5¡N5¹N5ÂN:Â1N:Ã	N:ÅN?ÅN?Æ8OÇOc               ó    € V ^8„  d   QhRRRR/# r}   r   )r8   s   "r'   r9   r9   o  s   € ÷ 	Bñ 	B ð 	B°ñ 	Br&   c                óì   €  ^ RI Hp VP                  P                  4       pVe    V P	                  4       VP
                  R&   R# R#   \         d"   p\        P                  RT4        Rp?R# Rp?ii ; i)z@Attach the inventory to the active update receipt. Never raises.NrM   z$Could not record plan in receipt: %s)	r£   Úupdate_receiptÚ_currentrF   r>   rA   r`   rx   ry   )rM   ÚurÚcurrentrz   s   &   r'   Úrecord_plan_in_receiptra  o  s^   € ðBÝ.à—+‘+—/‘/Ó#ˆØÒØ#'§<¡<£>ˆG�L‰L˜Ó ñ øäô BÜ�‰Ð;¸S×AÒAûðBús   ‚AA ÁA3ÁA.Á.A3r<   )ÚserveÚ	dashboard)NN)2r#   Ú
__future__r   Úloggingr¾   rU  Ú
contextlibr   r   Údataclassesr   r   r   r   rC   Útypingr	   r
   r   Ú	getLoggerr   rx   r   r)   rb   ri   ro   rÚ   Ú	frozensetr7  rj   rp   rt   r{   rŒ   r–   r­   rµ   rÃ   rÇ   rÌ   rÞ   ré   r÷   r  r	  r  rF  rZ  ra  r   r&   r'   Ú<module>rk     s‰  ðñõ #ã Û Û 
ß /ß LÓ Lß *Ñ *à	×	Ò	˜8Ó	$€ð ÷/ð /ó ð/ð ÷ð ó ð÷6ð. ˆy˜) Y°	¸9ØÐ(¨.¸.Ø�=ðÐ ð ÐGØÐGØÐ7ØÐTØÐOØÐ_ðÐ ð &€ñ "+¨I°}Ð+EÓ!FÐ õ9õ÷	ð ô2ó ð2õNõ.[õ(&hõR
õõ&õ	õ&õRõ2dõ*
JõgõTðXð $(ðXð LPðXð )-ð	Xð
 59÷Xõv7÷t	Br&   