+
    jHàj�Ñ  ã                  óT  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIHt ^ RIH	t	H
t
 ^ RIHt R R lt]P                  ! R4      tR	 R
 ltR R ltR R ltR)R R lltR tR tR R ltR*R R lltR R ltR R ltR 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+R' R( llt R# ),zAProcess startup phases; diagnostics remain in the gateway facade.)ÚannotationsN)ÚPath)ÚAnyÚOptional)ÚGatewayConfigc               ó    € V ^8„  d   QhRRRR/# )é   ÚevidenceÚdictÚreturnÚNone© )Úformats   "Ú:/home/ubuntu/.hermes/hermes-agent/gateway/run_bootstrap.pyÚ__annotate__r      s   € ÷ gñ g°tð gÀñ gó    c                óZ   € ^ RI Hp ^ RIHpHp V! W03RV/RR7      P                  4        R# )aV  Run the store scan an unclean-exit report deferred, once the runner is live.

On the event loop it held every local listener open but unanswered for the whole
``quick_check`` (minutes on a multi-GB ``state.db``), so local clients hung instead of being
refused. A daemon thread nothing waits on; it only appends the forensic exit-diag record.
)Úspawn_context_thread)ÚSTATE_DB_INTEGRITY_DEADLINE_SÚrun_deferred_integrity_checkÚ
deadline_szstate-db-integrity-check)ÚargsÚkwargsÚnameN)Úagent.memory_providerr   Úgateway.lifecycle_ledgerr   r   Ústart)r	   r   r   r   s   &   r   Ú(_start_deferred_state_db_integrity_checkr      s-   € õ ;ßdáØ$¨;ØÐ;Ð<ÐC]ô_ç_dÑ_dÖ_fr   zgateway.runc               ó$   € V ^8„  d   QhRRRRRR/# )r   Úexisting_pidÚintÚreplaceÚboolr   r   )r   s   "r   r   r      s'   € ÷ hñ hÀð hÈtð hÐX\ñ hr   c              ƒ  óZ  "  € ^ RI HpHpHpHpHp ^ RIHpHpH	p	 V'       g;   \        V! 4       4      p
\        P                  RW
4       \        RV  RV  R24       R# V! V 4      '       d2   ^ RIHpHp \        P                  R	W! 4       4        V! R
RRR7       R# T! V 4      p\        P%                  RV 4        ^ RIHp V! V 4        ^ RIHp V! V 4      p V	! V RR7       T! T ^R4      G Rj  x€L
 '       gd   \        P1                  RT 4       Rp T	! T RTR7       T'       g8   T! T ^R4      G Rj  x€L
 '       g    \        P                  RT 4       T! 4        R#  ^ RIHp T! TT R7       T! 4        T! \         4      ;_uu_ 4        T! 4       R ,          P5                  RR!7       RRR4       T! 4         ^ R"IHp T! YR#7      pT'       d   \        P%                  R$T4       R#   \          d    \        P#                  RRR7        R# i ; i  \          d"   p\        P#                  RT4        Rp?ELoRp?ii ; i  \          d    . p ELxi ; i  \*         d     EL\,        \.        3 d"    \        P                  RT 4       T! 4         R# i ; i EL¦  \*         d    Rp ELŠ\,        \.        3 d     EL�i ; i ELŒ  \          d    \        P#                  RT RR7        ELzi ; i  + '       g   i     ELM; i  \          d    \        P#                  R%T RR7        R# i ; i5i)&z¯Handle a live gateway PID under this HERMES_HOME: replace it (``--replace``) or refuse.
Returns False when startup must abort (refused, permission denied, target still alive).)Ú_clear_takeover_marker_quietÚ(_replace_target_belongs_to_other_profileÚ_wait_for_pid_exitÚget_hermes_homeÚsuppress)Úget_process_start_timeÚremove_pid_fileÚterminate_pidz„Another gateway instance is already running (PID %d, HERMES_HOME=%s) and did not publish a host record this process could attach to.u+   
â�Œ A gateway already owns this host (PID zq).
   One gateway per host serves every profile, so there is nothing to start here.
   Attach is impossible: PID z¸ published no usable host record
   (an older build, or an unwritable lock directory).
   Take the host over:  hermes gateway run --replace
   Or stop it first:    hermes gateway stop
F)Ú_get_process_hermes_homeÚwrite_runtime_statusz¤Refusing --replace: PID %d cannot be proven to belong to this profile's gateway (HERMES_HOME %s). Remove the stale PID record or stop the owning profile explicitly.Ústartup_failedÚ"gateway_replace_ownership_unprovenç      @)Úgateway_stateÚexit_reasonÚwait_timeoutz:Could not stamp runtime status after the ownership refusalT©Úexc_infoz<Replacing existing gateway instance (PID %d) with --replace.)Úwrite_takeover_markerz#Could not write takeover marker: %sN)Ú_snapshot_gateway_children©Úforcez1Permission denied killing PID %d. Cannot replace.g      à?zAOld gateway (PID %d) did not exit after SIGTERM, sending SIGKILL.)r9   Úexpected_start_timeg      Ð?zjOld gateway (PID %d) still appears alive after SIGKILL; aborting replacement to avoid a duplicate gateway.)Úreap_gateway_children)Ú
parent_pidz-Child reap for replaced gateway PID %d failedzgateway.pid)Ú
missing_ok)Úrelease_all_scoped_locks)Ú	owner_pidÚowner_start_timez2Released %d stale scoped lock(s) from old gateway.z<Stale scoped lock release for replaced gateway PID %d failed)Úgateway.runr$   r%   r&   r'   r(   Úgateway.statusr)   r*   r+   ÚstrÚloggerÚerrorÚprintr,   r-   Ú	ExceptionÚdebugÚinfor6   r7   ÚProcessLookupErrorÚPermissionErrorÚOSErrorÚwarningr;   ÚunlinkÚgateway.status_scoped_locksr>   )r   r!   r$   r%   r&   r'   r(   r)   r*   r+   Úhermes_homer,   r-   Úexisting_start_timer6   Úer7   Ú_old_gateway_childrenÚold_gateway_exitedr;   r>   Ú	_releaseds   &&                    r   Ú(_start_gateway_replace_existing_instancerV      s  é € ÷ Tõ  TßUÑUßÜ™/Ó+Ó,ˆÜ�‰ðBàô	'ô 	Ø:¸<¸.ð I,à,8¨>ð :<ð=ô	>ñ ñ 0°×=Ò=ßQÜ�‰ðFð Ð2Ó4ô		6ð		fÙ Ø.Ø@Ø õñ Ù0°Ó>ÐÜ
‡K�KÐNÐP\Ô]ð?Ý8Ù˜lÔ+ð#Ý=Ù :¸<Ó HÐðÙ�l¨%Õ0ñ $ L°"°cÓ:×:Ö:Ü�‰ÐZÐ\hÔiØ"Ðð	Ù˜,¨dÐH[Õ\÷ "Ñ0BÀ<ÐQSÐUYÓ0Z×*ZÖ*ZÜ�L‰LðEØFRôTñ )Ô*ÙðcÝ8ÙÐ3ÀÕMñ Ôá	”)×	Õ	Ù	Ó	˜]Õ	*×2Ñ2¸dÐ2ÔC÷ 
ñ !Ô"ðrÝHÙ,°|Ôjˆ	ßÜ�K‰KÐLÈiÔXñ øôA ô 	fô �L‰LÐUÐ`dˆLÕeÙð		fûô ô ?Ü�‰Ð:¸A×>Ò>ûð?ûô ô #Ø "Óð#ûô ô ÚÜœWÐ%ô Ü�‰ÐHÈ,ÔWÙ$Ô&Úðúò
 ;øô
 "ô 	&Ø!%ÓÜ¤Ð)ô 	Úð	úò +[øô ô cÜ�‰ÐDÀlÐ]aˆ×bðcú÷ 
×	Ð	ûô ô rÜ�‰ÐSÐUaÐlpˆÕqÙðrüsh  ‚A(L+Á+#L+ÂG( Â L+Â;H Ã
I  Ã
I Ã#L+Ã0JÃ1	L+Ã;L+ÄJ ÄL+Ä'L+Ä4K Ä5	L+Ä?L+ÅK Å/L+Æ
K-Æ)L+Æ9-L Ç&L+Ç("HÈ
L+ÈHÈL+ÈH=ÈH8È2L+È8H=È=L+É IÉL+ÉIÉL+ÉJÉL+É"JÉ1JÊL+ÊJÊL+ÊJ=Ê&L+Ê)J=Ê8J=Ê9L+Ê<J=Ê=L+Ë#K*Ë&L+Ë)K*Ë*L+Ë-K>	Ë8	L+Ì#L(Ì$L+Ì'L(Ì(L+c               ó    € V ^8„  d   QhRRRR/# )r   Ú	verbosityúOptional[int]r   r   r   )r   s   "r   r   r   ‰   s   € ÷ ")ñ ")°ð ")À$ñ ")r   c                ó   a
a€ ^ RI Ho
HpHoHp R R lpS
! V4       ^ RIHpHp V! SRR7       R V
V3R llpS
! VR	4       V e¹   ^ VP                  ^VP                  /P                  WP                  4      pVP                  ! V! 4       4      pVP                  V4       VP                  V! 4       4       VP                  ! 4       p	V	P!                  V4       WyP"                  8  d   V	P                  V4       R
# R
# R
# )z`Sync bundled skills, set up file logging + startup security audit, and the -v/-q stderr handler.)Ú_best_effortÚ_gateway_stderr_formatterÚ_hermes_homeÚloggingc               ó   € V ^8„  d   QhRR/# ©r   r   r   r   )r   s   "r   r   Ú6_start_gateway_configure_logging.<locals>.__annotate__Œ   s   € ÷  ñ  ˜$ñ  r   c                 ó$   € ^ RI Hp  V ! RR7       R# )é    ©Úsync_skillsT)ÚquietN)Útools.skills_syncre   rd   s    r   Ú_sync_skillsÚ6_start_gateway_configure_logging.<locals>._sync_skillsŒ   s   € Ý1Ù˜$×r   )Úsetup_loggingÚ_safe_stderrÚgateway)rP   Úmodec               ó   € V ^8„  d   QhRR/# r`   r   )r   s   "r   r   ra   –   s   € ÷ _ñ _˜Tñ _r   c                 ó:   <€ ^ RI Hp  R pV ! SS! V4      R7       R# )rc   )Úlog_startup_security_warningsc                 ó   € ^ RI Hp  V ! 4       # )rc   ©Úread_raw_config)Úhermes_cli.configrs   rr   s    r   Ú_raw_cfgÚK_start_gateway_configure_logging.<locals>._security_audit.<locals>._raw_cfgš   s   € Ý9Ù"Ó$Ð$r   )rP   ÚconfigN)Ú!hermes_cli.security_audit_startuprp   )rp   ru   r[   r]   s     €€r   Ú_security_auditÚ9_start_gateway_configure_logging.<locals>._security_audit–   s   ø€ åSò	%ñ 	&°,Á|ÐT\ÓG]×^r   z-Startup security audit failed (non-fatal): %sN)rA   r[   r\   r]   r^   Úhermes_loggingrj   rk   ÚWARNINGÚINFOÚgetÚDEBUGÚStreamHandlerÚsetLevelÚsetFormatterÚ	getLoggerÚ
addHandlerÚlevel)rX   r\   r^   rh   rj   rk   ry   Ú_stderr_levelÚ_stderr_handlerÚrootr[   r]   s   &         @@r   Ú _start_gateway_configure_loggingr‰   ‰   sÙ   ù€ ç\Ó\õ ñ �Ô÷ ;Ù˜l°Õ;÷_ñ _ñ �Ð"QÔRð ÒØ˜GŸO™O¨Q°·±Ð=×AÑAÀ)Ï]É]Ó[ˆØ!×/Ò/±³Ó?ˆØ× Ñ  Ô/Ø×$Ñ$Ñ%>Ó%@ÔAØ× Ò Ó"ˆØ�‰˜Ô(ØŸ:™:Ô%Ø�M‰M˜-Ö(ñ &ñ r   c               ó   € V ^8„  d   QhRR/# )r   Ú_signal_initiated_shutdownÚlistr   )r   s   "r   r   r   ®   s   € ÷ A#ñ A#ÐTXñ A#r   c           	     óV   a aaaaaaa€ ^ RI HoHoHoHoHo R.oRVVVVVVV V3R llpV# )z`Build the SIGINT/SIGTERM handler; ``_signal_initiated_shutdown[0]`` records an unplanned signal.)r[   r]   ÚasynciorD   ÚsignalFc                óÞ  <a a	€ R  R lpR R lpV 3R lp\        S
! VR4      4      pS SP                  8H  ;'       g"    V'       * ;'       d    \        S
! VR4      4      pV'       d   RS^ &   MS^ ,          '       d   V'       g   RpS
! VR4      o	S	'       d
   S	R	,          MR
pV'       d   SP                  RT;'       g    R4       MMV'       d   SP                  RT;'       g    R4       M(R;S^ &   Sn        SP                  RT;'       g    R4       S	e'   R V	V3R llpR VV	3R llpS
! VR4       S
! VR4       V'       g   RSn        SP                  SP                  4       4       R
# )c               ó   € V ^8„  d   QhRR/# ©r   r   r"   r   )r   s   "r   r   Úb_start_gateway_make_shutdown_signal_handler.<locals>.shutdown_signal_handler.<locals>.__annotate__µ   s   € ÷ 	6ñ 	6˜4ñ 	6r   c                 ó   € ^ RI Hp  V ! 4       # )rc   ©Ú consume_takeover_marker_for_self)rB   r–   r•   s    r   Ú	_takeoverÚ__start_gateway_make_shutdown_signal_handler.<locals>.shutdown_signal_handler.<locals>._takeoverµ   s   € ÝGÙ3Ó5Ð5r   c               ó   € V ^8„  d   QhRR/# r’   r   )r   s   "r   r   r“   º   s   € ÷ 	:ñ 	:˜tñ 	:r   c                 ó   € ^ RI Hp  V ! 4       # )rc   ©Ú$consume_planned_stop_marker_for_self)rB   rœ   r›   s    r   Ú_planned_stopÚc_start_gateway_make_shutdown_signal_handler.<locals>.shutdown_signal_handler.<locals>._planned_stopº   s   € ÝKÙ7Ó9Ð9r   c                 ó    <€ ^ RI Hp  V ! S4      # )rc   )Úsnapshot_shutdown_context)Úgateway.shutdown_forensicsr    )r    Úreceived_signals    €r   Ú	_snapshotÚ__start_gateway_make_shutdown_signal_handler.<locals>.shutdown_signal_handler.<locals>._snapshot¿   s   ø€ ÝLÙ,¨_Ó=Ð=r   z Takeover marker check failed: %sz$Planned stop marker check failed: %sTz$snapshot_shutdown_context failed: %sr�   Nu?   Received %s as a planned --replace takeover â€” exiting cleanlyÚSIGTERMu9   Received %s as a planned gateway stop â€” exiting cleanlyzSIGTERM/SIGINTu#   Received %s â€” initiating shutdownc               ó   € V ^8„  d   QhRR/# r`   r   )r   s   "r   r   r“   Ú   s   € ÷ ^ñ ^ $ñ ^r   c                 óD   <€ ^ RI Hp  SP                  RV ! S4      4       R# )rc   )Úformat_context_for_logzShutdown context: %sN)r¡   r¨   rM   )r¨   Ú_shutdown_ctxrD   s    €€r   Ú_log_contextÚb_start_gateway_make_shutdown_signal_handler.<locals>.shutdown_signal_handler.<locals>._log_contextÚ   s   ø€ åMØ—‘Ð5Ñ7MÈmÓ7\Ö]r   c               ó   € V ^8„  d   QhRR/# r`   r   )r   s   "r   r   r“   ß   s   € ÷ wñ w ñ wr   c                 óT   <€ ^ RI Hp  V ! SR,          R,          SR,          RR7       R# )rc   )Úspawn_async_diagnosticÚlogszgateway-shutdown-diag.logr�   r0   )Útimeout_secondsN)r¡   r®   )r®   r]   r©   s    €€r   Ú_diagnosticÚa_start_gateway_make_shutdown_signal_handler.<locals>.shutdown_signal_handler.<locals>._diagnosticß   s+   ø€ õ NÙ&Ø  6Õ)Ð,GÕGÈÐW_ÕI`Ðru÷wr   z!format_context_for_log failed: %sz!spawn_async_diagnostic failed: %s)r"   ÚSIGINTrI   r‹   Ú_stop_requested_by_signalÚcreate_taskÚstop)r¢   r—   r�   r£   Úplanned_takeoverÚplanned_stopÚsig_namerª   r±   r©   r[   r]   r‹   rŽ   rD   Úplanned_stop_seenÚrunnerr�   s   f        @€€€€€€€€r   Úshutdown_signal_handlerÚL_start_gateway_make_shutdown_signal_handler.<locals>.shutdown_signal_handler³   s[  ú€ õ	6õ
	:õ
	>ô  ¡¨YÐ8ZÓ [Ó\ÐØ&¨&¯-©-Ñ7÷ pð pØ Ô ×nÐn¤T©,°}ÐFlÓ*mÓ%nð 	÷ Ø#'Ð˜aÒ Ø˜q×!Ô!×*:ØˆLÙ$ YÐ0VÓWˆß.;�= Ö*ÀˆçØ�K‰KÐYÐ[c×[pÐ[pÐgpÕqßØ�K‰KÐSÐU]×UqÐUqÐaqÕrð QUÐTÐ& qÑ)¨FÔ,MØ�K‰KÐ=¸x×?[Ð?[ÐK[Ô\àÒ$÷^ñ ^÷
wñ wñ ˜Ð'JÔKÙ˜Ð&IÔJßð
 04ˆFÔ,Ø×Ñ˜FŸK™K›MÖ*r   ©N)rA   r[   r]   rŽ   rD   r�   )	r»   r‹   r¼   r[   r]   rŽ   rD   rº   r�   s	   ff @@@@@@r   Ú+_start_gateway_make_shutdown_signal_handlerr¿   ®   s$   ÿ€ çQÕQØ˜Ð÷;+ö ;+ðx #Ð"r   c               ó    € V ^8„  d   QhRRRR/# )r   r9   r"   r   r   )r   s   "r   r   r   ò   s   € ÷ ñ ¨ð ¸$ñ r   c                ó¸  € ^ RI HpHpHp ^ RIp^ RIHpHpHpH	pH
p	 V! 4       p
V
e)   W£P                  4       8w  d   VP                  RV
4       R# V! 4       '       g   VP                  R4       R#  V	! 4        TP                  T4       TP                  T4       ^ RIHp T! 4        T! T R	7       R
#   \         d    T! 4        TP                  R4        R# i ; i)z]Claim the runtime lock + PID file (O_EXCL winner is the authoritative gateway). False = lost.)Ú_claim_host_gateway_rolerD   ÚosN)Úacquire_gateway_runtime_lockÚget_running_pidÚrelease_gateway_runtime_lockr*   Úwrite_pid_filez^Another gateway instance (PID %d) started during our startup. Exiting to avoid double-running.FzBGateway runtime lock is already held by another instance. Exiting.z8PID file race lost to another gateway instance. Exiting.)Ú"publish_pending_multiplex_decisionr8   T)rA   rÂ   rD   rÃ   ÚatexitrB   rÄ   rÅ   rÆ   r*   rÇ   ÚgetpidrE   ÚFileExistsErrorÚregisterÚ!hermes_cli.gateway_multiplex_moderÈ   )r9   rÂ   rD   rÃ   rÉ   rÄ   rÅ   rÆ   r*   rÇ   Ú_current_pidrÈ   s   &           r   Ú_start_gateway_claim_pid_filerÏ   ò   sÂ   € çBÑBÛ÷)õ )ñ #Ó$€LØÒ L·I±I³KÔ$?Ø�‰ð 8Ø9Eô	GáÙ'×)Ò)Ø�‰ÐYÔZÙðÙÔð
 ‡O�O�OÔ$Ø
‡O�OÐ0Ô1ÝTÙ&Ô(Ù 5Õ)Ùøô ô Ù$Ô&Ø�‰ÐOÔPÚðús   Á1B2 Â2#CÃCc              ƒ  ó   a aaaaaaaa"  € ^ RI HoHpHoHo ^ RIp^ RIoRp ^ RIHpH	o ^ RI
HpHpHpHp ^ RIHp	 ^ RIHp
 ^ RIHo S P*                  oVVVV 3R lpSP-                  4       oR	 VVV V3R
 llpR VVVV 3R llpV! RVRVRVRV! S 4      RV! S 4      RV! S 4      RV! S 4      RV
! S S4      RV	! S S4      /	R7      pS P.                  Vn        VP3                  4       G Rj  x€L
 '       g   RpV# VP5                  VP6                  4       VS n         V#  L3  \:         d    pTP=                  RT4       Rp Rp?T# Rp?ii ; i5i)z[Start the gateway control socket (identify/status/pause-for-update); None when unavailable.)rŽ   rD   rÃ   Ú	threadingN)ÚGatewayControlServerÚbuild_identify_payload)Úmigrate_profile_identity_verbÚpurge_profile_identity_verbÚunserve_profile_verbÚserve_profile_verb)Úreload_plugins_verb)Úactive_work_verb)ÚRESTART_WAIT_REASONc                 óæ  <€ S! 4       p T P                  R Uu/ uF  pVS9   g   K  VSV,          bK  	  up4       \        SRR4      '       d.   V P                  RR7       SP                  R4      S8w  d   . V R&   V P                  R4      R8X  d$   SP                  R4      '       d   SR,          V R&   RR	R
R	/P                  V P                  R4      V P                  RR	4      4      V R&   V # u upi )Úinstance_idÚstateÚcapabilitiesÚ	_drainingFÚdraining)rÝ   Údrain_reasonÚmanualÚnoneÚdesktopÚ
supervisor)rÜ   Úruntime_protocolÚauthority_epochrÝ   Ú
api_originÚserved_profilesÚparked_profilesrÞ   )ÚupdateÚgetattrr~   )ÚpayloadÚkeyrÚ   rÓ   Ú
descriptorr»   s     €€€€r   Ú_identify_runtimeÚ>_start_gateway_start_control_socket.<locals>._identify_runtime%  s   ø€ Ù,Ó.ˆGØ�N‰Nñ =Fó \ñ =F°SàILÐPZÑIZô 1˜C ¨C¥Ò0ñ =Fñ \ô ]ô �v˜{¨E×2Ò2Ø—‘ Z�Ô0ð —>‘> .Ó1Ð5HÔHØ.0�G˜NÑ+Ø�{‰{˜7Ó# zÔ1°j·n±nÀ^×6TÒ6TØ*4°^Õ*D�˜Ñ'Ø%-¨v°yÀ&Ð$I×$MÑ$MØ—‘˜LÓ)¨7¯;©;°|ÀVÓ+Ló%NˆG�LÑ!àˆNùò\s
   ˜	C.¦C.c               ó   € V ^8„  d   QhRR/# ©r   r   r
   r   )r   s   "r   r   Ú9_start_gateway_start_control_socket.<locals>.__annotate__=  s   € ÷ 	=ñ 	=¨4ñ 	=r   c                 óP  <aa€  ^ RI Hp  \        V ! 4       4      p. oS	P                  ! 4       oR VVV3R llpSP                  V4       SP                  RR7       \        S;'       d
    S^ ,          4      pRVRV'       * R	SP                  4       R
V/#   \         d    Rp L‰i ; i)rc   )Ú_get_restart_drain_timeoutg      >@c               ó   € V ^8„  d   QhRR/# r`   r   )r   s   "r   r   Ú\_start_gateway_start_control_socket.<locals>._pause_for_update_handler.<locals>.__annotate__F  s   € ÷  ñ  ˜dñ  r   c                 ó˜   <€  SP                  SP                  R RR7      4       S P                  4        R#   S P                  4        i ; i)FT)ÚdetachedÚvia_serviceN)ÚappendÚrequest_restartÚset)Ú_doneÚaccepted_boxr»   s   €€€r   Ú_requestÚX_start_gateway_start_control_socket.<locals>._pause_for_update_handler.<locals>._requestF  s:   ø€ ð Ø ×'Ñ'¨×(>Ñ(>ÈÐ[_Ð(>Ó(`Ôaà—I‘I–Kø�E—I‘I•Kús	   ƒ"7 ·A	r0   ©ÚtimeoutÚpausingÚalready_stoppingÚpidÚdrain_timeout)	Úhermes_cli.gatewayrö   ÚfloatrG   ÚEventÚcall_soon_threadsafeÚwaitr"   rÊ   )
rö   Ú_drainr  Úacceptedrÿ   r   Ú
_main_looprÃ   r»   rÑ   s
       @@€€€€r   Ú_pause_for_update_handlerÚF_start_gateway_start_control_socket.<locals>._pause_for_update_handler=  s¥   ú€ ðÝIÜÑ9Ó;Ó<�ð (*ˆLØ—O’OÓ%ˆE÷ ò  ð ×+Ñ+¨HÔ5Ø�J‰J˜sˆJÔ#Ü˜L×<Ð<¨\¸!­_Ó=ˆHà˜8Ð%7¸X¼Ø�r—y‘y“{ O°Vð=ð =øô ô Ø’ðús   …B ÂB%Â$B%c               ó   € V ^8„  d   QhRR/# ró   r   )r   s   "r   r   rô   S  s   € ÷ 	fñ 	f¨$ñ 	fr   c                 ó   <€ SP                  SP                  RR7      S4      p  V P                  RR7      pR\        \        SP                  R	R
4      4      /VC#   SP                  P                   d    RRRSP                  4       /p LUi ; i)a]  ``hermes profile create/delete`` asks the multiplexer to reconcile ``profiles/`` now
(the watcher also rescans periodically). Runs on the socket executor: marshal onto the loop
and wait briefly so the caller learns whether the profile is served. A gateway standalone
only because the host had one profile starts multiplexing in place on this rescan.zcontrol-socket)Úreasonr0   r  ÚpendingTré   Ú	multiplexÚmultiplex_profilesF)	Úrun_coroutine_threadsafeÚreconcile_served_profilesÚresultÚfuturesÚTimeoutErrorÚserved_profile_namesr"   rì   rw   )Úfuturer  r  rŽ   Ú
concurrentr»   s     €€€€r   Ú_rescan_profiles_handlerÚE_start_gateway_start_control_socket.<locals>._rescan_profiles_handlerS  s    ø€ ð
 ×5Ñ5Ø×0Ñ0Ð8HÐ0ÓIÈ:óWˆFð]ð  Ÿ™¨s˜Ó3�ð  ¤¤g¨f¯m©mÐ=QÐSXÓ&YÓ!ZÐeÐ^dÐeÐeøð ×%Ñ%×2Ñ2ô ]Ø# TÐ+<¸f×>YÑ>YÓ>[Ð\’ð]ús   ¥A Á/BÂBzpause-for-updateÚidentifyzrescan-profileszmigrate-profile-identityzunserve-profilezserve-profilezpurge-profile-identityzactive-workzreload-plugins)Úverb_handlerszFControl socket startup failed; the gateway cannot start without it: %s)rA   rŽ   rD   rÃ   rÑ   rÉ   Úconcurrent.futuresÚgateway.control_socketrÒ   rÓ   Úgateway.run_profile_reconcilerÔ   rÕ   rÖ   r×   Úgateway.run_plugin_rewirerØ   Úgateway.run_active_work_verbrÙ   Úgateway.drain_controlrÚ   Úsession_runtime_descriptorÚget_running_loopÚsession_ticket_storeÚticket_storer   rÌ   Úcleanup_filesÚsession_control_serverrG   rE   )r»   rD   rÉ   Ú_control_serverrÒ   rÔ   rÕ   rÖ   r×   rØ   rÙ   rð   r  r!  Ú_cs_excrÚ   r  rŽ   rÓ   r   rï   rÃ   rÑ   s   f              @@@@@@@@r   Ú#_start_gateway_start_control_socketr3    si  ÿøé € ç<Ó<ÛÛØ€Oðc÷ 	X÷	
ó 	
õ 	BÝAÝ=Ø×6Ñ6ˆ
÷	ð 	ð, ×-Ñ-Ó/ˆ
÷	=ó 	=÷,	fó 	fñ /Ø-Ð/HÈ*ÐVgØ,Ð.FØ5Ñ7TÐU[Ó7\Ø,Ñ.BÀ6Ó.JØ*Ñ,>¸vÓ,FØ3Ñ5PÐQWÓ5Xà(Ñ*:¸6À:Ó*Nð ,Ñ-@ÀÈÓ-Tð
VôWˆð (.×'BÑ'BˆÔ$Ø$×*Ñ*Ó,×,Ö,Ø"ˆOð Ðð �O‰O˜O×9Ñ9Ô:ð -<ˆFÕ)ð Ðñ -øô ô Ø�‰Ð]Ð_fÔgØŒØÐûðüsS   ‹E£CD! Ã+DÃ,	D! Ã6D! Ã8EÃ:"D! ÄEÄD! Ä!EÄ,EÅ EÅEÅEc                ó”  a a€ ^ RI HpHpHpHoHpHpHpHp ^ RI	H
pHp	Hp
 VP                  ! 4       p S! S P                  4      pV
! V	! 4       \#        V4      ^8„  R7      pRS P$                  RVP'                  4       /p\)        Wè4      '       d�   V'       dy   VV 3R lVR	&   W?R
&   \+        S RR4      VR&   S P,                  VR&   TP/                  R\#        V4      V Uu. uF$  p\)        V\0        4      '       d
   V^ ,          MTNK&  	  up4       \)        Wè4      '       d
   V 3R lVR&   ^ RIHp V! VP6                  V3WûR7      p^ RIHp VP=                  V4       \)        Wè4      '       gJ    VP>                  S P$                  ;'       g    / 9   pV'       g   VP!                  R\+        VRR4      4       VP@                  ! WK3RS P$                  RVP'                  4       RVRS RV/RRR7      pVP=                  V4       W¾VV3#   \         d    pTP!                  RT4       . p Rp?ELåRp?ii ; iu upi   \         d    Rp Lµi ; i)zˆStart the cron scheduler thread + gateway housekeeping thread; returns
``(cron_stop, cron_provider, cron_thread, housekeeping_thread)``.)ÚDictÚPlatformÚ_cron_profile_gateÚ_cron_tick_profile_homesÚ_start_gateway_housekeepingrŽ   rD   rÑ   )ÚInProcessCronSchedulerÚresolve_cron_schedulerÚscheduler_for_profile_modez,Could not resolve profile homes for cron: %sN)r  ÚadaptersÚloopc                 ó(   <€ S ! SP                   4      # r¾   ©rw   )r8  r»   s   €€r   Ú<lambda>Ú<_start_gateway_start_cron_and_housekeeping.<locals>.<lambda>•  s   ø€ Ñ5MÈfÏmÉmÔ5\r   Úprofile_homesÚprofile_gateÚ_profile_adaptersÚprofile_adaptersÚdefault_profilez*Cron scheduler will tick %d profile(s): %sc                 óN   <€ S P                   ;'       g    S P                  '       * # r¾   )rß   Ú_external_drain_active)r»   s   €r   rA  rB  ¦  s   ø€ Ø×Ñ×=Ð= × =Ñ =õ5?r   Úcan_dispatch)ÚSupervisedTickerThread)r   r   Ú
stop_event)Úprocess_ownershipTuu  Cron provider '%s' is active but the api_server adapter is NOT running in this gateway â€” scheduled fires arrive over loopback HTTP and will all fail (jobs only run when triggered manually). Most common cause: API_SERVER_KEY is missing from this gateway process's environment. Restart the gateway through its supervisor (`hermes gateway restart`) so the profile env loads.r   ÚexternalÚcron_providerr»   Úcron_threadzgateway-housekeeping)Útargetr   r   Údaemonr   )!rA   r5  r6  r7  r8  r9  rŽ   rD   rÑ   Úcron.scheduler_providerr:  r;  r<  r  rw   rG   rM   Úlenr=  r,  Ú
isinstancerì   Ú_primary_profile_namerI   ÚtupleÚcron.scheduler_threadrK  r   Úgateway.runtime_ownershiprM  Ústart_writerÚ
API_SERVERÚThread)r»   r5  r6  r7  r9  rŽ   rD   rÑ   r:  r;  r<  Ú	cron_stopÚcron_profile_homesÚexcrO  Úcron_start_kwargsÚprK  rP  rM  Ú_has_api_serverÚhousekeeping_threadr8  s   f                     @r   Ú*_start_gateway_start_cron_and_housekeepingrd  |  sV  ù€ ÷ T÷  Tó  T÷Tñ Tà—’Ó!€Ið
 Ù5°f·m±mÓDÐñ
 /ÙÓ ´SÐ9KÓ5LÈqÑ5PôR€Mà)3°V·_±_ÀfÈg×NfÑNfÓNhÐ(iÐä�-×8Ò8×=Oõ .]Ð˜/Ñ*à,>˜.Ñ)ô 18¸Ð@SÐUYÓ0ZÐÐ,Ñ-ð 06×/KÑ/KÐÐ+Ñ,Ø�‰Ø8¼#Ð>PÓ:QÙ:LÓMÑ:L°Q”Z ¤5×)Ò)ˆQˆqŽT¨qÒ0Ñ:LÑMô	Oô
 �-×8Ò8ô-?Ð˜.Ñ)õ =Ù(Ø×Ñ 9 ,Ð7Hô`€Kå;Ø×"Ñ" ;Ô/ô �m×<Ò<ð	#Ø&×1Ñ1°f·o±o×6KÐ6KÈÑLˆO÷ Ø�N‰Nð6ô ˜ v¨zÓ:ô<ð $×*Ò*Ø*°Ø˜FŸO™O¨V°W×5MÑ5MÓ5OØ °¸&À-ÐQ\ð^àÐ0ô	2Ðð
 ×"Ñ"Ð#6Ô7Ø [Ð2EÐEÐEøô} ô  Ø�‰ÐEÀsÔKØÖûð üò0 Nøô$ ô 	#Ø"ŠOð	#ús5   ³H Ã*H2Å.H7 ÆH7 ÈH/ÈH*È*H/È7IÉIc               ó4   € V ^8„  d   QhRRRRRRRRRRR	R
RR/# )r   r]  zthreading.EventrP  r   rc  zthreading.ThreadÚ_planned_stop_watcher_stopÚ_planned_stop_watcher_threadr‹   rŒ   r   r"   r   )r   s   "r   r   r   Ë  sW   € ÷ 0Pñ 0PØ(7ð0Pàð0Pà+;ð0Pð !0ð0Pð P`ð0Pð !%ð	0Pð *.ñ	0Pr   c	              ƒ  ó|  "  € ^ RI Hp	Hp
HpHpHpHpHp Ve    VP                  4       G Rj  x€L
  R R lpV! V4       VP                  4        V! V4       V! WIR7      G Rj  x€L
 '       g   \        P                  R	V	4       V! WZR7      G Rj  x€L
  VP                  4        VP                  ^R7        V! \        V R
R4      R7      G Rj  x€L
  V! W^ ,          4      #  L¶  \         d    \        P                  RRR7        LØi ; i L© L~ LA  \         d    \        P                  RRR7        Lci ; i5i)zVPost-``wait_for_shutdown`` teardown; returns the process exit verdict (True = exit 0).)Ú_CRON_SHUTDOWN_DRAIN_TIMEOUTÚ$_HOUSEKEEPING_SHUTDOWN_DRAIN_TIMEOUTÚ_await_thread_exitr[   Ú_resolve_gateway_exit_verdictÚ!_shutdown_mcp_servers_nonblockingÚ_stop_cron_providerNz&Control socket stop failed (non-fatal)Tr4   c               ó   € V ^8„  d   QhRR/# r`   r   )r   s   "r   r   Ú2_start_gateway_shutdown_tail.<locals>.__annotate__Ú  s   € ÷ #ñ #˜Tñ #r   c                 ó    € ^ RI Hp  V ! 4        R# )rc   ©Ústop_nous_auth_keepaliveN)Úhermes_cli.nous_auth_keepalivers  rr  s    r   Ú_stop_keepaliveÚ5_start_gateway_shutdown_tail.<locals>._stop_keepaliveÚ  s   € ÝKÙ Ö"r   r  ub   Cron ticker did not exit within %.0fs of shutdown â€” an in-flight delivery may have been dropped.rw   r@  ú1MCP shutdown failed; connections may be left open)rA   ri  rj  rk  r[   rl  rm  rn  r¶   rG   rD   rH   rþ   rM   Újoinrì   )r»   r1  r]  rO  rP  rc  rf  rg  r‹   ri  rj  rk  r[   rl  rm  rn  ru  s   &&&&&&&&&        r   Ú_start_gateway_shutdown_tailry  Ë  s6  é € ÷ Z÷  Zñ  Zð Ò"ð	RØ!×&Ñ&Ó(×(Ð(õ#ñ �Ô!ð ‡M�M„OÙ˜Ô&Ù# KÔV×VÖVÜ�‰ð 9Ø:Vô	Xá
Ð0Ô
_×_Ð_ð ×"Ñ"Ô$Ø ×%Ñ%¨aÐ%Ô0ð[Ù/´w¸vÀxÐQUÓ7VÔW×WÐWñ )¨ÈAÕ1NÓOÐOñK )øÜô 	RÜ�L‰LÐAÈDˆLÖQð	Rúñ$ Wñ `ñ 	XøÜô [Ü�‰ÐJÐUYˆÖZð[üs‘   ‚D<šC& ­C$®C& ²2D<Á$DÁ%	D<Á/"D<ÂDÂ&D<Â9D ÃDÃD ÃD<Ã$C& Ã&"DÄD<Ä
DÄD<ÄD<ÄD Ä"D9Ä6D<Ä8D9Ä9D<c               ó   € V ^8„  d   QhRR/# r’   r   )r   s   "r   r   r   ÿ  s   € ÷ !5ñ !5¨tñ !5r   c                ó:  € ^ RI Hp ^ RIHpHp V! V! 4       4      pVR9   d   R# ^ RIHp V e<   V! V! 4       4      '       g)   ^ RIHpHp V! RRRV: R	24      pRV n	        V! V4       R# ^ R
I
Hp	 ^ RIHp
 VP                  RV4       V
! RRR7       \        V	4      h)aê  A named profile serving ``default`` as a secondary splits default's local sessions between
the two stores (routing rows follow the launch home, receipts follow the authority), so the
multiplexer is the default profile's job.

An EXPLICIT ``gateway.multiplex_profiles: true`` (config.yaml or ``GATEWAY_MULTIPLEX_PROFILES``)
on a named launch home exits EX_CONFIG: a config verdict, never a retry. The implicit default
(unset key, or the retired ``false`` that ``resolve_multiplex_mode`` settles like unset) is not
the operator's choice, so it is downgraded the way every other implicit-multiplex blocker is:
this process comes up standalone, says why, and *config* is flipped in place so the boot below
reserves and serves only the launch profile.)Úprofile_name_for_home)r'   rD   T)Úexplicit_multiplex_flag)ÚMultiplexDecisionÚlog_multiplex_decisionFÚguardzprofile z� launched the gateway, and only the default profile runs the multiplexer (start it with `hermes gateway run` from the default profile to serve every profile)©ÚGATEWAY_FATAL_CONFIG_EXIT_CODE©Ú_write_runtime_status_quietzùgateway.multiplex_profiles is set on profile %r, but only the default profile can run the multiplexer. Unset the flag in this profile's config.yaml, or start the gateway from the default profile (`hermes gateway run`), which serves this profile too.r.   Ú"multiplex_requires_default_profile©r1   r2   )NÚdefault)Úhermes_constantsr|  rA   r'   rD   rÍ   r}  r~  r  r  Úgateway.restartr‚  r„  rE   Ú
SystemExit)rw   r|  r'   rD   r   r}  r~  r  Údecisionr‚  r„  s   &          r   Ú_launch_home_may_multiplexrŒ  ÿ  s«   € õ 7ß3Ù ¡Ó!2Ó3€DØÐ Ô ÙÝIØÒÑ"9¹/Ó:K×"LÒ"Lß_Ù$Ø�7Ø�t‘hð cð códˆð %*ˆÔ!Ù˜xÔ(ÙÝ>Ý7Ø
‡L�Lð	QàRVôXñ  Ð.>ÐLpÕqÜ
Ð3Ó
4Ð4r   c               ó   € V ^8„  d   QhRR/# r`   r   )r   s   "r   r   r   #  s   € ÷ 6ñ 6¨Tñ 6r   c            
     ó¼  € ^ RI p ^ RIHpHp V P                  P                  RR4      pV'       d   W19   d¦   V! VV P                  P                  RR4      V P                  R4      V P                  RR4      P                  4       R
9   \        \        P                  ! 4       4      R	7      pVf   V P                  P                  RR4       R# W@P                  R&   R# R# )zMMessaging-only defaults belong to startup, not incidental imports by the TUI.N)ÚCWD_PLACEHOLDERSÚ resolve_placeholder_terminal_cwdÚTERMINAL_CWDÚ ÚTERMINAL_ENVÚMESSAGING_CWDÚ&TERMINAL_DOCKER_MOUNT_CWD_TO_WORKSPACEÚfalse)Úconfigured_cwdÚterminal_backendÚmessaging_cwdÚdocker_mount_cwd_to_workspaceÚhome_fallback>   Ú1ÚyesÚtrue)rÃ   Úgateway.cwd_placeholderr�  r�  Úenvironr~   ÚgetenvÚlowerrC   r   ÚhomeÚpop)rÃ   r�  r�  r—  Úresolved_cwds        r   Ú#_start_gateway_resolve_terminal_cwdr¦  #  s¬   € ãßZØ—Z‘Z—^‘^ N°BÓ7€Nß˜^Ô?Ù7Ø)ØŸZ™ZŸ^™^¨N¸BÓ?ØŸ)™) OÓ4Ø*,¯)©)Ø8¸'ó+CßCHÁ5Ã7Ø#ñ+$ô œdŸiši›kÓ*ô,ˆð ÒØ�J‰J�N‰N˜>¨4Ö0à)5�J‰J�~Ó&ñ @r   c               ó   € V ^8„  d   QhRR/# )r   r   r
  r   )r   s   "r   r   r   <  s   € ÷ +ñ +¨%ñ +r   c                 ó    € ^ RI Hp  V R,           # )rc   ©ÚBROWSE_RECONCILE_BUDGET_Sg       @)Úhermes_state_reconcilerª  r©  s    r   Ú _browse_reconcile_reserve_wait_sr¬  <  s   € Ý@Ø$ sÕ*Ð*r   c                óæ   € ^ RI HpHp . pV  F-  pV! 4       p VP                  V.4       VP                  4        K/  	  V#   T d    TP	                  T4        L0i ; i  TP                  4        i ; i)a  The homes whose gateway.lock another holder has right now: each probed alone with its own open
file description and released at once (the all-or-nothing reserve does not say which failed).
A home freed meanwhile is simply not listed; the next reserve attempt takes it.)ÚOwnershipConflictÚProfileOwnership)rY  r®  r¯  Úreserverü   Úclose)Úhomesr®  r¯  Úconflictingr£  Úprobes   &     r   Ú_conflicting_homesrµ  A  sp   € ÷ NØ€KÛˆÙ Ó"ˆð	Ø�M‰M˜4˜&Ô!ð �K‰KŽMñ ð Ðøð	 !ô 	%Ø×Ñ˜tÖ$ð	%ûð �K‰K�Mús#   ˜A Á AÁAÁAÁAÁA0Úwait_sc               ó   € V ^8„  d   QhRR/# )r   r¶  zfloat | Noner   )r   s   "r   r   r   R  s   € ÷ ñ À|ñ r   c               ó0  € ^ RI HpHpHp ^ RIHp Vf   \        4       p\        P                  ! 4       V,           pRp  V P                  V4      #   T d¿    \        T4      p	T	 U
u. uF#  p
T! Y¦4      '       g   T! T
4      '       g   K!  T
NK%  	  Mu up
i pp
T'       d4   \        T4      \        T	4      8  g   \        P                  ! 4       T8¼  d   h T'       g!   \        P                  RT^ ,          T4       Rp\        P                  ! R4        K×  i ; i)a  Reserve *homes*, waiting (bounded) while a contender is a browse reconcile or has not yet
published its lock record (flock taken, record unwritten). Only a positively identified holder
that is not browse maintenance refuses at once; the flock exclusion itself is never weakened.)r®  Úlock_record_unpublishedÚmaintenance_holder)ÚBROWSE_RECONCILE_PURPOSEFTzPProfile %s is held by a short session-store schema catch-up; waiting up to %.0fsgš™™™™™¹?)rY  r®  r¹  rº  r«  r»  r¬  ÚtimeÚ	monotonicr°  rµ  rT  rD   rI   Úsleep)Ú	ownershipr²  r¶  r®  r¹  rº  r»  ÚdeadlineÚloggedr³  ÚhÚholderss   &&$         r   Ú%_reserve_waiting_out_browse_reconcilerÄ  R  sî   € ÷ iÑhÝ?Ø‚~Ü1Ó3ˆÜ�~Š~Ó &Õ(€HØ€FØ
ð	Ø×$Ñ$ UÓ+Ð+øØ ô 	ô -¨UÓ3ˆKÙ"-ó i¡+˜QÙ,¨Q×IÒIÑMdÐef×Mg÷ �q¢+ùò iˆGð içœc '›l¬S°Ó-=Ô=ÄÇÂÓAQÐU]ÔA]ØßÜ—‘ÐnØ# A�J¨ô0à�Ü�JŠJ�s�Oð	ús*   ¿A ÁDÁ&BÂ	BÂADÃ6DÄDc               ó   € V ^8„  d   QhRR/# r’   r   )r   s   "r   r   r   n  s   € ÷ ñ °dñ r   c                óª  € ^ RI Hp ^ RIHpHp V! 4       .R V  4       Op \        W$4       R#   T dt   p\        P                  RT4       ^ RIH	p T! 4       '       d@   ^ RI
Hp ^ RI Hp \        P                  R4       T! R	\        T4      R
7       \        T4      h Rp?R# Rp?i\         d"   p\        P                  RT4        Rp?R# Rp?ii ; i)zVReserve the launch home plus every served profile home; False when startup must abort.)r'   )rM  r®  c              3  ó*   "  € T F	  w  rVx € K  	  R # 5ir¾   r   )Ú.0Ú_r£  s   &  r   Ú	<genexpr>Ú2_start_gateway_reserve_profiles.<locals>.<genexpr>r  s   é € Ð!D±m©7¨1¥$³mùs   ‚z#Cannot reserve gateway profiles: %s)Ú+named_profile_served_by_running_multiplexerr�  rƒ  zÏThe default gateway is running as a profile multiplexer and already serves this profile. Manage it with `hermes gateway restart` from the default profile instead of starting a second gateway for the profile.r.   r†  NFT)rA   r'   rY  rM  r®  rÄ  rD   rE   r	  rÌ  r‰  r‚  r„  rC   rŠ  rL   )	rC  r'   rM  r®  r²  r_  rÌ  r‚  r„  s	   &        r   Ú_start_gateway_reserve_profilesrÍ  n  s¶   € å+ßNÙÓÐEÑ!D±mÓ!DÐE€EðÜ-Ð.?ÔGñ* øð) ô Ü�‰Ð:¸CÔ@õ
 	SÙ6×8Ò8ÝFÝ?Ü�L‰Lð2ô3ñ (Ð6FÔTWÐX[ÓT\Õ]ÜÐ;Ó<Ð<ÝûÜô Ü�‰Ð:¸CÔ@Ýûðús'   ¡. ®CµA(B#Â#CÂ0CÂ1CÃCc               ó   € V ^8„  d   QhRR/# r`   r   )r   s   "r   r   r   Œ  s   € ÷ Nñ NÐeiñ Nr   c                óþ  € ^ RI p^ RIHp \        P                  ! 4       \        P
                  ! 4       J d™   VP                  VP                  3 Uu. uF  qUW33NK	  	  pp\        VR4      '       d   VP                  VP                  VR34       V F7  w  rWpV! \        4      ;_uu_ 4        V P                  ! WW.VO5!   RRR4       K9  	  R# \        P                  R4       R# u upi   + '       g   i     Kj  ; i)z8SIGINT/SIGTERM drain, SIGUSR1 restart; main thread only.N)r(   ÚSIGUSR1z6Skipping signal handlers (not running in main thread).r   )r�   Ú
contextlibr(   rÑ   Úcurrent_threadÚmain_threadr³   r¥   Úhasattrrü   rÐ  ÚNotImplementedErrorÚadd_signal_handlerrD   rI   )	r>  r¼   Úrestart_signal_handlerr�   r(   ÚsigÚhandlersÚhandlerr   s	   &&&      r   Ú&_start_gateway_install_signal_handlersrÛ  Œ  sÊ   € ãÝ#Ü×ÒÓ!¤Y×%:Ò%:Ó%<Ó<àGMÇ}Á}ÐV\×VdÑVdÑFeÓfÑFe¸sÐ1°6Ó:ÑFeˆÐfÜ�6˜9×%Ò%Ø�O‰O˜VŸ^™^Ð-CÀRÐHÔIÛ"*ÑˆC˜$ÙÔ-×.Õ.Ø×'Ò'¨Ð<°tÔ<÷ /Ñ.ó #+ô 	�‰ÐLÖMùò g÷ /×.Ð.ús   ÁC&Â,C+Ã+C<c               ó    € V ^8„  d   QhRRRR/# )r   r‹   rŒ   r   zOptional[bool]r   )r   s   "r   r   r   œ  s   € ÷ +ñ +Èð +ÐQ_ñ +r   c              ƒ  óR  "  € ^ RI HpHpHpHp  V! V P
                  4      G Rj  x€L
   V P                  4       G Rj  x€L
 pT'       g   T! T 4       R# T P                  '       d`   T! T 4       T P                  '       d!   \        P                  RT P                  4       T P                  e   \        T P                  4      hR# T P                   '       gN    T P#                  4       G Rj  x€L
   T! \%        T RR4      R	7      G Rj  x€L
  T! Y^ ,          4      T! T 4       # R#  EL  \         d    \        P                  RRR7        EL%i ; i EL  \         d    T! T 4       h i ; i L� Lf  \         d    \        P'                  R
RR7        Lˆi ; i  T! T 4       i ; i5i)z·MCP discovery, then ``runner.start()``. Returns the exit verdict when the process must end
before running mode (start failed, clean exit, aborted startup); None to continue into cron.)Ú_discover_gateway_mcp_toolsrl  Ú_shutdown_gateway_health_exportrm  Nz%MCP tool discovery failed (non-fatal)Tr4   FzGateway exiting cleanly: %srw   r@  rw  )rA   rÞ  rl  rß  rm  rw   rG   rD   rH   r   ÚBaseExceptionÚshould_exit_cleanlyr2   rE   Ú	exit_coderŠ  Ú_runningÚwait_for_shutdownrì   rM   )r»   r‹   rÞ  rl  rß  rm  Úsuccesss   &&     r   Ú_start_gateway_run_runnerræ  œ  sx  é € ÷aó aðMñ
 *¨&¯-©-Ó8×8Ð8ðØŸ™›×&ˆ÷ Ù'¨Ô/Ùà×!×!Ð!Ù'¨Ô/Ø××ÐÜ�L‰LÐ6¸×8JÑ8JÔKà×ÑÒ'Ü˜V×-Ñ-Ó.Ð.ÙØ�?�?ˆ?ð	4Ø×*Ñ*Ó,×,Ð,ðcÙ7¼wÀvÈxÐY]Ó?^Ô_×_Ð_ñ 1°ÐTUÕ9VÓWá+¨FÕ3ÙòA 	9øÜô MÜ�‰Ð<Àtˆ×LðMúò 'øÜô Ù'¨Ô/Øðúñ$ -á_øÜô cÜ—‘ÐRÐ]a�Öbðcûñ ,¨FÕ3üsÌ   ‚F'�D* ¥D'¦D* «E ¾E¿E ÁF'ÁF'Á'F'ÂAF'ÃF Ã,E.Ã-F Ã2E2 Ä	E0Ä
E2 ÄF ÄF'Ä'D* Ä*"EÅF'ÅEÅF'ÅE ÅE+Å+F'Å.F Å0E2 Å2"FÆF ÆFÆF Æ
F$Æ$F'c               ó   € V ^8„  d   QhRR/# r`   r   )r   s   "r   r   r   Ê  s   € ÷ Mñ M°ñ Mr   c                 ó  €  ^ RI Hp  V ! 4       P                  R4      p\        V\        4      '       d   VP                  RR4      '       g   R# ^ RIHp V! 4        R#   \         d    \        P                  RRR7        R# i ; i)	zµBackground-start the host toolchain probe the warm-up and first prompt read (idempotent;
honours ``agent.environment_probe: false``). Never raises: the warm-up still runs it lazily.)Úload_config_readonlyÚagentÚenvironment_probeTN)Úwarm_environment_probe_asyncz%early environment probe did not startr4   )
rt   ré  r~   rU  r
   Útools.env_proberì  rG   rD   rH   )ré  Ú	agent_cfgrì  s      r   Ú&_start_gateway_early_environment_proberï  Ê  sk   € ðMÝ:Ù(Ó*×.Ñ.¨wÓ7ˆ	Ü�i¤×&Ò&¨y¯}©}Ð=PÐRV×/WÒ/WÙÝ@Ù$Ö&øÜô MÜ�‰Ð<Àtˆ×LðMús   ‚A	A ÁA Á"BÂBc               ó0   € V ^8„  d   QhRRRRRRRRRRR	R/# )
r   rw   zOptional[GatewayConfig]r!   r"   rX   rY   r9   Ú	idle_exitr   r   )r   s   "r   r   r   Ø  sC   € ÷ Q+ñ Q+Ð 7ð Q+Èð Q+Ø#0ðQ+Ø=AðQ+ØVZðQ+ØgkñQ+r   c              ƒ  ó¼  "  € ^ RI HpHpHpHpHp	Hp
HpHpH	pH
pHpHpHpHpHp RVP                   R&   \#        4        ^ RIHp V! 4        ^ RIHp V! 4        V e   T MV! 4       p\-        4        \/        VRR4      '       d	   V! V4      M. pV'       d   \1        V4      '       g   R# V'       d   \/        VRR4      '       g   . pV
! W4      G Rj  x€L
 pVe   V# ^ R	IHp V! 4       pVe2   VVP7                  4       8w  d   \9        VV4      G Rj  x€L
 '       g   R# ^ R
IHpHp \?        V4      '       g   R# V'       d   \A        V4      Vn!        \E        VR7      '       g
   V! 4        R# RpRpRp \G        V4       ^ RI$H%p  VPM                  V 4      G Rj  x€L
  V! V4      p^ RI'H(p! V!! V4      G Rj  x€L
  V! VPR                  4       \U        V4      Vn+        R.p"\Y        VV"4      p#V! V4      p$VP[                  4       p%V%P]                  V	4       \_        V%V#V$4       VP`                  ! 4       pVPb                  ! VVVV%V#3RRR7      p&V&Pe                  4        \g        V4      G Rj  x€L
 pVf   \i        R4      hT! V4       V! V4       ^ RI'H5p' V'! V4      G Rj  x€L
  R R lp(R R lp)V! V(R4      p*V! V)R4       V! 4        \m        VV"4      G Rj  x€L
 p+V+e�   T+ VeX   ^ RI'H7p, V,! V4      G Rj  x€L
  \/        VRR4      f   \/        VRR4      '       g   RVn8        VPs                  4       G Rj  x€L
  Ve   VPu                  4        Ve   VPs                  4       G Rj  x€L
  V! 4        V! 4        # V*e   \w        V*4       \y        V4      w  p-p.p/p0^ RI'H=p1H>p2  V1! V4       VP                  4        V'       d   ^ RI@HAp3 V3! V4       M^ RIBHCp4 V4! V4       V2! V4      G Rj  x€L
   VPs                  4       G Rj  x€L
  \‰        VVV-V.V/V0VV&V"4	      G Rj  x€L
 p5T5 TeX   ^ RI'H7p, T,! T4      G Rj  x€L
  \/        TRR4      f   \/        TRR4      '       g   RTn8        TPs                  4       G Rj  x€L
  Te   TPu                  4        Te   TPs                  4       G Rj  x€L
  T! 4        T! 4        #  ELò ELµ EL1 EL ELd EL2 ELü ELß EL¡ ELt  Te   TPu                  4        Te   TPs                  4       G Rj  x€L 
  T! 4        T! 4        i ; i EL7 EL! EL	  \‰        TTT-T.T/T0TT&T"4	      G Rj  x€L 
 p5i ; i   TPs                  4       G Rj  x€L 
  \‰        TTT-T.T/T0TT&T"4	      G Rj  x€L 
 p5i   \‰        TTT-T.T/T0TT&T"4	      G Rj  x€L 
 p5i ; i; i ELm EL/ EL  Te   TPu                  4        Te   TPs                  4       G Rj  x€L 
  T! 4        T! 4        i ; i   TeZ   ^ RI'H7p, T,! T4      G Rj  x€L 
  \/        TRR4      f   \/        TRR4      '       g   RTn8        TPs                  4       G Rj  x€L 
  Te   TPu                  4        Te   TPs                  4       G Rj  x€L 
  T! 4        T! 4        i   Te   TPu                  4        Te   TPs                  4       G Rj  x€L 
  T! 4        T! 4        i ; i; i5i)ac  Start the gateway and run until interrupted; False if it failed to start (non-zero exit so
systemd can auto-restart). ``replace`` kills any existing instance first (avoids restart-loop
deadlocks); ``force`` starts without consulting the host owner at all; ``idle_exit`` arms the
unmanaged idle exit (``gateway.run_idle_exit``) for a client-started daemon.)ÚGatewayRunnerr[   Ú_enable_multiplex_log_routingÚ$_ensure_windows_gateway_venv_importsÚ_gateway_loop_exception_handlerÚ_host_attach_or_noneÚ _log_standalone_profiles_at_bootÚ_multiplex_profile_homesÚ_refresh_host_gateway_recordÚ_run_planned_stop_watcherÚ*_start_gateway_make_restart_signal_handlerrŽ   Úload_gateway_config_for_runnerrÃ   rÑ   rœ  ÚHERMES_EXEC_ASK)Úapply_nofile_soft_limit)Úrecord_boot_fingerprintNr  F)rÅ   )r*   rÆ   r8   )Ú"recover_left_core_at_gateway_start)Úinitialize_gateway_runtimeTzplanned-stop-watcher)rQ  r   rR  r   z6gateway session bootstrap control listener unavailable)Ústart_gateway_runtime_apic               ó   € V ^8„  d   QhRR/# )r   r   zOptional[dict]r   )r   s   "r   r   Ú#start_gateway.<locals>.__annotate__g  s   € ÷ 	$ñ 	$¨>ñ 	$r   c                 ó   € ^ RI Hp  V ! 4       # )rc   ©Úrecord_startup)r   r  r  s    r   Ú_lifecycle_record_startupÚ0start_gateway.<locals>._lifecycle_record_startupg  s   € õ @Ù!Ó#Ð#r   c               ó   € V ^8„  d   QhRR/# r`   r   )r   s   "r   r   r  n  s   € ÷ 	(ñ 	( $ñ 	(r   c                 ó    € ^ RI Hp  V ! 4        R# )rc   ©Ústart_nous_auth_keepaliveN)rt  r  r  s    r   Ú_start_keepaliveÚ'start_gateway.<locals>._start_keepaliven  s   € ÝPÙ%Ö'r   z*Lifecycle ledger startup record failed: %sz%Nous auth keepalive did not start: %s)Údrain_gateway_runtimeÚ
_stop_taskrã  )Úpublish_gateway_runtime_readyÚwait_gateway_runtime)Úarm_unmanaged_idle_exit)Úwarm_gateway_dashboard)ErA   ró  r[   rô  rõ  rö  r÷  rø  rù  rú  rû  rü  rŽ   rý  rÃ   rÑ   r   r¦  Úhermes_cli.resource_limitsrÿ  Úgateway.code_skewr   rï  rì   rŒ  rB   rÅ   rÊ   rV   r*   rÆ   rÍ  rW  Ú_runtime_profile_homesrÏ   r‰   Úgateway.run_startupr  Ú	to_threadÚgateway.run_runtimer  rw   r"   Ú _platform_lock_takeover_on_startr¿   r,  Úset_exception_handlerrÛ  r  r\  r   r3  ÚRuntimeErrorr  ræ  r  Ú_startup_cleanup_onlyr¶   rþ   r   rd  r  r  Ú_start_systemd_watchdogÚgateway.run_idle_exitr  Úgateway.run_apir  ry  )6rw   r!   rX   r9   rñ  ró  r[   rô  rõ  rö  r÷  rø  rù  rú  rû  rü  rŽ   rý  rÃ   rÑ   rÿ  r   Úresolved_configrC  Ú_host_decisionrÅ   r   r*   rÆ   r1  r»   rf  r  r  r‹   r¼   r×  r>  rg  r  r	  r  Ú_unclean_exitÚ_early_verdictr  r]  rO  rP  rc  r  r  r  r  Úverdicts6   &&&&&                                                 r   Ústart_gatewayr)  Ø  sÀ  é € ÷÷ ÷ ÷ ñ ð$ %(€B‡J�JÐ Ñ!Ü'Ô)åBÙÔõ :ÙÔð !'Ò 2‘fÑ8VÓ8X€Oô +Ô,ä Ð1EÀu×MÒMñ .¨oÔ>ØSUð çÔ7¸×HÒHÙßœW _Ð6JÈE×RÒRØˆñ 0°Ó?×?€NØÒ!ØÐõ /Ù"Ó$€LØÒ  \°R·Y±Y³[Ô%@ÜBÀ<ÐQXÓY×YÖYÙçLÜ*¨=×9Ò9ÙçÜ16°}Ó1EˆÔ.ô
 )¨u×5Ó5Ù$Ô&Ùà€OØ€FØ!%ÐðD+Ü(¨Ô3åJØ×ÑÐ BÓC×CÐCá˜Ó/ˆÝBÙ(¨Ó0×0Ð0ñ 	& f§m¡mÔ4ô 37°w³-ˆÔ/ð ', WÐ"ä"MØÐ.ó#0Ðñ "LÈFÓ!SÐà×'Ñ'Ó)ˆð 	×"Ñ"Ð#BÔCä.¨tÐ5LÐNdÔeð &/§_¢_Ó%6Ð"Ø'0×'7Ò'7Ø,Ø,¨f°dÐ<SÐTÐ]aØ'ô()Ð$ð 	%×*Ñ*Ô,ô !DÀFÓ K×KˆØÒ"ÜÐWÓXÐXá$ VÔ,Ù(¨Ô0ÝAÙ'¨Ó/×/Ð/õ	$õ	(ñ %Ð%>Ð@lÓmˆÙÐ%Ð'NÔOÙ,Ô.ä8¸ÐA[Ó\×\ˆØÒ%Ø!ðB	+ØÒ!ÝEÙ+¨FÓ3×3Ð3ô ˜6 <°Ó6Ò>ÄwÈvÐWaÐch×GiÒGiØ37�FÔ0Ø—k‘k“m×#Ð#à)Ò5Ø*×.Ñ.Ô0ØÒ*Ø%×*Ñ*Ó,×,Ð,ÙÔÙ(Õ*ða Ò$Ü4°]ÔCô 7°vÓ>ñ 	Cˆ	�= +Ð/B÷ 	\ð	já)¨&Ô1Ø×*Ñ*Ô,ßÝIÙ'¨Õ/õ
 CÙ& vÔ.Ù& vÓ.×.Ð.ðjØ—k‘k“m×#Ð#ä <Ø˜O¨Y¸À{ÐTgØ.Ð0LÐNhó!j÷ j�ð ð	+ØÒ!ÝEÙ+¨FÓ3×3Ð3ô ˜6 <°Ó6Ò>ÄwÈvÐWaÐch×GiÒGiØ37�FÔ0Ø—k‘k“m×#Ð#à)Ò5Ø*×.Ñ.Ô0ØÒ*Ø%×*Ñ*Ó,×,Ð,ÙÔÙ(Õ*òA @ò Zò0 	Dò 	1òb Lò 	0ò" ]òL 4ò $ò
 -øð *Ò5Ø*×.Ñ.Ô0ØÒ*Ø%×*Ñ*Ó,×,Ñ,ÙÔÙ(Õ*úò7 /ò $òjøÔ <Ø˜O¨Y¸À{ÐTgØ.Ð0LÐNhó!j÷ jð j‘ûðjØ—k‘k“m×#Ñ#ä <Ø˜O¨Y¸À{ÐTgØ.Ð0LÐNhó!j÷ jð j‘øÔ <Ø˜O¨Y¸À{ÐTgØ.Ð0LÐNhó!j÷ jð j‘ýò 4ò $ò
 -øð *Ò5Ø*×.Ñ.Ô0ØÒ*Ø%×*Ñ*Ó,×,Ñ,ÙÔÙ(Õ*ûð!	+ØÒ!ÝEÙ+¨FÓ3×3Ñ3ô ˜6 <°Ó6Ò>ÄwÈvÐWaÐch×GiÒGiØ37�FÔ0Ø—k‘k“m×#Ñ#à)Ò5Ø*×.Ñ.Ô0ØÒ*Ø%×*Ñ*Ó,×,Ñ,ÙÔÙ(Õ*øð *Ò5Ø*×.Ñ.Ô0ØÒ*Ø%×*Ñ*Ó,×,Ñ,ÙÔÙ(Õ*ÿsW  ‚B[Â[Â/ [ÃSÃ?[ÄSÄ	[Ä$[Ä?1[Å1%W6 ÆSÆW6 Æ4S
Æ5B4W6 É)SÉ*4W6 ÊSÊ8W6 ËSË	W6 Ë"SË7SË8A SÌ8SÌ9SÌ=+[Í(SÍ)[Í<'W6 Î$AU Ï,T#Ï-U Ï2T, ÐT&ÐT, Ð
W6 Ð T)Ð!W6 Ð'V2Ð<V)Ð=A V2Ñ=V,Ñ>V2Ò+[Ò-V/Ò.[Ó[ÓW6 Ó
W6 ÓW6 ÓW6 ÓW6 ÓSÓSÓ[Ó,T ÔT
ÔT Ô [Ô#U Ô&T, Ô)W6 Ô,U
ÕUÕU
Õ
W6 ÕV&ÕVÕ"U%Õ#VÕ(V&Õ>VÕ?V&ÖV#ÖVÖV#Ö#V&Ö&W6 Ö)V2Ö,V2Ö/[Ö2,W3×W!
×W3×3[×6[×8ZØXØAZÙYÙZÙ+[Ú ZÚ[Ú,[Û[Û[Û[Û[)Fr¾   )NFrc   FF)!Ú__doc__Ú
__future__r   r^   rÑ   r¼  Úpathlibr   Útypingr   r   Úgateway.configr   r   rƒ   rD   rV   r‰   r¿   rÏ   r3  rd  ry  rŒ  r¦  r¬  rµ  rÄ  rÍ  rÛ  ræ  rï  r)  r   r   r   Ú<module>r/     s©   ðÙ GÝ "ã Û Û Ý ß  å (õgð 
×	Ò	˜=Ó	)€õhõV")õJA#÷Hò:jòZLFõ^0P÷h!5õH6õ2+ò
ð"ÐVZ÷ õ8õ<Nõ +õ\M÷Q+ñ Q+r   