Ë
    :vžjì  ã                  óî   — d Z ddlmZ ddlZddlmZ ddlmZm	Z	 ddl
mZ ddlmZmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZ ej0                  Zej4                  eej8                  f   Z G d„ dee«      Zy)zgA MultiTerminalManager for use in the notebook webserver
- raises HTTPErrors
- creates REST API models
é    )ÚannotationsN)Ú	timedelta)Ú	isoformatÚutcnow)Úmetrics)ÚNamedTermManagerÚPtyWithClients)Úweb)ÚIOLoopÚPeriodicCallback)ÚInteger)ÚLoggingConfigurablec                  ó®   ‡ — e Zd ZdZdZdZ eddd¬«      ZdZ eedd	¬«      Z	dd
„Z
dd„Zdd„Zddˆ fd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zˆ xZS )ÚTerminalManagerz8A MultiTerminalManager for use in the notebook webserverNFr   Tz€Timeout (in seconds) in which a terminal has been inactive and ready to be culled.
        Values of 0 or lower disable culling.)ÚconfigÚhelpi,  z_The interval (in seconds) on which to check for terminals exceeding the inactive timeout value.c                ó¸   —  | j                   di |¤Ž\  }}t        «       |_        | j                  |«      }t        j                  «        | j                  «        |S )zCreate a new terminal.© )Únew_named_terminalr   Úlast_activityÚget_terminal_modelÚRUNNING_TOTALÚincÚ_initialize_culler)ÚselfÚkwargsÚnameÚtermÚmodels        úy/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/jupyter_server_terminals/terminalmanager.pyÚcreatezTerminalManager.create1   sT   € à,�T×,Ñ,Ñ6¨vÑ6‰
ˆˆdô $›XˆÔØ×'Ñ'¨Ó-ˆä×ÑÔà×ÑÔ!Øˆó    c                ó$   — | j                  |«      S )zGet terminal 'name'.)r   ©r   r   s     r    ÚgetzTerminalManager.get?   s   € à×&Ñ& tÓ,Ð,r"   c                óœ   — | j                   D �cg c]  }| j                  |«      ‘Œ }}t        j                  t	        |«      «       |S c c}w )z$Get a list of all running terminals.)Ú	terminalsr   r   ÚsetÚlen)r   r   Úmodelss      r    ÚlistzTerminalManager.listC   sD   € à<@¿NºNÓK¹N°D�$×)Ñ)¨$Õ/¸NˆÐKô 	×Ñœ#˜f›+Ô&Øˆùò	 Ls   �A	c              ƒ  óŽ   •K  — | j                  |«       t        ‰| �	  ||¬«      ƒ d{  –—†  t        j	                  «        y7 Œ­w)zTerminate terminal 'name'.©ÚforceN)Ú_check_terminalÚsuperÚ	terminater   Údec)r   r   r.   Ú	__class__s      €r    r1   zTerminalManager.terminateK   s@   øè ø€ à×Ñ˜TÔ"Ü‰gÑ ¨EÐÓ2×2Ð2ô 	×ÑÕð	 	3ús   ƒ&A©AªAc              ƒ  ó~   K  — t        | j                  «      }|D ]  }| j                  |d¬«      ƒ d{  –—†  Œ y7 Œ­w)zTerminate all terminals.Tr-   N)r+   r'   r1   )r   Útermsr   s      r    Úterminate_allzTerminalManager.terminate_allT   s7   è ø€ ä�T—^‘^Ó$ˆÛˆDØ—.‘. ¨T�.Ó2×2Ñ2ñ Ø2ús   ‚1=³;´=c                ór   — | j                  |«       | j                  |   }|t        |j                  «      dœS )zuReturn a JSON-safe dict representing a terminal.
        For use in representing terminals in the JSON APIs.
        )r   r   )r/   r'   r   r   )r   r   r   s      r    r   z"TerminalManager.get_terminal_modelZ   s;   € ð 	×Ñ˜TÔ"Ø�~‰~˜dÑ#ˆàÜ& t×'9Ñ'9Ó:ñ
ð 	
r"   c                óR   — || j                   vrt        j                  dd|z  «      ‚y)z9Check a that terminal 'name' exists and raise 404 if not.i”  zTerminal not found: %sN)r'   r
   Ú	HTTPErrorr$   s     r    r/   zTerminalManager._check_terminale   s*   € à�t—~‘~Ñ%Ü—-‘- Ð%=ÀÑ%DÓEÐEð &r"   c                ó  — | j                   só| j                  dkD  rä| j                  €Øt        j                  «       }| j
                  dk  rB| j                  j                  d| j
                  | j                  «       | j                  | _        t        | j                  d| j
                  z  «      | _        | j                  j                  d| j                  | j
                  «       | j                  j                  «        d| _         y)z‡Start culler if 'cull_inactive_timeout' is greater than zero.
        Regardless of that value, set flag that we've been here.
        r   NzKInvalid value for 'cull_interval' detected (%s) - using default value (%s).iè  zICulling terminals with inactivity > %s seconds at %s second intervals ...T)Ú_initialized_cullerÚcull_inactive_timeoutÚ_culler_callbackr   ÚcurrentÚcull_intervalÚlogÚwarningÚcull_interval_defaultr   Ú_cull_terminalsÚinfoÚstart)r   Ú_s     r    r   z"TerminalManager._initialize_cullerj   sÝ   € ð ×'Ò'¨D×,FÑ,FÈÒ,JØ×$Ñ$Ð,Ü—N‘NÓ$�Ø×%Ñ%¨Ò*Ø—H‘H×$Ñ$ØeØ×*Ñ*Ø×2Ñ2ôð
 *.×)CÑ)C�DÔ&Ü(8Ø×(Ñ(¨$°×1CÑ1CÑ*Có)�Ô%ð —‘—‘Ø_Ø×.Ñ.Ø×&Ñ&ôð
 ×%Ñ%×+Ñ+Ô-à#'ˆÕ r"   c              ƒ  ó@  K  — | j                   j                  d| j                  | j                  «       t	        | j
                  «      D ]  }	 | j                  |«      ƒ d {  –—†  Œ y 7 Œ# t        $ r'}| j                   j                  d||«       Y d }~ŒMd }~ww xY w­w)NzCPolling every %s seconds for terminals inactive for > %s seconds...zVThe following exception was encountered while checking the activity of terminal %s: %s)	r@   Údebugr?   r<   r+   r'   Ú_cull_inactive_terminalÚ	ExceptionÚ	exception)r   r   Úes      r    rC   zTerminalManager._cull_terminals„   s�   è ø€ Ø�‰�‰ØQØ×ÑØ×&Ñ&ô	
ô ˜Ÿ™Ö(ˆDðØ×2Ñ2°4Ó8×8Ñ8ñ )à8ùÜò Ø—‘×"Ñ"ð2àØ÷	ñ ûðüsB   ‚A
BÁA+Á!A)Á"A+Á&BÁ)A+Á+	BÁ4BÂBÂBÂBc              ƒ  óÂ  K  — 	 | j                   |   }| j                  j                  d||j                  «       t        |d«      r‡t        «       }||j                  z
  }|t        | j                  ¬«      kD  }|rRt        |j                  «       «      }| j                  j                  d||«       | j                  |d¬«      ƒ d {  –—†  y y y # t        $ r Y y w xY w7 Œ­w)Nzname=%s, last_activity=%sr   )Úsecondsz6Culling terminal '%s' due to %s seconds of inactivity.Tr-   )r'   ÚKeyErrorr@   rH   r   Úhasattrr   r   r<   ÚintÚtotal_secondsrA   r1   )r   r   r   Údt_nowÚdt_inactiveÚis_timeÚ
inactivitys          r    rI   z'TerminalManager._cull_inactive_terminal–   s×   è ø€ ð	Ø—>‘> $Ñ'ˆDð 	�‰�‰Ð2°D¸$×:LÑ:LÔMÜ�4˜Ô)Ü“XˆFØ  4×#5Ñ#5Ñ5ˆKà!¤I°d×6PÑ6PÔ$QÑQˆGáÜ  ×!:Ñ!:Ó!<Ó=�
Ø—‘× Ñ ØLÈdÐT^ôð —n‘n T°�nÓ6×6Ñ6ð ð *øô	 ò 	Ùð	úð 7ús4   ‚C„C “B3CÃCÃCÃ	CÃCÃCÃCc                ó"   — t        «       |_        y)zThe pre-pty read hook.N)r   r   )r   Úptywclientss     r    Úpre_pty_read_hookz!TerminalManager.pre_pty_read_hookª   s   € ä$*£HˆÕ!r"   )r   zt.AnyÚreturnÚMODEL)r   ÚstrrZ   r[   )rZ   zlist[MODEL])F)r   r\   r.   ÚboolrZ   ÚNone)rZ   r^   )r   r\   rZ   r^   )rX   r	   rZ   r^   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r=   r;   r   r<   rB   r?   r!   r%   r+   r1   r6   r   r/   r   rC   rI   rY   Ú__classcell__)r3   s   @r    r   r      s{   ø„ ÙBàÐàÐá#Ø	Øð1ôÐð  ÐÙØØØrô€Móó-óöó3ó	
óFó
(ó4ó$7÷(-r"   r   )rb   Ú
__future__r   ÚtypingÚtÚdatetimer   Újupyter_server._tzr   r   Újupyter_server.prometheusr   Úterminado.managementr   r	   Útornador
   Útornado.ioloopr   r   Ú	traitletsr   Útraitlets.configr   Ú TERMINAL_CURRENTLY_RUNNING_TOTALr   ÚDictr\   ÚAnyr[   r   r   r"   r    Ú<module>rr      s]   ðñõ #ã Ý ç 0Ý -ß AÝ ß 3Ý Ý 0à×8Ñ8€à	�‰ˆs�A—E‘EˆzÑ€ôS-Ð)Ð+;õ S-r"   