+
    jHàjèr  ã                  óÂ  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIHtHtHt ]P*                  ! ]4      t^tRtRt]P6                  R8H  t^dtRJtRKtRt R	 R
 lt!R R lt"R R lt#R R lt$R R lt%R R lt&R R lt'R R lt(R R lt)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(4      t0 ! R) R*]Pb                  4      t2R+RR,] /R- R. llt3R/ R0 lt4R1 R2 lt5R3 R4 lt6R5 R6 lt7R,] /R7 R8 llt8R,] /R9 R: llt9R,R;/R< R= llt:R> R? lt;R@ RA lt<R,R;/RB RC llt=R,R;/RD RE llt>RFRR,RG/RH RI llt?R# )Lu½  Gateway control socket â€” the gateway-owned local coordination surface: a local-only socket answering
versioned JSON verbs (``identify``, ``status``). A connectable socket with a well-formed ``identify``
answer IS liveness â€” no PID-reuse heuristics. Never a TCP port: filesystem/pipe ACLs are the auth
boundary. POSIX: ``$HERMES_HOME/gateway.sock`` (or a temp-dir socket + ``gateway.sock.path`` pointer
file when the home path exceeds ``sun_path``); Windows: named pipe ``\\.\pipe\hermes-gateway-<hash>``.
Wire contract: ONE request per connection â€” one JSON line in, one out, then the server closes.
Consumers PREFER the socket and fall back to the state-file/scan layer when it doesn't answer.
)ÚannotationsN)ÚPath)ÚAnyÚCallableÚOptionalzgateway.sockzgateway.sock.pathÚwin32g       @c               ó    € V ^8„  d   QhRRRR/# ©é   Úhomer   ÚreturnÚstr© )Úformats   "Ú;/home/ubuntu/.hermes/hermes-agent/gateway/control_socket.pyÚ__annotate__r   (   s   € ÷ Añ A�Tð A˜cñ Aó    c           
     ó  € \         P                  ! \        P                  P	                  \        \        V 4      P                  4       P                  R R7      4      4      P                  R4      4      P                  4       R,          # )F)Ústrictúutf-8:Né   N)ÚhashlibÚsha256ÚosÚpathÚnormcaser   r   Ú
expanduserÚresolveÚencodeÚ	hexdigest©r   s   &r   Ú
_home_hashr!   (   sb   € Ü�>Š>œ"Ÿ'™'×*Ñ*¬3¬t°D«z×/DÑ/DÓ/F×/NÑ/NÐV[Ð/NÓ/\Ó+]Ó^×eÑeÐfmÓnÓo×yÑyÓ{Ð|õ  Að  Ar   c               ó    € V ^8„  d   QhRRRR/# r	   r   )r   s   "r   r   r   ,   s   € ÷ :ñ :˜Dð : Sñ :r   c                ó   € R\        V 4       2# )z4Per-HERMES_HOME named pipe path (Windows transport).z\\.\pipe\hermes-gateway-)r!   r    s   &r   Úwindows_pipe_namer$   ,   s   € à&¤z°$Ó'7Ð&8Ð9Ð9r   c               ó    € V ^8„  d   QhRRRR/# ©r
   r   r   r   Úboolr   )r   s   "r   r   r   1   s   € ÷ <ñ <˜ð < $ñ <r   c                óV   € \        \        V 4      P                  R 4      4      \        8*  # )r   )Úlenr   r   Ú_MAX_UNIX_PATH©r   s   &r   Ú_fits_sun_pathr,   1   s!   € ÜŒs�4‹y×Ñ Ó(Ó)¬^Ñ;Ð;r   c               ó   € V ^8„  d   QhRR/# )r
   r   úOptional[Path]r   )r   s   "r   r   r   5   s   € ÷ 	ñ 	˜nñ 	r   c                 óš  € \         P                  P                  RR4      p \        '       g.   V '       d&   \         P                  P                  V 4      '       g   R# \        P                  ! \        4      ;_uu_ 4        \        \        V 4      4      '       d   \        V 4      uuRRR4       #  RRR4       R#   + '       g   i     R# ; i)z«``$XDG_RUNTIME_DIR`` when it is what the spec promises: an absolute directory owned by this
user with no group/other access. Other users cannot pre-create names inside it.ÚXDG_RUNTIME_DIRÚ N)r   ÚenvironÚgetÚ_IS_WINDOWSr   ÚisabsÚ
contextlibÚsuppressÚOSErrorÚ_private_directoryr   )Úraws    r   Ú_private_runtime_dirr;   5   s   € ô �*‰*�.‰.Ð*¨BÓ
/€Cßƒ{Ÿ#¤R§W¡W§]¡]°3×%7Ò%7ÙÜ	×	Ò	œW×	%Õ	%Üœd 3›i×(Ò(Ü˜“9÷ 
&Ò	%Ø(÷ 
&ñ ÷ 
&Ö	%ñ ús   Á>%B9Â9C
	c               ó    € V ^8„  d   QhRRRR/# )r
   r   r   r   r   )r   s   "r   r   r   A   s   € ÷ 	Mñ 	M ð 	M¨ñ 	Mr   c                ó0  € R\        V 4       R2p\        4       pV'       d
   W!,          .M. \        \        P                  ! 4       4      V,          .,           \
        '       d   . M\        R4      V,          .,           p\        R V 4       V^ ,          4      # )a%  Short path for homes whose direct socket path exceeds sun_path: the private
``$XDG_RUNTIME_DIR`` first, then ``tempfile.gettempdir()`` and ``/tmp`` (POSIX); if nothing fits
the first candidate is returned anyway. A squatted shared-temp name is handled at bind time
(``_squat_proof_fallback``).ú
hermes-gw-z/control.sockz/tmpc              3  óL   "  € T F  p\        V4      '       g   K  Vx € K  	  R # 5i©N)r,   ©Ú.0Úcs   & r   Ú	<genexpr>Ú(_fallback_socket_path.<locals>.<genexpr>J   s   é € Ð<™J�q¬.¸×*;—’›Jùs   ‚$š
$)r!   r;   r   ÚtempfileÚ
gettempdirr4   Únext)r   ÚnameÚruntimeÚ
candidatess   &   r   Ú_fallback_socket_pathrL   A   s{   € ð
 œ
 4Ó(Ð)¨Ð7€DÜ"Ó$€Gß&-�7•>Ñ"°2¼$¼x×?RÒ?RÓ?TÓ:UÐX\Õ:\Ð9]Õ]ß‹k‰¤ V£¨tÕ 3Ð4õ6€JäÑ<™JÓ<¸jÈ½mÓLÐLr   c               ó    € V ^8„  d   QhRRRR/# r&   r   )r   s   "r   r   r   M   s   € ÷ bñ b˜Tð b dñ br   c                óö   € V P                  4       p\        P                  ! VP                  4      ;'       dC    VP                  \
        P                  ! 4       8H  ;'       d    VP                  ^?,          '       * # )é?   )ÚlstatÚstatÚS_ISDIRÚst_modeÚst_uidr   Úgetuid)r   Úinfos   & r   r9   r9   M   sL   € Ø�:‰:‹<€DÜ�<Š<˜Ÿ™Ó%×aÐa¨$¯+©+¼¿º»Ñ*D×aÐaÈTÏ\É\Ð\aÕMaÔIaÐar   c               ó    € V ^8„  d   QhRRRR/# )r
   Ú	bind_pathr   r   r   )r   s   "r   r   r   R   s   € ÷ 	ñ 	 Tð 	¨dñ 	r   c                óZ  € \        \        P                  ! RV P                  P                  R7      4      pWP                  P                  ,          V P                  ,          p\        V4      '       g   VP                  4        \        R4      hVP                  P                  RR7       V# )z¬Same ``hermes-gw-<hash>/control.sock`` leaf (what clients authenticate through the private
pointer), under a fresh ``mkdtemp`` root no other user can predict or pre-create.zhgw-©ÚprefixÚdirzHfallback control directory is squatted and no private path fits sun_pathéÀ  ©Úmode)	r   rF   ÚmkdtempÚparentrI   r,   ÚrmdirÚPermissionErrorÚmkdir)rX   Úrootr   s   &  r   Ú_squat_proof_fallbackrf   R   s~   € ô ”× Ò ¨°I×4DÑ4D×4KÑ4KÔLÓM€DØ×"Ñ"×'Ñ'Õ'¨)¯.©.Õ8€DÜ˜$×ÒØ�
‰
ŒÜÐhÓiÐiØ‡K�K×Ñ˜5ÐÔ!Ø€Kr   c               ó$   € V ^8„  d   QhRRRRRR/# )r
   Úpointer_filer   rX   r   ÚNoner   )r   s   "r   r   r   ^   s!   € ÷ ñ  4ð °Dð ¸Tñ r   c                ó  € \         P                  ! RV P                   R2V P                  R7      w  r# \        P
                  ! VRRR7      ;_uu_ 4       pVP                  \        V4      4       RRR4       \        P                  ! W04       R#   + '       g   i     L(; i  \         dW    \        P                  ! \        4      ;_uu_ 4        \        P                  ! T4       RRR4       h   + '       g   i     h ; ii ; i)a«  Replace ``pointer_file`` with one naming ``bind_path``, atomically: the listener is already
accepting, so a client polling for it may read the pointer at any instant, and an empty or
partial pointer is ``invalid_control_pointer`` to it, a refusal rather than "still starting".
The fresh mkstemp inode is 0600 and the rename replaces a symlink rather than following it,
which also heals an older gateway's leftover 0644 pointer.Ú.rZ   Úwr   ©ÚencodingN)rF   ÚmkstemprI   ra   r   ÚfdopenÚwriter   ÚreplaceÚBaseExceptionr6   r7   r8   Úunlink)rh   rX   ÚfdÚtmpÚpointers   &&   r   Ú_publish_pointerrx   ^   s²   € ô ×Ò¨¨,×*;Ñ*;Ð)<¸AÐ&>ÀL×DWÑDWÔX�G€BðÜ�YŠY�r˜3¨×1Õ1°WØ�M‰Mœ#˜i›.Ô)÷ 2ä
�
Š
�3Ö%÷ 2×1ûô ô Ü× Ò ¤×)Õ)Ü�IŠI�cŒN÷ *à÷ *Ö)àúðús;   ´!B# ÁBÁ0B# ÂB 	ÂB# Â#-DÃC0Ã'	DÃ0D Ã;	Dc               ó    € V ^8„  d   QhRRRR/# )r
   r   r   r   ztuple[Path, Optional[Path]]r   )r   s   "r   r   r   o   s   € ÷ wñ w Tð wÐ.Iñ wr   c                óš   € \        V 4      \        ,          p\        V4      '       d   VR3# \        V 4      \        V 4      \        ,          3# )zYReturn ``(bind_path, pointer_file)``; pointer_file is set only for the temp-dir fallback.N)r   Ú_SOCKET_FILENAMEr,   rL   Ú_POINTER_FILENAME)r   Údirects   & r   Úresolve_server_socket_pathr~   o   sC   € ä�$‹ZÔ*Õ*€FÜ+¨F×3Ò3ˆF�Dˆ>ÐvÔ:OÐPTÓ:UÔW[Ð\`ÓWaÔduÕWuÐ9vÐvr   c               ó    € V ^8„  d   QhRRRR/# )r
   r   r   r   r.   r   )r   s   "r   r   r   u   s   € ÷ 
ñ 
 Tð 
¨nñ 
r   c                óô  € \        V 4      \        ,          pVP                  4       '       d   V# \        P                  ! \
        4      ;_uu_ 4        \        V 4      \        ,          pVP                  4       '       d!   VP                  RR7      P                  4       MRpV'       d5   \        V4      P                  4       '       d   \        V4      uuRRR4       # RRR4       R#   + '       g   i     R# ; i)zHWhere a client should connect for ``home``, or None when nothing exists.z	utf-8-sigrm   r1   N)
r   r{   Úexistsr6   r7   r8   r|   Úis_fileÚ	read_textÚstrip)r   r}   rw   Útargets   &   r   Úresolve_client_socket_pathr†   u   s¦   € ä�$‹ZÔ*Õ*€FØ‡}�}‡‚ØˆÜ	×	Ò	œW×	%Õ	%Ü�t“*Ô0Õ0ˆØDKÇOÁO×DUÒDU�×"Ñ"¨KÐ"Ó8×>Ñ>Ô@Ð[]ˆß”d˜6“l×)Ñ)×+Ò+Ü˜“<÷	 
&×	%Ò	%ñ
 ÷ 
&Ö	%ñ
 ús   ÁAC&Â()C&Ã&C7	c               ó   € V ^8„  d   QhRR/# )r
   r   r   r   )r   s   "r   r   r   ‚   s   € ÷ Kñ K˜Cñ Kr   c                 ó<  € \         P                  p V P                  R4      '       d   R# ^ RIHp \
        P                  R8X  d(   V! V 4      '       g   V P                  R4      '       d   R# V P                  R4      '       d   R# R	\
        P                  9   d   R
# R# )u'  Supervisor kind for THIS process from its own launch env (not inferred outside-in).

Unlike the outside-in `_detect_supervisor_for_pid` scan, this answers from the process's own launch
context â€” which is exactly the provenance the 92091 design wants declared rather than inferred. See
#92091.
ÚINVOCATION_IDÚsystemd)Úlaunchd_job_labelÚdarwinÚLAUNCHD_SOCKETÚlaunchdÚHERMES_DESKTOP_MANAGEDÚdesktopz--external-supervisorÚexternalÚmanual)r   r2   r3   Úgateway.restartr‹   ÚsysÚplatformÚargv)Úenvr‹   s     r   Ú_detect_supervisorr˜   ‚   st   € ô �*‰*€CØ
‡w�wˆ×ÒÙÝ1Ü
‡|�|�xÔÑ%6°s×%;Ò%;¸s¿w¹wÐGW×?XÒ?XÙØ
‡w�wÐ'×(Ò(ÙØ0´C·H±HÔ<ˆ:ÐJÀ(ÐJr   c               ó    € V ^8„  d   QhRRRR/# )r
   Úvaluer   r   r'   r   )r   s   "r   r   r   ”   s   € ÷ :ñ : Sð :¨Tñ :r   c                ó"   € ^ RI Hp V! V 4      RJ# )u-  Whether ``value`` is ``authenticated_subject``'s namespaced login form
``auth:v1:[provider, issuer, user]`` (gateway.session_identity) â€” the only identity
a same-user peer may forward a ticket for. Bare labels (``admin``, ``uid:501``) fail:
they can collide with another stored owner representation.)Úparse_authenticated_subjectN)Úgateway.session_identityrœ   )rš   rœ   s   & r   Ú_structured_login_subjectrž   ”   s   € õ
 EÙ& uÓ-°TÐ9Ð9r   c               ó    € V ^8„  d   QhRRRR/# )r
   Úidentityúdict[str, Any]r   úOptional[str]r   )r   s   "r   r   r   �   s   € ÷ ñ  ð °=ñ r   c                ó”   € R FA  pV P                  V4      p\        V\        4      '       g   K,  V'       g   K6  VR8w  g   K?  Vu # 	  R# )a_  What launched the gateway behind an ``identify`` answer (``manual``, ``desktop``, ``systemd``, ...).

The session runtime protocol folds ``manual`` and ``desktop`` into ``supervisor: "none"``, so the
launch value rides in ``launch_supervisor``. A gateway that predates that field and answers
``"none"`` is ambiguous: None (unknown), never ``manual``.
ÚnoneN)Úlaunch_supervisorÚ
supervisor)r3   Ú
isinstancer   )r    Úkeyrš   s   &  r   r¥   r¥   �   s=   € ó 3ˆØ—‘˜SÓ!ˆÜ�eœS×!Ô!§e¡e°¸¶ØŠLñ 3ñ 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 HpHpHp V ! 4       p\        4       pR\        /R
 Uu/ uF  qfVP                  V4      bK  	  upCRT! VP                  R4      ;'       g    R4      RVRV/CV! 4       Cp\        P                  ! \        4      ;_uu_ 4        V! 4       ;'       g    / P                  R4      p\        V\        4      '       d   V'       d   W‡R&   R	R	R	4       V# u upi   + '       g   i     T# ; i)zBDefault ``identify`` answer, built from gateway.status primitives.)Ú_build_pid_recordÚ_get_code_identity_fieldsÚ_profile_label_for_homeÚread_runtime_statusÚprotocolÚhermes_homeÚprofiler1   r¦   r¥   Úserved_profilesN)ÚkindÚpidÚ
start_timer±   )Úgateway.statusr¬   r­   r®   r¯   r˜   ÚCONTROL_PROTOCOL_VERSIONr3   r6   r7   Ú	Exceptionr§   Úlist)	r¬   r­   r®   r¯   Úrecordr¦   ÚkÚpayloadÚserveds	            r   Úbuild_identify_payloadr¿   «   sò   € çyÓyÙÓ €FÜ#Ó%€JàÔ,ðbá%QÓ
RÑ%Q ˆf�j‰j˜‹mÒÑ%QÑ
Rðbð 	Ñ*¨6¯:©:°mÓ+D×+JÐ+JÈÓKØ�jÐ"5°zñ	bñ F_ÓE`ð	b€Gô
 
×	Ò	œY×	'Õ	'á%Ó'×-Ð-¨2×2Ñ2Ð3DÓEˆÜ�fœd×#Ò#¯Ø)/Ð%Ñ&÷	 
(ð
 €Nùò S÷ 
(Ö	'ð
 €Nús   ©C$Â>C)ÃC)Ã)C:	c               ó   € V ^8„  d   QhRR/# rª   r   )r   s   "r   r   r   ½   s   € ÷ Fñ F˜nñ Fr   c                 ó˜   € ^ RI Hp  / V ! 4       ;'       g    / CR\        R\        P                  ! 4       R\        P
                  ! 4       /C# )uD   Default ``status`` answer â€” current runtime status, answered live.©r¯   r°   Úanswered_atÚanswering_pid)r·   r¯   r¸   Útimer   ÚgetpidrÂ   s    r   Úbuild_status_payloadrÇ   ½   sE   € å2ðFÑ"Ó$×*Ð*¨ð F¨ZÔ9QØœ4Ÿ9š9›;¨¼¿º»ñFð Fr   c                  ó¢   € ] tR t^ÄtRtRRR/R R llltR R 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 R ltR R ltR R ltRtR# )ÚGatewayControlServeru  Gateway-owned control socket server (identify/status, v1): ``start()`` after the PID-file claim,
``stop()`` on shutdown. All failures are non-fatal â€” the gateway never refuses to serve messaging
because its control socket couldn't bind; consumers fall back to the scan layer.NÚverb_handlersc               ó$   € V ^8„  d   QhRRRRRR/# )r
   r   r.   rÊ   z2Optional[dict[str, Callable[..., dict[str, Any]]]]r   ri   r   )r   s   "r   r   Ú!GatewayControlServer.__annotate__É   s(   € ÷ iñ i˜^ð iØ RðiØ^bñir   c               	ó  € Vf   ^ RI Hp V! 4       p\        V4      P                  4       V n        R V n        / V n        R V n        R V n        R V n	        R V n
        R V n        / V n        R\        R\        /T;'       g    / CV n        R # )N)Ú_get_process_hermes_homeÚidentifyÚstatus)r·   rÎ   r   r   Ú_homeÚticket_storeÚprivate_handlersÚ_serverÚ_pipe_serverÚ
_bind_pathÚ_pointer_fileÚ_fallback_rootÚ_file_identitiesr¿   rÇ   Ú	_handlers)Úselfr   rÊ   rÎ   s   &&$ r   Ú__init__ÚGatewayControlServer.__init__É   s�   € àŠ<Ý?Ù+Ó-ˆDô ˜$“Z×'Ñ'Ó)ˆŒ
Ø ˆÔØ "ˆÔØ9=ˆŒØ!%ˆÔØ*.ˆŒØ-1ˆÔØ.2ˆÔØ "ˆÔàÔ.°Ô:NðDiØS`×SfÐSfÐdfðDiˆŽr   c               ó   € V ^8„  d   QhRR/# ©r
   r   r'   r   )r   s   "r   r   rÌ   Ü   s   € ÷ ñ ˜Tñ r   c              ƒ  ó  "  €  \         '       d   V P                  4       MV P                  4       G Rj  x€L
 #  L  \         d;   pT P	                  4       G Rj  x€L 
  \
        P                  RT4        Rp?R# Rp?ii ; i5i)zABind and start serving. Returns True on success, False otherwise.Nz6Gateway control socket failed to start (non-fatal): %sF)r4   Ú_start_windowsÚ_start_posixr¹   ÚstopÚloggerÚwarning)rÛ   Úexcs   & r   ÚstartÚGatewayControlServer.startÜ   s_   é € ð	ß3>³;˜$×-Ñ-Ô/ÀD×DUÑDUÓDW×XÐXÑXøÜô 	Ø—)‘)“+×ÑÜ�N‰NÐSÐUXÔYÝûð	üsC   ‚B„/: ³8´: ·B¸: ºA?ÁA:ÁAÁA:Á4BÁ:A?Á?Bc               ó   € V ^8„  d   QhRR/# rß   r   )r   s   "r   r   rÌ   å   s   € ÷ %ñ % Dñ %r   c              ƒ  	óþ  "  € \        V P                  4      w  rVe©   \        P                  ! \        4      ;_uu_ 4        VP
                  P                  RR7       R R R 4       \        VP
                  4      '       gG   \        P                  RVP
                  4       \        V4      pVP
                  P
                  V n        VP                  4       '       d   \        R4      hVP                  4       '       dN   VP                  4       P                   \"        P$                  ! 4       8w  d   \        R4      hVP'                  4        \"        P(                  ! ^4      p \*        P,                  ! V P.                  \1        V4      R7      G R j  x€L
 V n        \"        P(                  ! V4       \        P                  ! \4        4      ;_uu_ 4        \"        P6                  ! VR4       R R R 4       Wn        VP                  4       pVP:                  VP<                  3V P>                  V&   Ve   \A        W!4       W n!        \E        R V P8                  V PB                  34       F8  pVP                  4       pVP:                  VP<                  3V P>                  V&   K:  	  \        PG                  RV4       R	#   + '       g   i     ELc; i EL<  \"        P(                  ! T4       i ; i  + '       g   i     EL	; i5i)
Nr]   r^   z?Fallback control directory %s is not private; using a fresh onez"control socket cannot be a symlinkz&control socket belongs to another userr+   i€  z&Gateway control socket listening at %sT)$r~   rÑ   r6   r7   ÚFileExistsErrorra   rd   r9   rä   rå   rf   rØ   Ú
is_symlinkrc   r�   rP   rT   r   rU   rt   ÚumaskÚasyncioÚstart_unix_serverÚ_handle_connectionr   rÔ   r8   ÚchmodrÖ   Úst_devÚst_inorÙ   rx   r×   ÚfilterrV   )rÛ   rX   rh   Ú	old_umaskrV   r   s   &     r   râ   Ú!GatewayControlServer._start_posixå   s  é € Ü"<¸T¿Z¹ZÓ"HÑˆ	ØÒ#Ü×$Ò$¤_×5Õ5Ø× Ñ ×&Ñ&¨EÐ&Ô2÷ 6ä% i×&6Ñ&6×7Ò7ô —‘Ð`Ðbk×brÑbrÔsÜ1°)Ó<�	Ø&/×&6Ñ&6×&=Ñ&=�Ô#Ø×Ñ×!Ò!Ü!Ð"FÓGÐGð ×Ñ×ÒØ�‰Ó ×'Ñ'¬2¯9ª9«;Ô6Ü%Ð&NÓOÐOØ×ÑÔä—H’H˜U“Oˆ	ð	 Ü!(×!:Ò!:¸4×;RÑ;RÔY\Ð]fÓYgÔ!h×hˆDŒLä�HŠH�YÔÜ× Ò ¤×)Õ)Ü�HŠH�Y Ô&÷ *à#ŒØ�‰Ó ˆØ,0¯K©K¸¿¹Ð+Eˆ×Ñ˜iÑ(ØÒ#Ü˜\Ô5Ø!-ÔÜ˜4 $§/¡/°4×3EÑ3EÐ!FÖGˆDØ—:‘:“<ˆDØ+/¯;©;¸¿¹Ð*DˆD×!Ñ! $Ó'ñ Hô 	�‰Ð<¸iÔHÙ÷E 6×5Ð5úò& iøä�HŠH�YÕúß)×)Ð)üsn   ‚>K=Á J7ÁA>K=Ã K=Ã=A#K=Å!.K ÆKÆ	K Æ8K=ÇK)Ç)CK=Ê7K	Ë	K=ËK ËK&Ë&K=Ë)K:	Ë4	K=c               ó   € V ^8„  d   QhRR/# rß   r   )r   s   "r   r   rÌ     s   € ÷ ñ  dñ r   c              ƒ  	óÆ   "  € ^ RI Hp V! V P                  V P                  4      V n        \
        P                  ! V P                  P                  4      G Rj  x€L
  R#  L5i)é    )ÚNativeControlServerNT)Ú!gateway.runtime_bootstrap_windowsrú   rÑ   Úhandle_request_linerÕ   rî   Ú	to_threadrç   )rÛ   rú   s   & r   rá   Ú#GatewayControlServer._start_windows  sI   é € ÝIÙ/°·
±
¸D×<TÑ<TÓUˆÔÜ×Ò × 1Ñ 1× 7Ñ 7Ó8×8Ð8Ùñ 	9ùs   ‚AA!ÁAÁA!c               ó   € V ^8„  d   QhRR/# ©r
   r   ri   r   )r   s   "r   r   rÌ     s   € ÷ ñ ˜Dñ r   c              ƒ  ó®  "  € V P                   e   V P                   P                  4        V P                  eh   V P                  P                  4        \        P
                  ! \        4      ;_uu_ 4        V P                  P                  4       G Rj  x€L
  RRR4       V P                  e^   \        P
                  ! \        4      ;_uu_ 4        \        P                  ! V P                  P                  4      G Rj  x€L
  RRR4       R;V n        V n        V P                  4        R#  L—  + '       g   i     L�; i LA  + '       g   i     LG; i5i)z1Stop serving and remove the socket/pointer files.N)rÒ   ÚrevokerÔ   Úcloser6   r7   r¹   Úwait_closedrÕ   rî   rý   Úcleanup_files)rÛ   s   &r   rã   ÚGatewayControlServer.stop  sâ   é € à×ÑÒ(Ø×Ñ×$Ñ$Ô&Ø�<‰<Ò#Ø�L‰L×ÑÔ Ü×$Ò$¤Y×/Õ/Ø—l‘l×.Ñ.Ó0×0Ð0÷ 0à×ÑÒ(Ü×$Ò$¤Y×/Õ/Ü×'Ò'¨×(9Ñ(9×(?Ñ(?Ó@×@Ð@÷ 0à+/Ð/ˆŒ�tÔ(Ø×ÑÖñ 1÷ 0×/úñ A÷ 0×/üsZ   ‚A3EÁ5D-ÂD+ÂD-Â8EÃ.EÃ>E Ã?EÄ(EÄ+D-Ä-D=	Ä8EÅ EÅE	ÅEc               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rÌ     s   € ÷ 'ñ '˜tñ 'r   c                ó  € \        RV P                  V P                  34       F„  p\        P                  ! \
        4      ;_uu_ 4        VP                  4       pV P                  P                  V4      VP                  VP                  38X  d   VP                  4        RRR4       K†  	  V P                  P                  4        V P                  e†   \        P                  ! \
        4      ;_uu_ 4        V P                  R\        V P                  4       2,          P!                  4        V P                  P!                  4        RRR4       RV n        R# R#   + '       g   i     EKI  ; i  + '       g   i     L0; i)z<Best-effort removal of socket + pointer files (atexit-safe).Nr>   )rô   rÖ   r×   r6   r7   r8   rP   rÙ   r3   rò   ró   rt   ÚclearrØ   r!   rÑ   rb   )rÛ   r   rV   s   &  r   r  Ú"GatewayControlServer.cleanup_files  s
  € ä˜4 $§/¡/°4×3EÑ3EÐ!FÖGˆDÜ×$Ò$¤W×-Õ-Ø—z‘z“|�Ø×(Ñ(×,Ñ,¨TÓ2°t·{±{ÀDÇKÁKÐ6PÔPØ—K‘K”M÷ .Ñ-ñ Hð
 	×Ñ×#Ñ#Ô%Ø×ÑÒ*Ü×$Ò$¤W×-Õ-Ø×$Ñ$¨´J¸t¿z¹zÓ4JÐ3KÐ'LÕL×SÑSÔUØ×#Ñ#×)Ñ)Ô+÷ .ð #'ˆDÖñ	 +÷ .×-Ñ-ú÷ .×-ús   ÁAEÃ5AE/ÅE,Å/E?	c               ó$   € V ^8„  d   QhRRRRRR/# )r
   r:   ÚbytesÚpeer_subjectr¢   r   r   )r   s   "r   r   rÌ   -  s"   € ÷ ,ñ , uð ,¸Mð ,ÐUZñ ,r   c           
     óh  € Rp \         P                  ! VP                  R4      4      p\        V\        4      '       g   \        R4      hVP                  R4      VP                  R4      rS\        V\        4      '       d   V P                  P                  V4      MRp\        V\        4      '       d¥   WPP                  9   d•   V'       dV   VP                  R4      ^8w  g@   \        V4      0 Rm,
          '       g&   \        VP                  R4      \        4      '       g   \        R4      hR	R
R\        RV P                  V,          ! VR,          V4      /pMÊVR8X  d   R	R
R\        RV P                  WB4      /pM§Vf'   R	RRRV: 2R\        R\        V P                  4      /pM}\        VP                  R4      \        4      '       d   VP                  R4      M/ pR\        P                   ! V4      P"                  9   p	R	R
R\        RV	'       d	   V! V4      MV! 4       /p Ve   W7R&    \         P*                  ! V\        R7      P-                  R4      p\/        V4      \0        8”  ds   R	RRRRRR\0        R\        /p\        V\2        \        34      '       d   \/        \        V4      4      ^€8:  d   W<R&   \         P*                  ! V4      P-                  R4      pVR,           #   \$         d/   p
R	RR\'        T
4      P(                   RT
 2R\        /p Rp
?
L÷Rp
?
ii ; i  \$         d    Rp LÚi ; i)zWOne JSON request line -> one JSON response line. Never raises (shared by POSIX + pipe).Nr   zrequest must be a JSON objectÚidÚverbr°   Úparamsz&authenticated private request requiredÚokTÚresultzsession-ticketFÚerrorzunknown verb: Úsupported_verbsz: )Údefaults7   {"ok": false, "error": "response serialization failed"}Úresponse_too_largeÚcodeÚlimitó   
>   r  r  r  r°   )ÚjsonÚloadsÚdecoder§   ÚdictÚ
ValueErrorr3   r   rÚ   rÓ   Úsetrc   r¸   Ú_session_ticketÚsortedÚinspectÚ	signatureÚ
parametersr¹   ÚtypeÚ__name__Údumpsr   r)   Ú_MAX_RESPONSE_BYTESÚint)rÛ   r:   r  Ú
request_idÚrequestr  ÚhandlerÚresponser  Úwants_paramsræ   ÚencodedÚ	too_larges   &&&          r   rü   Ú(GatewayControlServer.handle_request_line-  sÌ  € àˆ
ð	tÜ—j’j §¡¨GÓ!4Ó5ˆGÜ˜g¤t×,Ò,Ü Ð!@ÓAÐAØ&Ÿ{™{¨4Ó0°'·+±+¸fÓ2E˜Ü2<¸TÄ3×2GÒ2G�d—n‘n×(Ñ(¨Ô.ÈTˆGÜ˜$¤×$Ò$¨×1FÑ1FÔ)Fß$¨¯©°JÓ(?À1Ô(DÜ˜w›<Ò*N×NÔNÜ)¨'¯+©+°hÓ*?Ä×FÒFÜ)Ð*RÓSÐSØ  $¨
Ô4LØ$ d×&;Ñ&;¸DÖ&AÀ'È(ÕBSÐUaÓ&bðd‘àÐ)Ô)Ø  $¨
Ô4LØ$ d×&:Ñ&:¸7Ó&QðS‘à’Ø,0°%¸ÀNÐSWÑRZÐB[Ø,6Ô8PÐRcÔekÐlp×lzÑlzÓe{ð,}‘ô
 3=¸W¿[¹[ÈÓ=RÔTX×2YÒ2Y˜Ÿ™ XÔ.Ð_a�Ø'¬7×+<Ò+<¸WÓ+E×+PÑ+PÑP�Ø  $¨
Ô4LØ$¿¡g¨f¤oÉ7Ë9ðV‘ð Ò!Ø'�T‰Nð	QÜ—j’j ´3Ô7×>Ñ>¸wÓGˆGô ˆw‹<Ô-Ô-à)-¨u°gÐ?SÐU[Ð]qØ)0Ô2EÀzÔSkð)mˆIä˜*¤s¬C j×1Ò1´c¼#¸j»/Ó6JÈcÔ6QØ",˜$‘Ü—j’j Ó+×2Ñ2°7Ó;ˆGØ˜�Ðøô ô 	tØ˜e W´°c³×1CÑ1CÐ0DÀBÀsÀeÐ.LÈjÔZrÐs�Hûð	tûô ô 	QØPŠGð	QúsJ   „CK% ÃBK% Å"K% Å;)K% Æ%A+K% ÈK% È++L! Ë%LË0$LÌLÌ!L1Ì0L1c               ó$   € V ^8„  d   QhRRRRRR/# )r
   r,  r  r  r¢   r   r   )r   s   "r   r   rÌ   [  s&   € ÷ Kñ K tð K¸=ð KÈTñ Kr   c           
     	óp  € V'       d   V P                   f   \        R4      h\        V4      0 Rm,
          '       g   VP                  R4      ^8w  d   \        R4      hVP                  R4      p\	        V\
        4      '       d-   0 Rm\        V4      8:  d   \        V4      0 Rm,
          '       d   \        R
4      hVR,          V P                   P                  8w  d   \        R4      hVP                  R	V4      p\	        V\        4      '       d   V'       d   \        V4      R8”  d   \        R4      hWBJd   \        V4      '       g   \        R4      hV P                   P                  VR,          VVR,          VP                  RR4      R7      pRVR^RV P                   P                  RVR,          R^/# )Nz+authenticated runtime bootstrap unavailabler°   r  zinvalid bootstrap envelopeÚ
profile_idÚinstance_idÚpurposeÚscopeÚsubjectzinvalid bootstrap parameterszstale runtime instanceé   zinvalid bootstrap subjectr²   )r5  r9  r7  r8  ÚticketÚexpires_in_secondsÚruntime_protocol>   r  r  r  r°   >   r7  r5  r6  >   r8  r7  r9  r5  r6  )rÒ   rc   r   r3   r§   r  r6  r   r)   rž   Úmint)rÛ   r,  r  r  r9  r;  s   &&&   r   r!  Ú$GatewayControlServer._session_ticket[  s|  € ß˜t×0Ñ0Ò8Ü!Ð"OÓPÐPÜˆw‹<Ò>×>Ô>À'Ç+Á+ÈjÓBYÐ]^ÔB^Ü!Ð">Ó?Ð?Ø—‘˜XÓ&ˆÜ˜6¤4×(Ò(Ò0XÔ\_Ð`fÓ\gÔ0gÜ�v“;Ò!]×]Ô]Ü!Ð"@ÓAÐAØ�-Õ  D×$5Ñ$5×$AÑ$AÔAÜ!Ð":Ó;Ð;ð —*‘*˜Y¨Ó5ˆÜ˜'¤3×'Ò'¯w¼#¸g»,ÈÔ:LÜ!Ð"=Ó>Ð>ØÓ&Ô/HÈ×/QÒ/QÜ!Ð"=Ó>Ð>Ø×"Ñ"×'Ñ'°6¸,Õ3GÐQXØ/5°iÕ/@ÈÏ
É
ÐSZÐ\eÓHfð (ó hˆà˜&Ð"6¸Ø˜t×0Ñ0×<Ñ<Ø˜f \Õ2Ð4FÈðKð 	Kr   c               ó   € V ^8„  d   QhRR/# )r
   r   r¢   r   )r   s   "r   r   rÌ   w  s   € ÷ ñ ¨]ñ r   c                	ó  € \         P                  R 8X  d   R#  ^ RIHpHp V P
                  pVP                  4       pVP                  4       VP                  4       8w  gY   \        P                  ! VP                  4      '       d3   VP                  \         P                  ! 4       8w  g   V! WT4      '       d   R# V! VP                  R4      4      pV\         P                  ! 4       8X  d   RV 2# R#   \         d     R# i ; i)ÚntN)Úhome_mode_unsafeÚsocket_peer_uidÚsocketzuid:)r   rI   Ú$hermes_cli.gateway_runtime_discoveryrC  rD  rÑ   rP   Úabsoluter   rQ   rR   rS   rT   rU   Úget_extra_infor8   )rÛ   ÚwriterrC  rD  r   rV   Úuids   &&     r   Ú_posix_peer_subjectÚ(GatewayControlServer._posix_peer_subjectw  s·   € ä�7‰7�dŒ?Ùð
	ß^Ø—:‘:ˆDØ—:‘:“<ˆDØ—‘“ 4§<¡<£>Ô1¼¿ºÀdÇlÁl×9SÒ9SØ—{‘{¤b§i¢i£kÔ1Ñ5EÀd×5QÒ5QÙÙ! &×"7Ñ"7¸Ó"AÓBˆCØ#&¬"¯)ª)«+Ô#5�T˜#˜�<Ð?¸4Ð?øÜô 	Úð	ús$   ™A,C2 Â2C2 Â:5C2 Ã0C2 Ã2DÄ Dc               ó$   € V ^8„  d   QhRRRRRR/# )r
   Úreaderzasyncio.StreamReaderrI  zasyncio.StreamWriterr   ri   r   )r   s   "r   r   rÌ   ‡  s$   € ÷ ñ Ð/Cð ÐMað Ðfjñ r   c           	   ƒ  	óT  "  €  \         P                  ! VP                  4       \        R 7      G Rj  x€L
 pV'       d   \	        V4      \
        8”  d?    \        P                  ! \        4      ;_uu_ 4        VP                  4        RRR4       R# \         P                  ! 4       P                  RV P                  VP                  R4      V P                  V4      4      G Rj  x€L
 pVP                  V4       \         P                  ! VP!                  4       \        R 7      G Rj  x€L
  \        P                  ! \        4      ;_uu_ 4        VP                  4        RRR4       R#  EL6  + '       g   i     R# ; i L› LZ  \"        \$        \&        3 d     Lp\         d    \(        P+                  RRR7        L“i ; i  + '       g   i     R# ; i  \        P                  ! \        4      ;_uu_ 4        TP                  4        RRR4       i   + '       g   i     i ; i; i5i)©ÚtimeoutNr  z'Control socket connection handler errorT)Úexc_info)rî   Úwait_forÚreadlineÚ_DEFAULT_CLIENT_TIMEOUTr)   Ú_MAX_REQUEST_BYTESr6   r7   r¹   r  Úget_running_loopÚrun_in_executorrü   ÚrstriprK  rq   ÚdrainÚTimeoutErrorÚConnectionErrorr8   rä   Údebug)rÛ   rN  rI  r:   r.  s   &&&  r   rð   Ú'GatewayControlServer._handle_connection‡  su  é € ð	Ü×(Ò(¨¯©Ó):ÔD[Ô\×\ˆCßœ#˜c›(Ô%7Ô7Øô ×$Ò$¤Y×/Õ/Ø—‘”÷ 0Ñ/ô %×5Ò5Ó7×GÑGØ�d×.Ñ.°·
±
¸5Ó0AÀ4×C[ÑC[Ð\bÓCcóe÷ eˆHà�L‰L˜Ô"Ü×"Ò" 6§<¡<£>Ô;RÔS×SÐSô ×$Ò$¤Y×/Õ/Ø—‘”÷ 0Ñ/ò ]÷ 0×/Ð/úñeñ TøÜœo¬wÐ7ô 	ÙÜô 	SÜ�L‰LÐBÈTˆLÖRð	Sú÷ 0×/Ð/û”×$Ò$¤Y×/Õ/Ø—‘”÷ 0×/×/Ð/ÿsÕ   ‚H(„-F ±E'²F ¾F Á"H(Á5E*Â
H(ÂAF Ã"E>Ã#AF Ä%F Ä&F Ä*"H(ÅGÅ
H(Å'F Å*E;	Å5	H(Å>F Æ F ÆF>ÆG ÆF>Æ#F>Æ;G Æ=F>Æ>G ÇG	Ç	H(Ç#H%Ç8H	È		H%ÈH"ÈH%È%H()
rÖ   rØ   rÙ   rÚ   rÑ   rÕ   r×   rÔ   rÓ   rÒ   r@   )r'  Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rÜ   rç   râ   rá   rã   r  rü   r!  rK  rð   Ú__static_attributes__r   r   r   rÉ   rÉ   Ä   sR   † ñXñiØUY÷ið iõ&õ%õNõ
õ'÷,õ\Kõ8÷ ñ r   rÉ   c                  ó>   € ] tR tRtRtR R ltR R ltR R ltR	tR
# )Ú_PipeControlProtocoli›  z>One-shot request/response protocol for the Windows named pipe.c               ó    € V ^8„  d   QhRRRR/# )r
   ÚserverrÉ   r   ri   r   )r   s   "r   r   Ú!_PipeControlProtocol.__annotate__�  s   € ÷ #ñ #Ð3ð #¸ñ #r   c                	ó>   € Wn         R V n        \        4       V n        R # r@   )rÔ   Ú
_transportÚ	bytearrayÚ_buffer)rÛ   rg  s   &&r   rÜ   Ú_PipeControlProtocol.__init__�  s   € ØŒØ#ˆŒÜ “{ˆŽr   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rh  ¢  s   € ÷ $ñ $¨Dñ $r   c                	ó   € Wn         R # r@   )rj  )rÛ   Ú	transports   &&r   Úconnection_madeÚ$_PipeControlProtocol.connection_made¢  s   € Ø#Žr   c               ó    € V ^8„  d   QhRRRR/# )r
   Údatar  r   ri   r   )r   s   "r   r   rh  ¥  s   € ÷ (ñ ( %ð (¨Dñ (r   c                	ó  € V P                   P                  V4       \        V P                   4      \        8”  d   V P                  P                  4        R# R V P                   9   d{    V P                  P                  V P                  P                  \        V P                   4      P                  R 4      ^ ,          4      4       V P                  P                  4        R# R#   T P                  P                  4        i ; i)r  N)rl  Úextendr)   rV  rj  r  rq   rÔ   rü   r  Ú	partition)rÛ   rt  s   &&r   Údata_receivedÚ"_PipeControlProtocol.data_received¥  s¬   € Ø�‰×Ñ˜DÔ!Üˆt�|‰|ÓÔ1Ô1Ø�O‰O×!Ñ!Ö#Ø�d—l‘lÔ"ð(Ø—‘×%Ñ% d§l¡l×&FÑ&FÄuÈTÏ\É\ÓGZ×GdÑGdÐejÓGkÐlmÕGnÓ&oÔpà—‘×%Ñ%Ö'ñ	 #øð —‘×%Ñ%Õ'ús   Á(AC# Ã#C?)rl  rÔ   rj  N)	r'  r_  r`  ra  rb  rÜ   rq  rx  rc  r   r   r   re  re  ›  s   † ÙHõ#õ
$÷(ñ (r   re  r  rQ  c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R/# )
r
   r   r   r  r   r  úOptional[dict[str, Any]]rQ  Úfloatr   r   )r   s   "r   r   r   °  s2   € ÷ 8ñ 8 ð 8¨Cð 8Ð<Tð 8Ø#(ð8ØG_ñ8r   c               ó  € RVR^R\         /pV'       d   W$R&   \        P                  ! V4      P                  R4      R,           p\        '       d   \
        M\        p V! \        V 4      WS4      pV'       d&   \        P                  ! VP                  R4      4      MRp\        T\        4      '       d'   TP                  R4      R	J d   TP                  R
4      MRp	\        T	\        4      '       d   T	# R#   \         d     R# i ; i)a"  Ask the gateway serving ``home`` a control verb; returns its ``result`` payload. Any failure (no/stale
socket, timeout, malformed answer, ``ok: false``) returns None so callers fall back to the scan layer.
``params`` carries verb arguments (e.g. ``{"old": ..., "new": ...}``). Never raises.r  r  r°   r  r   r  Nr  Tr  )r¸   r  r(  r   r4   Ú_query_windows_pipeÚ_query_unix_socketr   r  r  r¹   r§   r  r3   )
r   r  r  rQ  r½   r,  Úqueryr:   r.  r  s
   &&$$      r   Úquery_gateway_controlr�  °  sÙ   € ð
  & t¨T°1°jÔBZÐ[€GßØ"�ÑÜ�jŠj˜Ó!×(Ñ(¨Ó1°EÕ9€Gß#.£;ÕÔ4F€EðÙ”D˜“J Ó1ˆß69”4—:’:˜cŸj™j¨Ó1Ô2¸tˆô (2°(¼D×'AÒ'AÀhÇlÁlÐSWÓFXÐ\`ÓF`ˆX�\‰\˜(Ô#Ðfj€FÜ ¬×-Ò-ˆ6Ð7°4Ð7øô ô Úðús   ÁAC7 Ã7DÄDc               ó$   € V ^8„  d   QhRRRRRR/# )r
   ÚreadzCallable[[], bytes]Údeadliner|  r   úOptional[bytes]r   )r   s   "r   r   r   Ã  s"   € ÷ 
8ñ 
8Ð1ð 
8¸Uð 
8Àñ 
8r   c                ó*  € . p\         P                  ! 4       V8  dH   V ! 4       pVP                  V4       V'       d   RV9   d   M\        R V 4       4      \        8”  g   K_  R# RP                  V4      P                  R4      ^ ,          ;'       g    R# )zFRead chunks until a newline, EOF, deadline, or the size cap (-> None).r  c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5ir@   )r)   rA   s   & r   rD   Ú&_read_response_line.<locals>.<genexpr>Ë  s   é € Ð&™v˜!Œs�1�vˆv›vùs   ‚Nr   )rÅ   Ú	monotonicÚappendÚsumr)  Újoinrw  )rƒ  r„  ÚchunksÚchunks   &&  r   Ú_read_response_liner�  Ã  ss   € à€FÜ
�.Š.Ó
˜XÔ
%Ù“ˆØ�‰�eÔß˜ œØÜÑ&™vÓ&Ó&Ô)<Ö<ÙØ�8‰8�FÓ×%Ñ% eÓ,¨QÕ/×7Ð7°4Ð7r   c               ó(   € V ^8„  d   QhRRRRRRRR/# ©	r
   r   r   r,  r  rQ  r|  r   r…  r   )r   s   "r   r   r   Ð  s(   € ÷ 
ñ 
˜Tð 
¨Eð 
¸Eð 
Àoñ 
r   c           	     ó:  a€ \        V 4      pVf   R # \        P                  ! \        P                  \        P                  4      ;_uu_ 4       o\        P
                  ! \        4      ;_uu_ 4        SP                  V4       SP                  \        V4      4       SP                  V4       \        V3R l\        P                  ! 4       V,           4      uuR R R 4       uuR R R 4       #   + '       g   i     M; iR R R 4       R #   + '       g   i     R # ; i)Nc                 ó&   <€ S P                  R 4      # )é   )Úrecv)Úsocks   €r   Ú<lambda>Ú$_query_unix_socket.<locals>.<lambda>Ù  s   ø€ ¨4¯9©9°UÔ+;r   )r†   rE  ÚAF_UNIXÚSOCK_STREAMr6   r7   r8   Ú
settimeoutÚconnectr   Úsendallr�  rÅ   r‰  )r   r,  rQ  r   r–  s   &&& @r   r  r  Ð  s°   ø€ Ü% dÓ+€DØ‚|Ùä	�Š”v—~‘~¤v×'9Ñ'9×	:Ô	:¸dÄJ×DWÒDWÔX_×D`ÕD`Ø�‰˜Ô Ø�‰”S˜“YÔØ�‰�WÔÜ"Ô#;¼T¿^º^Ó=MÐPWÕ=WÓX÷	 EaÑD`×	:Ò	:×D`×D`ú×	:ñ
 ÷ 
;Ö	:ñ
 ús%   Á#D	Á1A&C,	Ã
D	Ã,C<Ã7D	Ä	D	c               ó(   € V ^8„  d   QhRRRRRRRR/# r‘  r   )r   s   "r   r   r   Ý  s(   € ÷ 8ñ 8˜dð 8¨Uð 8¸Uð 8Àñ 8r   c                óv   a aa€ ^ RI Hp V! V VV3R lSRR7      pVP                  '       d   R# VP                  # )ue  The native overlapped client checks its deadline per I/O step, but SID verification and the
connect/peer handshake are still synchronous calls into the pipe. Run the exchange on an
abandoned-at-deadline worker so a peer that never answers costs ``timeout``, never forever â€”
the bound ``_query_unix_socket`` already gets from ``sock.settimeout`` (#132547).)Úrun_bounded_syncc                 ó   <€ \        S SS4      # r@   )Ú_windows_pipe_exchange)r   r,  rQ  s   €€€r   r—  Ú%_query_windows_pipe.<locals>.<lambda>ã  s   ø€ Ô'=¸dÀGÈWÔ'Ur   zcontrol-pipe)ÚlabelN)Úagent.deadliner   Ú	timed_outrš   )r   r,  rQ  r   Úoutcomes   fff  r   r~  r~  Ý  s3   ú€ õ
 0ÙÖUÐW^ÐftÔu€GØ×$×$Ð$ˆ4Ð7¨'¯-©-Ð7r   c               ó(   € V ^8„  d   QhRRRRRRRR/# r‘  r   )r   s   "r   r   r   ç  s(   € ÷ ?ñ ? ð ?°ð ?Àð ?È/ñ ?r   c                ó2   € ^ RI Hp V! \        V 4      W4      # )rù   )Úquery_runtime_control)rû   rª  r   )r   r,  rQ  rª  s   &&& r   r¢  r¢  ç  s   € õ Há ¤ d£¨WÓ>Ð>r   c               ó$   € V ^8„  d   QhRRRRRR/# ©r
   r   r   rQ  r|  r   r{  r   )r   s   "r   r   r   ï  s'   € ÷ Dñ D˜4ð D¨Uð DÐQiñ Dr   c               ó   € \        V RVR7      # )z?Convenience wrapper: ``identify`` the gateway serving ``home``.rÏ   rP  ©r�  ©r   rQ  s   &$r   Úidentify_gatewayr°  ï  s   € ä   z¸7ÔCÐCr   c               ó$   € V ^8„  d   QhRRRRRR/# r¬  r   )r   s   "r   r   r   ô  s'   € ÷ Lñ L 4ð L°Uð LÐYqñ Lr   c               ó   € \        V RVR7      # )uH  Ask the gateway serving ``home`` to drain and exit for an update. Returns the ACK ``{"pausing",
"already_stopping", "pid", "drain_timeout"}`` or None when no gateway answers (old gateway without
the verb, no/dead socket) â€” the caller then uses the legacy signal/tree-kill pause path.

Step 2 of the socket migration (#92091).
zpause-for-updaterP  r®  r¯  s   &$r   Úpause_gateway_for_updater³  ô  s   € ô ! Ð'9À7ÔKÐKr   ç       @c               ó$   € V ^8„  d   QhRRRRRR/# r¬  r   )r   s   "r   r   r   þ  s'   € ÷ Kñ K $ð K°Eð KÐD\ñ Kr   c               ó   € \        V RVR7      # )uF  Ask the multiplexer serving ``home`` to reconcile ``profiles/`` now (hot-serve a created profile,
unroute a deleted one). Returns its ``{"served_profiles", "added", "removed", ...}`` answer, or None
when no gateway answers / the gateway predates the verb â€” callers then rely on the periodic rescan
(or the restart reminder).zrescan-profilesrP  r®  r¯  s   &$r   Úrescan_gateway_profilesr·  þ  s   € ô
 ! Ð'8À'ÔJÐJr   c               ó$   € V ^8„  d   QhRRRRRR/# ©r
   r   r   rI   r   r   r{  r   )r   s   "r   r   r     s'   € ÷ ^ñ ^ $ð ^¨cð ^Ð6Nñ ^r   c                ó$   € \        V R RV/RR7      # )zunserve-profilerI   r´  ©r  rQ  r®  ©r   rI   s   &&r   Úrequest_unserve_profiler½    s   € Ü  Ð'8À&È$ÀÐY\Ô]Ð]r   c               ó$   € V ^8„  d   QhRRRRRR/# r¹  r   )r   s   "r   r   r   
  s'   € ÷ \ñ \ Dð \°ð \Ð8Pñ \r   c                ó$   € \        V R RV/RR7      # )zserve-profilerI   r´  r»  r®  r¼  s   &&r   Úrequest_serve_profile_hotrÀ  
  s   € Ü   ÀÈ¸~ÐWZÔ[Ð[r   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r
   r   r   Úold_namer   Únew_namerQ  r|  r   r{  r   )r   s   "r   r   r     s8   € ÷ ]ñ ]¨4ð ]¸3ð ]È#ð ]Ø.3ð]Ø>Vñ]r   c               ó(   € \        V RRVRV/VR7      # )uS  Ask the multiplexer serving ``home`` to rekey a renamed profile's in-memory + on-disk routing
from ``agent:<old>:`` to ``agent:<new>:`` now. Returns its ``{"rekeyed": N, ...}`` answer, or None
when no gateway answers / the gateway predates the verb â€” the CLI's durable DB rewrite still lands,
and a restart reconciles the in-memory copy.zmigrate-profile-identityÚoldÚnewr»  r®  )r   rÂ  rÃ  rQ  s   &&&$r   Ú migrate_gateway_profile_identityrÇ    s'   € ô ! Ð'AØ).°¸%ÀÐ(JÐT[ô]ð ]r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r
   r   r   rI   r   rQ  r|  r   r{  r   )r   s   "r   r   r     s0   € ÷ iñ i¨ð i°Sð iØ,1ðiØ<Tñir   c               ó$   € \        V RRV/VR7      # )u  Ask the multiplexer serving ``home`` to drop a deleted profile's routing identity now â€” the
in-memory index AND the durable rows, neither of which a CLI-side delete can settle: this process
writes its in-memory copy back, so it re-creates what the CLI removed. Returns its
``{"ok": True, "dropped": N, ...}`` answer, or None when no gateway answers / the gateway predates
the verb.zpurge-profile-identityrI   r»  r®  )r   rI   rQ  s   &&$r   Úpurge_gateway_profile_identityrÊ    s   € ô ! Ð'?ÈÐQUÈÐ`gÔhÐhr   Úprofile_homeg      >@c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r
   r   r   rË  r.   rQ  r|  r   r{  r   )r   s   "r   r   r   "  s0   € ÷ Yñ Y ð Y¸ð YØ$)ðYØ5MñYr   c               óL   € R\        T;'       g    T 4      /p\        V RW2R7      # )u©  Ask the gateway serving ``home`` to force plugin re-discovery for ``profile_home`` (default: ``home``)
and re-wire its live adapters' plugin handlers now (#87770). Returns ``{"reloaded", "plugins",
"adapters_rewired", ...}`` or None when no gateway answers / it predates the verb â€” callers then
fall back to the restart hint. Tools and prompt sections of the reloaded plugin still apply next
session; only handlers go live.r   zreload-pluginsr»  )r   r�  )r   rË  rQ  r  s   &$$ r   Úreload_gateway_pluginsrÎ  "  s+   € ð ”c˜,×.Ð.¨$Ó/Ð0€FÜ  Ð'7ÀÔXÐXr   r”  i   )@rb  Ú
__future__r   rî   r6   r   r#  r  Úloggingr   rE  rQ   r”   rF   rÅ   Úpathlibr   Útypingr   r   r   Ú	getLoggerr'  rä   r¸   r{   r|   r•   r4   r*   rV  r)  rU  r!   r$   r,   r;   rL   r9   rf   rx   r~   r†   r˜   rž   r¥   r¿   rÇ   rÉ   ÚProtocolre  r�  r�  r  r~  r¢  r°  r³  r·  r½  rÀ  rÇ  rÊ  rÎ  r   r   r   Ú<module>rÕ     s�  ðñõ #ã Û Û Û Û Û Û 	Û Û Û 
Û Û Ý ß *Ñ *à	×	Ò	˜8Ó	$€àÐ Ø!Ð Ø'Ð Ø�l‰l˜gÑ%€Ø€àÐ Ø Ð ØÐ õAõ:õ
<õ	õ	Mõbõ
	õõ"wõ
õKõ$:õõõ$F÷Tñ Tôn(˜7×+Ñ+ô (ð*8ÐW[ð 8Ø+B÷8õ&
8õ
õ8õ?ðDÐ5L÷ Dð
LÐ=T÷ LðK¸C÷ Kõ^õ\ð]Ø69÷]ðiØ47÷iðYÈð YØ,0÷Yñ Yr   