+
    „WÝj}„  ã                   óÖ  € R 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 ^ RIHtHtHtHtHt ^ RIHtHt ^ RIHtHt ^ RIHt ^ RIHtHt ^ R	IHt ^ R
IH t H!t!H"t"H#t#H$t$H%t% ]PL                  ! R4      t']! 4       t(]! RR4      t)]! RR4      t*]! RR4      t+]! RR4      t,]! RR4      t-]! RR4      t.]! RR4      t/]! R4      t0R R lt1]Pd                  ! R4      t3R R lt4R R lt5R R lt6R R  lt7R! R" lt8R# R$ lt9R% R& lt:R' R( lt;R) R* lt<R+t=R,t>R-t?R.t@R/R/R0 R1 lltAR2 R3 ltBR4 R5 ltC ! R6 R74      tDR8 R9 ltE](P�                  R:4      R; R< l4       tGR= R> ltHR?R/R@ RA lltIRB RC ltJRD RE ltK](P�                  RF4      RG RH l4       tL](P�                  RI4      RJ RK l4       tMRL RM ltN](P�                  RN4      RO RP l4       tO](P�                  RQ4      RR RS l4       tPR# )TzôChat-tab WebSocket routes: /api/console, /api/pty, the /api/ws gateway
sidecar and /api/pub + /api/events broadcast.

Helpers/state that tests monkeypatch on ``web_server`` stay there and are
reached through the late-binding seam (cycle-safe).
N)ÚPath)ÚAnyÚDictÚOptional)Ú	APIRouterÚFastAPIÚHTTPExceptionÚ	WebSocketÚWebSocketDisconnect)ÚInterruptScopeÚbind_interrupt_scope)ÚActiveSessionRegistryErrorÚ active_session_registry_snapshot)ÚRegistryFull)Ú	LateStateÚlate)Úchat_start_failure_message)Ú_build_sidecar_urlÚ_close_stalled_pty_inputÚ_get_console_executorÚ_legacy_pumpÚ_ws_auth_okÚ_ws_request_is_allowedzhermes_cli.web_serverÚ _active_session_file_for_channelzhermes_cli.web_server_chatÚ_profile_scopezhermes_cli.web_server_profilesÚ_resolve_chat_argv_asyncÚ_resolve_profile_dirÚ_ws_auth_reasonÚ_ws_client_reasonÚ_ws_host_origin_reasonÚ _DASHBOARD_EMBEDDED_CHAT_ENABLEDc                ó$   € V ^8„  d   QhR\         /# )é   Úapp)r   )Úformats   "ÚRC:\Users\johnn\AppData\Local\hermes\hermes-agent\hermes_cli\web_routers\chat_ws.pyÚ__annotate__r&   *   s   € ÷ 	>ñ 	>œ'ñ 	>ó    c                ó@  €  V P                   P                  V P                   P                  3#   \         de    / T P                   n        \        P
                  ! 4       T P                   n        T P                   P                  T P                   P                  3u # i ; i)zÙ(event_channels, event_lock) from app.state, lazily initialised when the
lifespan hasn't run (TestClient without a ``with`` block). The lifespan path
is preferred because it creates the Lock on the correct event loop.)ÚstateÚevent_channelsÚ
event_lockÚAttributeErrorÚasyncioÚLock©r#   s   &r%   Ú_get_event_stater0   *   sr   € ð>Ø�y‰y×'Ñ'¨¯©×)=Ñ)=Ð=Ð=øÜô >Ø#%ˆ�	‰	Ô Ü&Ÿ|š|›~ˆ�	‰	ÔØ�y‰y×'Ñ'¨¯©×)=Ñ)=Ð=Ò=ð>ús   ‚+. ®A,BÂBz^[A-Za-z0-9._-]{1,128}$c                ó>   € V ^8„  d   QhR\         \        ,          RR/# )r"   ÚpathÚreturnN)r   r   )r$   s   "r%   r&   r&   8   s   € ÷ ñ ¤h¬t¥nð ¸ñ r'   c                 ó\   € V f   R #  V P                  RR7       R #   \         d     R # i ; i)NT©Ú
missing_ok)ÚunlinkÚOSError©r2   s   &r%   Ú_unlink_active_session_filer:   8   s/   € Ø‚|ÙðØ�‰˜tˆÖ$øÜô Úðús   ˆ œ+ª+c                ól   € V ^8„  d   QhR\         R\        \        ,          R\        \        ,          RR/# )r"   r#   Úchannelr2   r3   N)r   r   Ústrr   )r$   s   "r%   r&   r&   A   s2   € ÷ 
ñ 
¤gð 
¼Ä½ð 
ÌXÔVZÍ^ð 
Ð`dñ 
r'   c                 óÎ   € \        V4       V'       d   Vf   R #  ^ RIHp V! V 4      pVP                  V4      V8X  d   VP	                  VR 4       R # R #   \
         d     R # i ; i)N©Ú_get_pty_active_session_files)r:   Úhermes_cli.web_serverr@   ÚgetÚpopÚ	Exception)r#   r<   r2   r@   Úfiless   &&&  r%   Ú_discard_active_session_filerF   A   s\   € Ü Ô%ß�d’lÙðÝGÙ-¨cÓ2ˆØ�9‰9�WÓ Ô%Ø�I‰I�g˜tÖ$ñ &øäô Úðús   ›6A ÁA$Á#A$c                ó$   € V ^8„  d   QhR\         /# )r"   r3   ©r=   )r$   s   "r%   r&   r&   N   s   € ÷ 	ñ 	”sñ 	r'   c                 óö   € ^ RI Hp  ^ RIHp \	        VP
                  RR4      '       d   R# \	        VP
                  RR4      ;'       g    RP                  4       P                  4       pV'       d	   W 9  d   R# R	# )
uG   Short label for the active WS auth mode â€” logged on every connection.)Ú_LOOPBACK_HOSTSr/   Úauth_requiredFÚgatedÚ
bound_hostÚ ÚinsecureÚloopback)Úhermes_cli.web_server_chatrJ   rA   r#   Úgetattrr)   ÚstripÚlower)rJ   r#   rM   s      r%   Ú_ws_auth_moderU   N   sX   € å:Ý)Üˆs�y‰y˜/¨5×1Ò1ÙÜ˜#Ÿ)™) \°2Ó6×<Ð<¸"×CÑCÓE×KÑKÓM€Jß�jÔ7ÙÙr'   c                ó@   € V ^8„  d   QhR\         R\        R\        RR/# )r"   r#   r<   Úpayloadr3   N)r   r=   )r$   s   "r%   r&   r&   Z   s.   € ÷ 
_ñ 
_¤ð 
_¬cð 
_¼Cð 
_ÀDñ 
_r'   c              ƒ  ó‚  "  € \        V 4      w  r4T;_uu_4       GRj  x€L
  \        VP                  VR4      4      pRRR4      GRj  x€L
  X F  p VP                  V4      G Rj  x€L
  K  	  R#  LT L+  + GRj  x€L 
 '       g   i     LB; i L*  \         d    \
        P                  RTRR7        Kk  i ; i5i)z=Fan out one publisher frame to every subscriber on `channel`.Nz*broadcast send failed for subscriber on %sT)Úexc_info© )r0   ÚlistrB   Ú	send_textrD   Ú_logÚwarning)r#   r<   rW   r*   r+   ÚsubsÚsubs   &&&    r%   Ú_broadcast_eventra   Z   sŽ   é € ä!1°#Ó!6Ñ€Nß�zŠzÜ�N×&Ñ& w°Ó3Ó4ˆ÷ �zãˆð	_Ø—-‘- Ó(×(Ò(ó ÷ �z�zŒzúñ )øÜô 	_ä�L‰LÐEÀwÐY]ˆL×^ð	_üs   ‚B?žA3ŸB?¢A7¾B?Á	A5Á
	B?ÁBÁ(BÁ)BÁ-B?Á5B?Á7B	Á=B Á>
B	Â	B	ÂB?ÂBÂ#B<Â8B?Â;B<Â<B?c                óF   € V ^8„  d   QhR\         R\        \        ,          /# ©r"   Úwsr3   ©r	   r   r=   )r$   s   "r%   r&   r&   g   s"   € ÷ Añ Aœyð A¬X´c­]ñ Ar'   c                óx   € V P                   P                  RR4      p\        P                  V4      '       d   V# R# )z5Channel id from the query string, or None if invalid.r<   rN   N)Úquery_paramsrB   Ú_VALID_CHANNEL_REÚmatch©rd   r<   s   & r%   Ú_channel_or_close_coderk   g   s3   € à�o‰o×!Ñ! )¨RÓ0€GÜ'×-Ñ-¨g×6Ò6ˆ7Ð@¸DÐ@r'   c                óF   € V ^8„  d   QhR\         R\        \        ,          /# )r"   r2   r3   )r   r   r=   )r$   s   "r%   r&   r&   m   s   € ÷ =ñ =¤Dð =¬X´c­]ñ =r'   c                 ó  €  \         P                  ! V P                  R R7      4      p\        TP                  R4      ;'       g    R4      P                  4       ;'       g    R#   \        \         P                  3 d     R# i ; i)z	utf-8-sig)ÚencodingNÚ
session_idrN   )ÚjsonÚloadsÚ	read_textr8   ÚJSONDecodeErrorr=   rB   rS   )r2   Údatas   & r%   Ú_read_active_session_fileru   m   sn   € ðÜ�zŠz˜$Ÿ.™.°+˜.Ó>Ó?ˆô ˆt�x‰x˜Ó%×+Ð+¨Ó,×2Ñ2Ó4×<Ð<¸Ð<øô ”T×)Ñ)Ð*ô Úðús   ‚&A$ Á$BÂBc                ó0   € V ^8„  d   QhR\         R\         /# )r"   Útextr3   rH   )r$   s   "r%   r&   r&   u   s   € ÷ ;ñ ;œ3ð ;¤3ñ ;r'   c                óŠ   € V P                  RR4      p\        V4      ^{8:  d   V # VR,          P                  RR4      R,           # )z•Clamp to RFC 6455's 123-byte close-reason limit (uvicorn raises past it);
reasons embed an attacker-controlled origin, so truncate rather than crash.úutf-8Úreplace:Néx   NÚignorez...)ÚencodeÚlenÚdecode)rw   Úencodeds   & r%   Ú_ws_close_reasonr�   u   sA   € ð �k‰k˜' 9Ó-€GÜ
ˆ7ƒ|�sÔØˆØ�4�=×Ñ ¨Ó2°UÕ:Ð:r'   c          
      ó~   € V ^8„  d   QhR\         R\        R\        \        \        \        \        3,          ,          /# )r"   rd   Úkindr3   )r	   r=   r   Útuple)r$   s   "r%   r&   r&   ~   s1   € ÷  ñ  ”yð  ¬ð  ´¼¼sÄCÌ¸}Õ9MÕ0Nñ  r'   c              ƒ  óÚ  "  € V P                   '       d   V P                   P                  MRp\        '       g4   \        P	                  RW4       V P                  RRR7      G Rj  x€L
  R# \        V 4      w  r4\        4       pVeB   \        P                  RWWTV4       V P                  R\        R	V 24      R7      G Rj  x€L
  R# \        V 4      pVe>   \        P                  R
WV4       V P                  R\        V4      R7      G Rj  x€L
  R# \        V 4      pVe=   \        P                  RW4       V P                  R\        V4      R7      G Rj  x€L
  R# W%V3#  Lý L£ LY L5i)aK  Run the pre-accept gates for /api/console and /api/pty.

Each gate maps to a distinct close code so the log and the browser banner
agree on the cause: 4404 chat disabled, 4401 bad credential, 4403
host/origin mismatch, 4408 peer not allowed. Returns ``(peer, mode, cred)``
once every gate passes, or None after closing the socket.
Ú?z*%s refused: embedded chat disabled peer=%si4  zembedded chat disabled©ÚcodeÚreasonNz2%s auth rejected reason=%s mode=%s cred=%s peer=%sé1  zauth: z%s refused: %s peer=%sé3  z%s refused: %si8  )ÚclientÚhostr    r]   ÚinfoÚcloser   rU   r^   r�   r   r   )rd   rƒ   ÚpeerÚauth_reasonÚcredÚmodeÚhost_origin_reasonÚclient_reasons   &&      r%   Ú_ws_gater–   ~   sE  é € ð  ŸYŸY˜Yˆ2�9‰9�>Š>¨C€Dß+Ó+Ü�	‰	Ð>ÀÔKØ�h‰h˜DÐ)AˆhÓB×BÐBÙä'¨Ó+Ñ€KÜ‹?€DØÒÜ�‰ÐIÈ4Ð^bÐjnÔoØ�h‰h˜DÔ)9¸FÀ;À-Ð:PÓ)QˆhÓR×RÐRÙä/°Ó3ÐØÒ%Ü�‰Ð-¨tÈÔNØ�h‰h˜DÔ)9Ð:LÓ)MˆhÓN×NÐNÙä% bÓ)€MØÒ Ü�‰Ð% tÔ;Ø�h‰h˜DÔ)9¸-Ó)HˆhÓI×IÐIÙØ�tÐÐñ+ 	Cñ 	Sñ 	Oñ 	JùsO   ‚6E+¹,E+Á%E#Á&AE+ÃE%ÃAE+ÄE'ÄA
E+ÅE)ÅE+Å%E+Å'E+Å)E+c                ó0   € V ^8„  d   QhR\         R\        /# rc   )r	   Úbool)r$   s   "r%   r&   r&   ¡   s   € ÷ ñ ¬Ið ¼$ñ r'   c              ƒ  ó  "  € \         '       g   V P                  RR7      G Rj  x€L
  R# \        V 4      '       g   V P                  RR7      G Rj  x€L
  R# \        V 4      '       g   V P                  RR7      G Rj  x€L
  R# R#  Lb L7 L5i)z�Pre-accept gates for the /api/ws, /api/pub and /api/events sidecars:
4403 when chat is disabled or the request isn't allowed, 4401 on bad auth.r‹   ©rˆ   NFrŠ   T)r    r�   r   r   )rd   s   &r%   Ú_close_unless_sidecar_allowedr›   ¡   sx   é € ÷ ,Ó+Ø�h‰h˜DˆhÓ!×!Ð!ÙÜ�r�?Š?Ø�h‰h˜DˆhÓ!×!Ð!ÙÜ! "×%Ò%Ø�h‰h˜DˆhÓ!×!Ð!ÙÙñ 	"ñ 	"ñ 	"ùs3   ‚"B¤B¥,BÁB	Á,BÁ>BÁ?	BÂ	BÂBzhermes> g      N@g      $@iPÃ  Úscopec                óŒ   € V ^8„  d   QhR\         R\        R\        R\        \        ,          R\        \        ,          R\         /# )r"   ÚengineÚlineÚ	confirmedÚprofilerœ   r3   )r   r=   r˜   r   r   )r$   s   "r%   r&   r&   º   sF   € ÷ 9ñ 9Üð9Üð9Ü*.ð9Ü9AÄ#½ð9ÜOWÔXfÕOgð9äñ9r'   c          	      ó   € \        V4      ;_uu_ 4        \        V4      ;_uu_ 4        V P                  WR 7      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)©r    N)r   r   Úexecute)rž   rŸ   r    r¡   rœ   s   &&$$$r%   Ú_execute_console_liner¥   º   sJ   € ô
 
˜×	 Õ	 Ô"6°u×"=Õ"=Ø�~‰~˜dˆ~Ó8÷ #>Ñ"=×	 Ò	 ×"=×"=ú×	 ×	 ×	 Ò	 ús!   ”A,¨A	º
A,ÁAÁA,Á,A=	c                ó@   € V ^8„  d   QhR\         R\        R\        RR/# )r"   Úworkerrœ   r‰   r3   N)r   r   r=   )r$   s   "r%   r&   r&   Ã   s/   € ÷ kñ k¬ð k´^ð kÌSð kÐUYñ kr'   c              ƒ  óŠ  "  € VR8X  d   VP                  RV 2RR7       MVP                  RV 24       V P                  4       '       d   R# \        P                  ! V 4      p\        P                  ! V0\        R7      G Rj  x€L
 w  rEV'       g.   VP                  4        \
        P                  R\        V4       R# R#  L=5i)a  Stop the command's worker after cancel/timeout: asyncio can only drop the waiter, so interrupt
any agent the command forked (closing its provider request) and wait for the thread to exit.
A user cancel is attributed to the user; only the timeout is a host-issued stop (#112647).Ú	cancelledzConsole command N)Útool_reason©Útimeoutz)console worker still running %ss after %s)Úcancelr-   Úwrap_futureÚwaitÚ_CONSOLE_UNWIND_TIMEOUT_SECONDSr]   r^   )r§   rœ   r‰   ÚexitedÚdoneÚ_s   &&&   r%   Ú_unwind_console_workerr´   Ã   s›   é € ð �ÔØ�‰Ð'¨ xÐ0¸dˆÕCà�‰Ð'¨ xÐ0Ô1Ø‡}�}‡‚ÙÜ× Ò  Ó(€FÜ—L’L & Ô3RÔS×S�G€DßØ�‰ŒÜ�‰Ð@ÔBaÐciÖjñ ñ Tùs   ‚ACÁ8CÂCÂ>Cc                ó0   € V ^8„  d   QhR\         R\         /# )r"   r§   r3   ©r   )r$   s   "r%   r&   r&   Ô   s   € ÷ ñ ¬3ð ´3ñ r'   c              ƒ   ó~   "  € \         P                  ! \         P                  ! V 4      \        R 7      G Rj  x€L
 #  L5i)r«   N)r-   Úwait_forr®   Ú _CONSOLE_COMMAND_TIMEOUT_SECONDS)r§   s   &r%   Ú_wait_for_console_workerrº   Ô   s3   é € Ü×!Ò!Ü×Ò˜FÓ#Ô-Mô÷ ð ñ ùs   ‚4=¶;·=c                   óº   a € ] tR t^Út o RtV 3R lR ltV 3R lR ltV 3R lR ltRR	R
R	RR	/V 3R lR lltR]	/V 3R lR llt
V 3R lR ltV 3R lR ltRtV tR	# )Ú_ConsoleSenderzESerialises frames onto one console socket and owns the prompt suffix.c                ó$   <€ V ^8„  d   QhRS[ RR/# ©r"   rd   r3   N©r	   )r$   Ú__classdict__s   "€r%   r&   Ú_ConsoleSender.__annotate__Ý   s   ø€ ÷ #ñ #™9ð #¨ñ #r'   c                óF   € Wn         \        P                  ! 4       V n        R # ©N)rd   r-   r.   Úlock)Úselfrd   s   &&r%   Ú__init__Ú_ConsoleSender.__init__Ý   s   € ØŒÜ—L’L“NˆŽ	r'   c                ó:   <€ V ^8„  d   QhRS[ S[S[3,          RR/# ©r"   rW   r3   N)Údictr=   r   )r$   rÀ   s   "€r%   r&   rÁ   á   s#   ø€ ÷ -ñ -¡$¡s©C x¥.ð -°Tñ -r'   c              ƒ  óô   "  € V P                   ;_uu_4       GR j  x€L
  V P                  P                  V4      G R j  x€L
  R R R 4      GR j  x€L
  R #  L9 L L
  + GR j  x€L 
 '       g   i     R # ; i5irÃ   )rÄ   rd   Ú	send_json©rÅ   rW   s   &&r%   ÚsendÚ_ConsoleSender.sendá   s?   é € Ø—9—9—9“9Ø—'‘'×#Ñ# GÓ,×,Ð,÷ —9“9Ù,÷ —9—9“9üsZ   ‚A8›AœA8ŸA¾A¿AÁA8ÁAÁA8ÁAÁA8ÁA5	Á!A$Á"
A5	Á-A5	Á/	A8c                ó$   <€ V ^8„  d   QhRS[ RR/# rÉ   r¶   )r$   rÀ   s   "€r%   r&   rÁ   å   s   ø€ ÷ @ñ @¡cð @¨dñ @r'   c              ‹  óX   "  € V P                  / VCR \        /C4      G Rj  x€L
  R#  L5i)ÚpromptN)rÎ   Ú_CONSOLE_PROMPTrÍ   s   &,r%   rÒ   Ú_ConsoleSender.promptå   s$   é € Ø�i‰iÐ>˜7Ð> H¬oÑ>Ó?×?Ô?ùó   ‚*¡(¢*ÚidNÚcommandrÒ   c          
      óf   <€ V ^8„  d   QhRS[ RS[S[,          RS[S[ ,          RS[S[ ,          RR/# )r"   ÚmessagerÖ   r×   rÒ   r3   N)r=   r   Úint)r$   rÀ   s   "€r%   r&   rÁ   è   s?   ø€ ÷ ñ ¡3ð ©x¹­}ð ÉhÑWZÍmð Ù$¡S�MðØ59ñr'   c             ƒ  ó„   "  € R R/pVe   W%R&   WR&   Ve   W5R&   Ve   WER&   V P                  V4      G Rj  x€L
  R#  L5i)ÚtypeÚerrorNrÖ   rÙ   r×   rÒ   ©rÎ   )rÅ   rÙ   rÖ   r×   rÒ   Úframes   &&$$$ r%   rÝ   Ú_ConsoleSender.errorè   sR   é € ð "(¨Ð 1ˆØŠ>Ø�$‰KØ"ˆiÑØÒØ&�)ÑØÒØ$�(‰OØ�i‰i˜Ó×Ôùs   ‚5A ·>¸A c          
      ó6   <€ V ^8„  d   QhRS[ RS[ RS[RS[ RR/# )r"   Ústatusr×   Ú
command_idrÒ   r3   N©r=   rÚ   )r$   rÀ   s   "€r%   r&   rÁ   õ   s9   ø€ ÷ xñ x¡Sð x±3ð xÁCð xÑTWð xÐnrñ xr'   c             ƒ  óX   "  € V P                  R RRVRVRVRV/4      G Rj  x€L
  R#  L5i)rÜ   ÚcompleterÖ   râ   r×   rÒ   NrÞ   )rÅ   râ   r×   rã   rÒ   s   &&&&$r%   ræ   Ú_ConsoleSender.completeõ   s0   é € Ø�i‰i˜ ¨T°:¸xÈÐQZÐ\cÐemÐouÐvÓw×wÔwùrÕ   c          
      ó6   <€ V ^8„  d   QhRS[ RS[ RS[RS[ RR/# )r"   rÙ   r×   rã   râ   r3   Nrä   )r$   rÀ   s   "€r%   r&   rÁ   ø   s3   ø€ ÷ 9ñ 9±ð 9¹sð 9ÑPSð 9Ñ]`ð 9Ðeiñ 9r'   c              ƒ  ó€   "  € V P                  WVR 7      G Rj  x€L
  V P                  WBV4      G Rj  x€L
  R#  L  L5i)©rÖ   r×   N)rÝ   ræ   )rÅ   rÙ   r×   rã   râ   s   &&&&&r%   Úerror_then_completeÚ"_ConsoleSender.error_then_completeø   s8   é € Ø�j‰j˜¸ˆjÓA×AÐAØ�m‰m˜F¨ZÓ8×8Ò8ñ 	BÙ8ùs   ‚>™:š>³<´>¼>c                ó*   <€ V ^8„  d   QhRS[ RS[RR/# )r"   Úresultrã   r3   N)r   rÚ   )r$   rÀ   s   "€r%   r&   rÁ   ü   s'   ø€ ÷ iñ i©ð i¹Cð iÀDñ ir'   c             ƒ  ób  "  € VP                   ;'       g    R pVP                  pVR8X  d\   VP                  '       d.   V P                  RRRVRRRVP                  RV/4      G R	j  x€L
  V P	                  RW24      G R	j  x€L
  R	# VR
8X  d2   T P                  VP                  ;'       g    RW2R
4      G R	j  x€L
  R	# VR8X  dQ   T P                  RY#VP                  ;'       g    RV R2R7      G R	j  x€L
  V P	                  RW24      G R	j  x€L
  R	# VR8X  d:   V P                  RRRV/4      G R	j  x€L
  V P	                  RW24      G R	j  x€L
  R	# VR8X  d   V P	                  RW2R R7      G R	j  x€L
  R	# V P                  RV 2W#R7      G R	j  x€L
  R	#  EL5 EL Lè L­ L• Lq LY L6 L5i)rN   ÚokrÜ   ÚoutputrÖ   ÚstreamÚstdoutrt   r×   NrÝ   zCommand failed.Úconfirm_requiredzRun `z`?)rÜ   rÖ   r×   rÙ   ÚclearÚexit©rÒ   zUnknown console result status: rê   )	r×   râ   rñ   rÎ   ræ   rë   rÒ   Úconfirmation_messagerÝ   )rÅ   rî   rã   r×   râ   s   &&$  r%   Úsend_resultÚ_ConsoleSender.send_resultü   s›  é € Ø—.‘.×&Ð& BˆØ—‘ˆØ�TŒ>Ø�}�}ˆ}Ø—i‘iØ˜H d¨J¸À(Ø˜FŸM™M¨9°gð!ó ÷ ð ð —-‘-  gÓ:×:Ò:Ø�wÔØ×*Ñ*¨6¯=©=×+MÐ+MÐ<MÈwÐdkÓl×lÒlØÐ)Ô)Ø—+‘+Ø'¨JØ×3Ñ3×JÐJ¸¸w¸iÀrÐ7Jð ó ÷ ð ð —-‘-Ð 2°GÓH×HÒHØ�wÔØ—)‘)˜V W¨d°JÐ?Ó@×@Ð@Ø—-‘- ¨Ó=×=Ò=Ø�vÔØ—-‘- ¨ÀB�-ÓG×GÒGà—*‘*Ð>¸v¸hÐGÈJ�*Óh×hÒhò'ò ;álññ Iá@Ù=áGáhùs²   ‚;F/¾(F/Á&FÁ'F/Â FÂ*F/Â,F/Â8F!Â9,F/Ã&F/Ã5F#Ã6F/ÄF%Ä%F/Ä5F'Ä6F/ÅF)Å$F/Å4F+Å5F/ÆF-ÆF/ÆF/Æ!F/Æ#F/Æ%F/Æ'F/Æ)F/Æ+F/Æ-F/)rÄ   rd   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rÆ   rÎ   rÒ   rÝ   rÓ   ræ   rë   rù   Ú__static_attributes__Ú__classdictcell__)rÀ   s   @r%   r¼   r¼   Ú   st   ø‡ € ÙO÷#ð #÷-ð -÷@ð @ð¸tð Ð^bð Ø,0÷ò ðxÐZi÷ xò x÷9ð 9÷iö ir'   r¼   c                ó    € V ^8„  d   QhR\         R\        \        \        \        \         3,          ,          \        \        ,          3,          /# )r"   Úmsgr3   )r   r„   r   rÊ   r=   )r$   s   "r%   r&   r&     s6   € ÷ ñ œsð ¤u¬X´d¼3Ä¸8µnÕ-EÄxÔPSÅ}Ð-TÕ'Uñ r'   c                 óp  € V P                  R 4      pVf   V P                  R4      pVf   R# \        V\        4      '       d    VP                  R4      p \
        P                  ! V4      p\        T\        4      '       g   R# TR3#   \         d    Ru # i ; i  \
        P                   d    Ru # i ; i)rw   NÚbytesry   )NN)Nz"Console frames must be UTF-8 JSON.)Nz$Console frames must be JSON objects.)	rB   Ú
isinstancer  r   ÚUnicodeDecodeErrorrp   rq   rs   rÊ   )r  ÚrawrW   s   &  r%   Ú_console_json_payloadr	    s±   € Ø!Ÿg™g f›o€CØ
‚{Ø�g‰g�gÓˆØ
‚{ØÐÜ�#”u×Òð	>Ø—*‘*˜WÓ%ˆCð<Ü—*’*˜S“/ˆô �gœt×$Ò$Ø;Ð;Ø�Dˆ=Ðøô "ô 	>Ø=Ò=ð	>ûô ×Ñô <Ø;Ò;ð<ús$   ÁB ÁB ÂBÂBÂB5Â4B5z/api/consolec                ó(   € V ^8„  d   QhR\         RR/# r¾   r¿   )r$   s   "r%   r&   r&   ,  s   € ÷ Uñ Uœð U tñ Ur'   c           	   ƒ   óH  a aaaaaaa"  € \        S R 4      G Rj  x€L
 pVf   R# Vw  r#pS P                  4       G Rj  x€L
  S P                  P                  R4      ;'       g    RP	                  4       ;'       g    Ro\        S 4      o ^ RIHp V! \        R7      oS'       d!   SP                  4       R8w  d   \        S4       \$        P)                  RY#TS;'       g    R4       SP+                  RS;'       g    RR7      G Rj  x€L
  RoRo^ oR TTTTTTT 3R lloRR/R TTT3R lllp   S P-                  4       G Rj  x€L
 pTP                  R4      R8X  d   EM,\1        T4      w  ršT
'       d   SP+                  RT
R7      G Rj  x€L
  Kd  T	f   Kj  \        T	P                  R4      ;'       g    R4      P	                  4       P                  4       pTR8X  d   SP+                  RR7      G Rj  x€L
  KÍ  TR8X  dÞ   S'       d’   SP3                  4       '       g|   S^,          oSRupoTP5                  4        \6        P8                  ! \:        P<                  4      ;_uu_ 4        TG Rj  x€L
  RRR4       RoSP+                  R R!R"7      G Rj  x€L
  MAS'       d   RoSP+                  R R!R"7      G Rj  x€L
  MSP+                  R R#R"7      G Rj  x€L
  EK±  S'       d5   SP3                  4       '       g   SP+                  RR$R7      G Rj  x€L
  EKí  TR%8X  d—   \        T	P                  R&4      ;'       g    S;'       g    R4      P	                  4       pS'       g   SP+                  RR'R7      G Rj  x€L
  EKV  TS8w  d   SP+                  RR(R7      G Rj  x€L
  EK{  RoT! TRR)7       EKŠ  TR/9   d£   \        T	P                  R*4      ;'       g    T	P                  R&4      ;'       g    R4      P	                  4       pT'       g   SP+                  R R+R"7      G Rj  x€L
  EK  S'       d   SP+                  RR,R7      G Rj  x€L
  EK(  T! T4       EK3  SP+                  RR-T;'       g    R. 2R7      G Rj  x€L
  EK^  S'       d6   SP3                  4       '       g   SP5                  4         SG Rj  x€L
  R# R# R#  ELµ EL•  \         ds   pSP                  \        TP                  4      RR7      G Rj  x€L 
  S P                  R\!        \        TP                  4      4      R	7      G Rj  x€L 
   Rp?R# Rp?i\"         d[   p\$        P'                  R
4       SP                  RT 2RR7      G Rj  x€L 
  S P                  RR7      G Rj  x€L 
   Rp?R# Rp?ii ; i EL° ELt  \.         d     EK=  i ; i ELB ELÜ ELc  + '       g   i     ELj; i ELU EL2 EL ELà ELz ELX ELÔ EL± EL~  \>         d     EL‡i ; i ELW  \:        P<                  \"        3 d     R# i ; i  S'       dV   SP3                  4       '       g?   SP5                  4         SG Rj  x€L 
  i   \:        P<                  \"        3 d     i i ; ii i ; i5i)0ÚconsoleNr¡   rN   )ÚHermesConsoleEngine)Úoutput_limitÚcurrentr÷   é0  r‡   zconsole failed to initializezConsole unavailable: éó  rš   z3console accepted peer=%s mode=%s cred=%s profile=%sÚready)rÜ   r¡   c                ó@   € V ^8„  d   QhR\         R\        R\        RR/# )r"   rŸ   r    rã   r3   N)r=   r˜   rÚ   )r$   s   "r%   r&   Ú console_ws.<locals>.__annotate__M  s(   € ÷  #ñ  #¤ð  #´4ð  #ÄSð  #ÈTñ  #r'   c          	   “   ó”  <"  € \        4       p\        4       P                  \        S	WSVR 7      p \	        V4      G Rj  x€L
 pVS8w  d    VS8X  d   RoR# R# VP
                  R8X  d   VP                  MRoS
P                  WRR7      G Rj  x€L
  VP
                  R8X  d   SP                  RR7      G Rj  x€L
  TS8X  d   RoR# R#  LŠ L> L  \        P                   d    \        YCR4      G Rj  x€L 
  h \         d>    \        YCR4      G Rj  x€L 
  TS8X  d   RoS
P                  R	YR
4      G Rj  x€L 
   L„\         dl   pTS8X  d[   Ro\        P!                  R4       S
P                  \#        T4      ;'       g    TP$                  P&                  YR4      G Rj  x€L 
   Rp?LôRp?ii ; i  TS8X  d   Roi i ; i5i))r    r¡   rœ   Nrô   )rã   rö   iè  rš   r©   z	timed outz9Command timed out. Hermes Console returned to the prompt.r¬   zconsole command failedrÝ   )r   r   Úsubmitr¥   rº   râ   r×   rù   r�   r-   ÚCancelledErrorr´   ÚTimeoutErrorrë   rD   r]   Ú	exceptionr=   Ú	__class__rû   )rŸ   r    rã   rœ   r§   rî   ÚexcÚactive_taskÚcommand_generationrž   ÚoutÚpending_confirmationr¡   rd   s   &$$    €€€€€€€r%   Úrun_commandÚconsole_ws.<locals>.run_commandM  s¹  øé € äÓ ˆÜ&Ó(×/Ñ/Ü! 6¨4ÈgÐ]bð 0ó 
ˆð	#Ü3°FÓ;×;ˆFð" Ð/Ô/Øð Ð/Ô/Ø"’ñ 0ð 6<·]±]ÐFXÔ5X 6§>¢>Ð^bÐ Ø—/‘/ &�/Ó@×@Ð@Ø�}‰} Ô&Ø—h‘h D�hÓ)×)Ð)àÐ/Ô/Ø"’ñ 0ñ1 <ñ( Aá)øô+ ×%Ñ%ô 	Ü(¨¸ÓD×DÑDØÜô 	Ü(¨¸ÓD×DÑDØÐ/Ô/Ø'+Ð$Ø×-Ñ-ØOÐQUÐcló÷ ñ ùô ô 	mØÐ/Ô/Ø'+Ð$Ü—‘Ð7Ô8Ø×-Ñ-¬c°#«h×.PÐ.P¸#¿-¹-×:PÑ:PÐRVÐdkÓl×lÑlÿøð		mûð Ð/Ô/Ø"‘ð 0üsÏ   ƒ-G±C ¿C
Á C ÁF9 ÁGÁ4F9 ÂCÂ*F9 Â8CÂ9F9 Â=GÃ
C ÃF9 ÃF9 Ã$F6Ã4C7Ã5F6ÄF6ÄDÄ$F6Ä9D<Ä:F6Ä?F9 ÅF6Å
F6Å:F1Æ F1Æ&F)Æ'F1Æ,F9 Æ1F6Æ6F9 Æ9GÇGr    Fc                ó4   € V ^8„  d   QhR\         R\        RR/# )r"   rŸ   r    r3   N)r=   r˜   )r$   s   "r%   r&   r  o  s&   € ÷ qñ qœCð q¬tð qÀñ qr'   c                óV   <€ S^,          o\         P                  ! S! WSR7      4      oR# )é   )r    rã   N)r-   Úcreate_task)rŸ   r    r  r  r   s   &$€€€r%   Ústart_commandÚ!console_ws.<locals>.start_commando  s&   ø€ à˜aÕÐÜ×)Ò)©+°dÐ\nÔ*oÓpŠr'   TrÜ   úwebsocket.disconnectrÝ   )rÜ   rÙ   ÚpingÚpong)rÜ   r­   ræ   r©   )rÜ   râ   Úidlez%A console command is already running.Úconfirmr×   z'No command is waiting for confirmation.z0Confirmation does not match the pending command.r£   rŸ   rð   zAConfirm or cancel the pending command before running another one.zUnsupported console frame: r†   >   Úinputr×   ) r–   Úacceptrg   rB   rS   r¼   Úhermes_cli.console_enginer  Ú_CONSOLE_OUTPUT_LIMITrT   r   r   rÝ   r=   Údetailr�   r�   rD   r]   r  rŽ   rÒ   ÚreceiveÚRuntimeErrorr	  r²   r­   Ú
contextlibÚsuppressr-   r  r
   )rd   Úgater�   r“   r’   r  r  r&  r  rW   rÝ   Ú
frame_typeÚtaskr×   rŸ   r  r  rž   r  r  r¡   r   s   f              @@@@@@@r%   Ú
console_wsr9  +  s¢  ÿé € ä˜"˜iÓ(×(€DØ‚|ÙØÑ€D�Ø
�)‰)‹+×Ðà�‰×"Ñ" 9Ó-×3Ð3°×:Ñ:Ó<×DÐDÀ€GÜ
˜Ó
€CðÝAá$Ô2GÔHˆß�w—}‘}“¨)Ô3Ü  Ô)ô 	‡I�IÐCÀTÐQUÐW^×WkÐWkÐbkÔlØ
�*‰*˜'¨7×+?Ð+?°iˆ*Ó
@×@Ð@à'+€KØ*.ÐØÐ÷ #ö  #ðDq°e÷ qô qð
MØðØŸJ™J›L×(�ð �w‰w�v‹Ð"8Ô8Ùä2°3Ó7‰NˆGßØ—j‘j g°u�jÓ=×=Ð=ÙØŠÙä˜WŸ[™[¨Ó0×6Ð6°BÓ7×=Ñ=Ó?×EÑEÓGˆJØ˜VÔ#Ø—j‘j f�jÓ-×-Ð-Ùà˜XÔ%ß {×'7Ñ'7×'9Ò'9Ø&¨!Õ+Ð&Ø(3°TÐ%�D˜+Ø—K‘K”Mä#×,Ò,¬W×-CÑ-C×DÕDØ"Ÿ
˜
÷ Eà+/Ð(ØŸ*™*¨*¸[˜*ÓI×IÑIß)Ø+/Ð(ØŸ*™*¨*¸[˜*ÓI×IÑIàŸ*™*¨*¸V˜*ÓD×DÐDÚç ;×#3Ñ#3×#5Ò#5Ø—j‘j gÐ7^�jÓ_×_Ð_Úà˜YÔ&Ü˜gŸk™k¨)Ó4×RÐRÐ8L×RÐRÐPRÓS×YÑYÓ[�ß+ØŸ*™*¨'Ð;d˜*Óe×eÐeÚØÐ2Ô2ØŸ*™*¨'Ð;m˜*Ón×nÐnÚØ'+Ð$Ù˜g°Õ6ÚàÐ1Ô1Ü˜7Ÿ;™; vÓ.×NÐN°'·+±+¸iÓ2H×NÐNÈBÓO×UÑUÓW�ßØŸ*™*¨*¸T˜*ÓB×BÐBÚß'ØŸ*™*Ø$Ø cð %ó ÷ ð ò Ù˜dÔ#Úà—*‘* 'Ð5PÐQ[×QbÐQbÐ_bÐPcÐ3d�*Óe×eÓe÷ ˜{×/Ñ/×1Ò1Ø×ÑÔ ðØ!×!Ò!ñ  2‰;ò_ )ò øô ô Ø�i‰iœ˜CŸJ™J›°ˆiÓ3×3Ñ3Ø�h‰h˜DÔ)9¼#¸c¿j¹j»/Ó)JˆhÓK×KÑKÝûÜô Ü�‰Ð5Ô6Ø�i‰iÐ/°¨uÐ5¸bˆiÓA×AÑAØ�h‰h˜DˆhÓ!×!Ñ!Ýûð	úò Aò` )øÜô Ûðúò >ò .ò #÷ E×DÐDúò Jò JâDò `ò fò oò Còò føÜô Úðúò "øÜ×*Ñ*¬IÐ6ô Úðû÷	 ˜{×/Ñ/×1Ò1Ø×ÑÔ ðØ!×!Ò!øÜ×*Ñ*¬IÐ6ô Ùðúð	  2ˆ;üsØ  ŠZ"šS›"Z"½S¾%Z"Á$Z"Á<Z"Â;S ÃZ"Ã!Z"Ã=Z"ÄV8Ä	(Z"Ä2X	 Ä4V> ÅV;ÅV> ÅX	 Å"Y  Å$+X	 ÆWÆ(X	 Æ9?X	 Ç8WÇ9X	 ÈX	 È$A
X	 É.WÉ4WÉ5WÉ9 X	 ÊW.ÊX	 Ê'X	 Ê?W1Ë X	 ËW4ËX	 Ë+X	 ÌX	 ÌW7Ì*X	 Í	X	 ÍX	 Í*X	 Î W:Î$X	 Î%W=Î&9X	 Ï X	 Ï9X	 ÐX	 Ð,X Ð-X	 Ð<X	 ÑXÑ'X	 Ñ;X	 ÒXÒ	X	 ÒZ"Ò.Z"Ò?X ÓXÓX Ó	Z"ÓZ"ÓV5Ó )UÔ	TÔ
7UÕUÕUÕZ"ÕV5ÕV5Õ.V0Ö	VÖ
V0Ö$V'Ö%V0Ö*Z"Ö0V5Ö5Z"Ö;V> Ö>W×	X	 ×
Y  ×W×X	 ×X	 ×W×W+	×%
X	 ×1X	 ×4X	 ×7X	 ×:X	 ×=X	 Ø X	 ØX	 ØX	 Ø	XØY  ØXØY  ØX ØX=Ø9Z"Ø<X=Ø=Z"Ù ZÙZÙ0Y<Ù5Y8Ù6Y<Ù;ZÙ<ZÚZÚZÚZÚZ"c                ó4   € V ^8„  d   QhR\         R\        RR/# )r"   rd   r  r3   N)r	   ÚBaseException)r$   s   "r%   r&   r&   Ä  s!   € ÷ ñ œ	ð ¬ð ¸$ñ r'   c              ƒ  óê   "  € \         P                  R\        V4      P                  V4       V P	                  R\        V4       R24      G Rj  x€L
  V P                  RR7      G Rj  x€L
  R#  L  L5i)zŽTell the user why chat could not start, then close 1011 so the SPA renders
"Start new session". The raw exception goes to the server log only.zpty start failed: %s: %sz
[31mz[0m
Nr  rš   )r]   r^   rÜ   rû   r\   r   r�   )rd   r  s   &&r%   Ú	_pty_failr=  Ä  sa   é € ô 	‡L�LÐ+¬T°#«Y×-?Ñ-?ÀÔEØ
�,‰,˜Ô&@ÀÓ&EÐ%FÀkÐRÓ
S×SÐSØ
�(‰(˜ˆ(Ó
×Òñ TÙùs$   ‚AA3ÁA/ÁA3Á(A1Á)A3Á1A3Úregistry_homec                ó~   € V ^8„  d   QhR\         \        ,          R\         \        ,          R\         \        ,          /# )r"   ro   r>  r3   )r   r=   rÚ   )r$   s   "r%   r&   r&   Ì  s0   € ÷ ñ ¤(¬3¥-ð Ä8ÌCÅ=ð Ô\dÔehÕ\iñ r'   c               ó  € V '       g   R#  \        VR7       FK  pVP                  R4      V 8X  g   K  \        VP                  R4      \        4      '       g   KB  VR,          u # 	  R#   \        \
        \        3 d     R# i ; i)u'  The live process holding ``session_id``'s single-writer lease, if any.

A keep-alive PTY whose chat was never resumed from carries no resume target
in its registry key, so the lease holder is what identifies the terminal
that has to give the session back. Leases live under the HOME the chat runs
in â€” a profile-scoped chat's child claims its lease in the profile's home,
not the dashboard's launch home â€” so ``registry_home`` is the child's. A
registry that cannot be read is not a reason to refuse the attach: the
caller simply finds no holder.
N©r>  ro   Úpid)r   rB   r  rÚ   r   r8   Ú
ValueError)ro   r>  Úentrys   &$ r%   Ú_lease_holder_pidrE  Ì  sp   € ÷ ÙðÜ5ÀM×RˆEØ�y‰y˜Ó&¨*Ö4¼ÀEÇIÁIÈeÓDTÔVY×9ZÔ9ZØ˜U•|Ò#ñ Sñ
 øô '¬´Ð<ô Úðús"   Œ"A) ³"A) Á
A) Á%A) Á)BÂBc                ó4   € V ^8„  d   QhR\         R\        RR/# )r"   rd   Úsessionr3   N)r	   r   )r$   s   "r%   r&   r&   â  s!   € ÷ ñ ¤Ið ¼ð Àñ r'   c              ƒ  óÞ  "  € ^ RI Hp   V P                  4       G Rj  x€L
 pTP	                  R4      R8X  d   R# TP	                  R4      pTf;   TP	                  R4      p\        T\        4      '       d   TP                  R4      MRpT'       g   K‹  TP                  T4      pT'       do   TP                  4       \        T4      8X  dQ   TP                  P                  \        TP                  ^4      4      \        TP                  ^4      4      R	7       EK  TP                  Y4      G Rj  x€L
 '       d   EK4  \!        T R
R7      G Rj  x€L
  R#  EL6  \         d     R# i ; i L9 L5i)zÛWriter loop for a keep-alive /api/pty socket: forward client input to the
session's bridge, consuming resize escapes locally. On child EOF the drain
task closes the attached socket with 4410, which unparks ws.receive().)Ú
_RESIZE_RENrÜ   r(  r  rw   ry   r'   )ÚcolsÚrowsÚ	keepaliver9   )rQ   rI  r2  r3  rB   r  r=   r}   ri   Úendr~   ÚbridgeÚresizerÚ   ÚgroupÚwriter   )rd   rG  rI  r  r  rw   ri   s   &&     r%   Ú_pump_keepalive_inputrR  â  s  é € õ 6Ø
ð	ØŸ
™
›×$ˆCð �7‰7�6‹?Ð4Ô4ÙØ�g‰g�gÓˆØŠ;Ø—7‘7˜6“?ˆDÜ*4°T¼3×*?Ò*?�$—+‘+˜gÔ&ÀSˆCßÙà× Ñ  Ó%ˆß�U—Y‘Y“[¤C¨£HÔ,Ø�N‰N×!Ñ!¤s¨5¯;©;°q«>Ó':ÄÀUÇ[Á[ÐQRÃ^ÓATÐ!ÔUÚØ—]‘] 2Ó+×+×+Ñ+Ü*¨2°KÔ@×@Ð@Ùò% %øÜô 	Úð	úñ ,Ù@ùsi   ‚E-‹E žEŸE £A.E-ÂE-Â-BE-Ä/E)Ä0E-Ä=E-ÅE+ÅE-ÅE ÅE&Å"E-Å%E&Å&E-Å+E-c                ó¶   € V ^8„  d   QhR\         R\        \        ,          R\        R\        \        \
        ,          \        \        \        ,          3,          /# )r"   rd   ÚresumeÚforce_freshr3   )r	   r   r=   r˜   r„   r   )r$   s   "r%   r&   r&   þ  sD   € ÷ ;ñ ;Üð;Ü#¤C�=ð;Ü7;ð;ä
Œ8”D�>œ4¤¬#¥Ð.Õ/ñ;r'   c              ƒ  ó.  "  € \        V 4      pV'       g   RRV3# ^ RIHp V! V P                  4      pW59   p\	        V P                  V4      pV'       d   Rp VP                  RR7       RpMV'       g   \        V4      pWvV3#   \         d     L'i ; i5i)uì   (active_session_file, marker_preexisting, resume) for the /api/pty handler.

A channel's marker may already belong to a live keep-alive PTY on that
channel â€” only a marker this handler allocates is its own to drop on
failure (#63553).NFr?   Tr5   )rk   rA   r@   r#   r   r7   r8   ru   )rd   rT  rU  r<   r@   Úmarker_filesÚmarker_preexistingÚactive_session_files   &&&     r%   Ú_pty_channel_marker_staterZ  þ  sž   é € ô % RÓ(€GßØ�U˜FÐ"Ð"ÝCÙ0°·±Ó8€LØ Ñ0Ðä:¸2¿6¹6À7ÓKÐßØˆð	Ø×&Ñ&°$Ð&Ô7ð #ÑßÜ*Ð+>Ó?ˆØ°FÐ:Ð:øô ô 	Ùð	üs0   ‚ABÁB Á*
BÁ5BÂBÂBÂBÂBz/api/ptyc                ó(   € V ^8„  d   QhR\         RR/# r¾   r¿   )r$   s   "r%   r&   r&     s   € ÷ Z.ñ Z.”Yð Z. 4ñ Z.r'   c              ƒ   óØ  aaa a!"  € ^ RI HpHoHpHpHp ^ RIHp \        V R4      G Rj  x€L
 pVf   R# Vw  rxp	V P                  4       G Rj  x€L
  \        P                  RWxV	4       V'       g6   V P                  R4      G Rj  x€L
  V P                  RR7      G Rj  x€L
  R# V P                  P                  R	4      ;'       g    Rp
T
pV P                  P                  R
4      ;'       g    Rp\!        V 4      pV'       d   \#        V4      MRpV P                  P                  R4      ;'       g    RP%                  4       P'                  4       R!9   p\)        WV4      G Rj  x€L
 w  pppV'       d4   V'       g,   V'       d$   Wº8w  d   V P+                  RR	RV/4      G Rj  x€L
  R	VRVR
V/pVe   \-        V4      VR&   V'       g6   ^ RIHp  V! V P                  P                  R4      4      pT'       d   TTR&    \7        R"/ VB G Rj  x€L
 w  oo o!T P                  P                  R4      ;'       g    RpTpT
pT
'       d$   S!'       d   S!P                  R4      ;'       g    T
pTe/   T'       g	   T'       d   T RT;'       g    R RT;'       g    R 2pTTT T!3R lpTf?    T! 4       p \C        T T4      G Rj  x€L
  T'       g   \9        T P:                  TT4       R#  TPE                  TTR7      G Rj  x€L
  \G        TS!;'       g    / P                  R4      R7      pTPI                  TTTR7      G Rj  x€L
  TPK                  TTTR7      G Rj  x€L
 w  ppT'       d%   T'       d   Te   T P:                  TT3R lTn'        MT'       g   \9        T P:                  TT4       TPQ                  T T'       * R7      G Rj  x€L
 '       g:   TPR                  T J d   \U        T RR 7      G Rj  x€L
  TPW                  TT 4       R#  \Y        T T4      G Rj  x€L
  TPW                  TT 4       R#  EL ELï ELº EL£ ELà EL¤  \2         d!   p\5        T T4      G Rj  x€L 
   Rp?R# Rp?ii ; i ELj  \2         d@   pT'       g   \9        T P:                  TT4       \5        T T4      G Rj  x€L 
   Rp?R# Rp?i\<         d@   pT'       g   \9        T P:                  TT4       \5        T T4      G Rj  x€L 
   Rp?R# Rp?iT d!   p\5        T T4      G Rj  x€L 
   Rp?R# Rp?ii ; i  T d!   p\5        T T4      G Rj  x€L 
   Rp?R# Rp?i\>        \@        3 d@   pT'       g   \9        T P:                  TT4       \5        T T4      G Rj  x€L 
   Rp?R# Rp?ii ; i ELë  T'       g   \9        T P:                  TT4       i i ; i ELÖ EL— EL~  T\>        \@        \L        3 d@   pT'       g   \9        T P:                  TT4       \5        T T4      G Rj  x€L 
   Rp?R# Rp?ii ; i ELl ELD EL  \Z         d     EL*i ; i  TPW                  TT 4       i ; i5i)#é    )ÚPTY_REGISTRYÚ	PtyBridgeÚPtyUnavailableErrorÚ_PTY_BRIDGE_AVAILABLErI  )ÚInstallErrorÚptyNz$pty accepted peer=%s mode=%s cred=%suç   
[31mChat unavailable: the embedded terminal requires a POSIX PTY, which native Windows Python doesn't provide.[0m
[33mInstall Hermes inside WSL2 to use the dashboard's /chat tab â€” the rest of the dashboard works here.[0m
r  rš   rT  r¡   ÚfreshrN   rÜ   rÖ   Úsidecar_urlrY  )Úresolve_chat_cwdÚcwdÚworkspace_cwdÚattachÚHERMES_TUI_RESUMEÚ c                  ó,   <€ S P                  SSSR 7      # ))rg  Úenv)Úspawn)r_  Úargvrg  rm  s   €€€€r%   Ú_spawnÚpty_ws.<locals>._spawnf  s   ø€ Ø�‰˜t¨°#ˆÓ6Ð6r'   )Úkeep_keyÚHERMES_HOMErA  )rr  Ú
holder_pid)rn  rY  c                 ó   € \        WV4      # rÃ   )rF   )r#   Úchr2   s   &&&r%   Ú<lambda>Úpty_ws.<locals>.<lambda>—  s   € Ü,¨S°dÔ;r'   )Úforce_redrawzkeepalive-redrawr9   >   Ú1ÚonÚyesÚtruerZ   ).rQ   r^  r_  r`  ra  rI  Ú
pm.packagerb  r–   r.  r]   rŽ   r\   r�   rg   rB   rk   r   rS   rT   rZ  rÌ   r=   Ú&hermes_cli.web_routers.chat_workspacesrf  r   r=  r   rF   r#   Ú
SystemExitÚFileNotFoundErrorr8   r   Úclose_other_sessionsrE  Úclose_orphaned_sessionsÚattach_or_spawnr   Úactive_session_cleanupri  Ú_wsr   ÚdetachrR  r
   )"rd   r^  r`  ra  rI  rb  r6  r�   r“   r’   Ú
raw_resumerT  r¡   r<   re  rU  rY  rX  Úresolve_kwargsrf  rh  r  Úraw_attach_tokenÚattach_tokenÚregistry_resumerp  rN  rt  rG  Ú_createdr_  ro  rg  rm  s"   &                             @@@@r%   Úpty_wsrŽ    s�  ûé € çzÕzÝ'Ü˜"˜eÓ$×$€DØ‚|ÙØÑ€D�Ø
�)‰)‹+×ÐÜ‡I�IÐ4°dÀ$ÔG÷ !Ø�l‰lðGó
÷ 	
ð 	
ð �h‰h˜DˆhÓ!×!Ð!Ùà—‘×$Ñ$ XÓ.×6Ð6°$€JØ€FØ�o‰o×!Ñ! )Ó,×4Ð4°€GÜ$ RÓ(€Gß18Ô$ WÔ-¸d€KØ—?‘?×&Ñ& wÓ/×5Ð5°2×<Ñ<Ó>×DÑDÓFÐJdÑd€KÜ<UÐVXÐbmÓ<n×6nÑ3ÐÐ+¨Vç—{§v°&Ô2Fð
 �l‰l˜F H¨d°FÐ;Ó<×<Ð<à ¨°{ÀIÈwÐW€NØÒ&Ü03Ð4GÓ0HˆÐ,Ñ-çÝKð	Ù,¨R¯_©_×-@Ñ-@ÀÓ-GÓHˆM÷ Ø.;ˆN˜?Ñ+ðÜ7ÑI¸.ÑI×I‰ˆˆc�3ð —‘×*Ñ*¨8Ó4×<Ð<¸ÐØ#€LØ €Oß—cØŸ'™'Ð"5Ó6×DÐD¸*ˆØÒ§_¿à&˜ r¨'¯-¨-°R¨¸¸?×;PÐ;PÈbÐ:QÐRˆ÷7ð 7ð Òð		Ù“XˆFð	SÜ˜r 6Ó*×*Ð*÷ &Ü,¨R¯V©V°WÐ>QÔRÙðØ×/Ñ/Ð0@È<Ð/ÓX×XÐXÜ& ÀsÇyÀyÈbÇoÁoÐVcÓFdÔeˆ
Ø×2Ñ2°?È\ÐfpÐ2Óq×qÐqØ".×">Ñ">ØØØ 3ð #?ó #
÷ 
Ñˆ�÷ çÐ*Ò6àŸ6™6 gÐ4Gó <ð Ô*ø÷  ô 	% R§V¡V¨WÐ6IÔJð —‘ °X´�Ó>×>Ö>ð �;‰;˜"ÓÜ*¨2Ð4FÔG×GÐGØ×Ñ˜L¨"Ô-Ùð.Ü# B¨Ó0×0Ð0ð 	×Ñ˜L¨"Ö-òo %ò ò
	
ò 	"ò 7oò 	=øô ô 	Ü˜B Ó$×$Ñ$Ýûð	úò JøÜô ß!Ü(¨¯©°Ð:MÔNÜ˜˜CÓ × Ñ ÝûÜô ß!Ü(¨¯©°Ð:MÔNÜ˜˜CÓ × Ñ ÝûØô Ü˜˜CÓ × Ñ Ýûðûð( #ô 	Ü˜B Ó$×$Ñ$ÝûÜ!¤7Ð+ô 	ß%Ü,¨R¯V©V°WÐ>QÔRÜ˜B Ó$×$Ñ$Ýûð		úò +ø÷ &Ü,¨R¯V©V°WÐ>QÕRð &úò 	Yâqò
øð
  Ô!2´G¼\ÐJô ß!Ü(¨¯©°Ð:MÔNÜ˜˜CÓ × Ñ Ýûð	úò( ?ò
 Hò 	1øÜô Úðûð
 	×Ñ˜L¨"Õ-üsø  †$Y*ªP9«"Y*ÁP<Á7Y*ÂP?ÂY*ÂQÂ 'Y*Ã&Y*Ã/AY*Ä41Y*Å%QÅ&Y*Å6Y*Å>Y*ÆY*Æ$QÆ%%Y*ÇY*Ç!Q Ç3Y*Ç;Y*ÈQ< ÈQ9ÈQ< È!Y*È:Y*É	Y*ÉY*É)Y*É8Y*Ê Y*ÊY*ÊY*Ê,T6 Ê4V1 ËV.ËV1 Ë!Y*Ë*W Ì WÌW Ì.W ÍWÍW ÍWÍW Í&Y*Í.Y*Í6#Y*Î2Y*ÏX8Ï	Y*Ï Y*Ï7X;Ï8Y*ÐY Ð X>Ð!Y Ð%Y*Ð<Y*Ð?Y*ÑY*ÑY*ÑY*ÑQ6ÑQ1Ñ%Q(Ñ&Q1Ñ+Y*Ñ1Q6Ñ6Y*Ñ9Q< Ñ<T3Ò.SÒ5R8Ò6SÒ;Y*ÓT3ÓT3Ó.T	Ó=T Ó>T	ÔY*Ô	T3ÔT3ÔT.Ô"T%Ô#T.Ô(Y*Ô.T3Ô3Y*Ô6V+Ô=UÕUÕUÕY*ÕV+Õ+V+Õ,.V&ÖVÖV&Ö Y*Ö&V+Ö+Y*Ö.V1 Ö1"W×Y*×W ×W ×W ×X5×6.X0Ø$X'Ø%X0Ø*Y*Ø0X5Ø5Y*Ø;Y*Ø>Y ÙYÙY ÙYÙY ÙY'Ù'Y*z/api/wsc                ó(   € V ^8„  d   QhR\         RR/# r¾   r¿   )r$   s   "r%   r&   r&   ¿  s   € ÷ ñ œð  tñ r'   c              ƒ   óª  "  € \        V 4      G R j  x€L
 '       g   R # ^ RIHp ^ RIHp \
        P                  ! V4      G R j  x€L
  \        V RR 4      p\        V P                  P                  RR 4      pVe'   Vf#   RRRRR	VP                  R
VP                  R. RO/pVe	   / VCRR/CpV! V VR\        V RR 4      R7      G R j  x€L
  R #  L» L‹ L
5i)N)Ú start_deferred_mcp_discovery_now)Ú	handle_wsÚ_hermes_auth_identityÚsession_authorityÚuser_idzlegacy-token-ownerÚproviderzsession-tokenÚ
profile_idÚinstance_idÚcapabilitiesÚprofile_scoper�   TÚ_hermes_ws_subprotocol)Úauth_identityÚoperatorÚsubprotocol)zsession:createzsession:readzsession:submitzsession:controlzsession:approvezsession:respond)r›   Úhermes_cli.mcp_startupr‘  Útui_gateway.wsr’  r-   Ú	to_threadrR   r#   r)   r—  r˜  )rd   r‘  r’  ÚidentityÚ	authoritys   &    r%   Ú
gateway_wsr¤  ¾  sê   é € ä.¨rÓ2×2Ö2ÙÝGÝ(ô ×
Ò
Ð<Ó
=×=Ð=ô
 �rÐ2°DÓ9€HÜ˜Ÿ™Ÿ™Ð&9¸4Ó@€IØÒ Ò!1ð Ð3°ZÀØ  )×"6Ñ"6¸Ày×G\ÑG\Ø"ò %^ð_ˆð Òð 9�hÐ8 °Ñ8ˆÙ
Ø
ØØÜ˜BÐ 8¸$Ó?ô	÷ ò ñ3 3ñ >ñ$ùs9   ‚C‘C’	Cœ'CÁCÁBCÃCÃCÃCÃCc                óF   € V ^8„  d   QhR\         R\        \        ,          /# rc   re   )r$   s   "r%   r&   r&   è  s   € ÷ ñ ¤ð ¬x¼­}ñ r'   c              ƒ   óÞ   "  € \        V 4      G R j  x€L
 '       g   R # \        V 4      pV'       g   V P                  RR7      G R j  x€L
  R # V P                  4       G R j  x€L
  V#  LU L" L
5i)Nr  rš   )r›   rk   r�   r.  rj   s   & r%   Ú_accept_channel_wsr§  è  s[   é € Ü.¨rÓ2×2Ö2ÙÜ$ RÓ(€GßØ�h‰h˜DˆhÓ!×!Ð!ÙØ
�)‰)‹+×ÐØ€Nñ 3ñ 	"áùs8   ‚A-‘A'’	A-œ*A-ÁA)ÁA-Á A+Á!A-Á)A-Á+A-z/api/pubc                ó(   € V ^8„  d   QhR\         RR/# r¾   r¿   )r$   s   "r%   r&   r&   ô  s   € ÷ ñ ”Yð  4ñ r'   c              ƒ   óÜ   "  € \        V 4      G R j  x€L
 pVf   R #   \        V P                  YP                  4       G R j  x€L
 4      G R j  x€L
  K7   LB L L
  \         d     R # i ; i5irÃ   )r§  ra   r#   Úreceive_textr
   rj   s   & r%   Úpub_wsr«  ó  s_   é € ä& rÓ*×*€GØ‚ÙðØÜ" 2§6¡6¨7¿/¹/Ó:K×4KÓL×LÒLñ +ñ
 5LÑLøÜô ÚðüsV   ‚A,‘A’
A,�$A ÁAÁA ÁAÁA ÁA,ÁA ÁA ÁA)Á%A,Á(A)Á)A,z/api/eventsc                ó(   € V ^8„  d   QhR\         RR/# r¾   r¿   )r$   s   "r%   r&   r&      s   € ÷ 6ñ 6œ	ð 6 dñ 6r'   c           
   ƒ   ó¸  "  € \        V 4      G R j  x€L
 pVf   R # \        V P                  4      w  r#T;_uu_4       GR j  x€L
  VP                  V\	        4       4      P                  V 4       R R R 4      GR j  x€L
    V P                  4       G R j  x€L
  K   L‰ L[ L$  + GR j  x€L 
 '       g   i     L;; i L(  \         d     Mi ; iT;_uu_4       GR j  x€L 
  TP                  T4      pTe,   TP                  T 4       T'       g   TP                  TR 4       R R R 4      GR j  x€L 
  R #   + GR j  x€L 
 '       g   i     R # ; i  T;_uu_4       GR j  x€L 
  TP                  T4      pTe,   TP                  T 4       T'       g   TP                  TR 4       R R R 4      GR j  x€L 
  i   + GR j  x€L 
 '       g   i     i ; i; i5irÃ   )r§  r0   r#   Ú
setdefaultÚsetÚaddrª  r
   rB   ÚdiscardrC   )rd   r<   r*   r+   r_   s   &    r%   Ú	events_wsr²  ÿ  s.  é € ä& rÓ*×*€GØ‚ÙÜ!1°"·&±&Ó!9Ñ€Nß�zŠzØ×!Ñ! '¬3«5Ó1×5Ñ5°bÔ9÷ �zð6Øà—/‘/Ó#×#Ò#ñ +÷ �z�zŒzúñ
 $øÜô Ùðú÷ —:“:Ø!×%Ñ% gÓ.ˆDØÒØ—‘˜RÔ ßØ"×&Ñ& w°Ô5÷ —:—:—:—:”:û—:—:“:Ø!×%Ñ% gÓ.ˆDØÒØ—‘˜RÔ ßØ"×&Ñ& w°Ô5÷ —:—:—:—:’:ÿs5  ‚G‘B’/GÁBÁGÁ*B!Á/GÁ:BÁ;GÂ B? ÂB=ÂB? ÂGÂGÂGÂ!B:	Â'B*Â(
B:	Â3B:	Â5GÂ=B? Â?CÃ
E ÃCÃE ÃGÃC!ÃGÃ#.D7ÄD7Ä$GÄ/D2Ä0GÄ7E	Ä=E Ä>
E	Å	E	Å	GÅGÅ#E&Å$GÅ(.F;	ÆF;	Æ)GÆ4F7Æ5GÆ;GÇGÇ
GÇGÇGÇG)Qrÿ   r-   r4  rp   ÚloggingÚreÚpathlibr   Útypingr   r   r   Úfastapir   r   r   r	   r
   Úagent.interrupt_scoper   r   Úhermes_cli.active_sessionsr   r   Úhermes_cli.pty_sessionr   Úhermes_cli.web_depsr   r   Ú%hermes_cli.web_routers.chat_ws_errorsr   rQ   r   r   r   r   r   r   Ú	getLoggerr]   Úrouterr   r   r   r   r   r   r   r    r0   Úcompilerh   r:   rF   rU   ra   rk   ru   r�   r–   r›   rÓ   r¹   r°   r0  r¥   r´   rº   r¼   r	  Ú	websocketr9  r=  rE  rR  rZ  rŽ  r¤  r§  r«  r²  rZ   r'   r%   Ú<module>rÁ     s  ðñó Û Û Û Û 	Ý ß &Ñ &ç UÕ Uç Fß cÝ /ß /Ý L÷÷ ð
 ×ÒÐ0Ó1€Ù	‹€ñ $(Ð(JÐLhÓ#iÐ  ÙÐ&Ð(HÓI€ÙÐ :Ð<XÓYÐ ÙÐ2Ð4TÓUÐ ÙÐ(Ð*FÓG€ÙÐ,Ð.JÓKÐ ÙÐ6Ð8TÓUÐ Ù#,Ð-OÓ#PÐ  õ	>ð —J’JÐ9Ó:Ð õõ
õ	õ
_õAõ=õ;õ õFð$ €Ø#'Ð  à"&Ð ØÐ ð9Øjn÷9õkõ"÷:iñ :iõzð( ×Ñ�.Ó!ôUó "ðUõpðÐSW÷ õ,õ8;ð8 ×Ñ�*ÓôZ.ó ðZ.ðF ×Ñ�)Óôó ðõRð ×Ñ�*Óôó ðð ×Ñ�-Ó ô6ó !ò6r'   