
    ^h                        S r SSKJr  SSKrSSKJr  SSKJrJ	r	  SSK
Jr  SSKJrJr  SSKJr  SS	KJrJr  SS
KJr  SSKJr  \R0                  r\R4                  \\R8                  4   r " S S\\5      rg)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                     ^  \ rS rSrSrSrSr\" SSSS9rS	r	\" \	SS
S9r
SS jrSS jrSS jrSSU 4S jjjrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSrU =r$ )TerminalManager   z8A MultiTerminalManager for use in the notebook webserverNFr   TzTimeout (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                    U R                   " S0 UD6u  p#[        5       Ul        U R                  U5      n[        R                  5         U R                  5         U$ )zCreate a new terminal. )new_named_terminalr   last_activityget_terminal_modelRUNNING_TOTALinc_initialize_culler)selfkwargsnametermmodels        b/home/james-whalen/.local/lib/python3.13/site-packages/jupyter_server_terminals/terminalmanager.pycreateTerminalManager.create1   sP    ,,6v6
 $X''-!    c                $    U R                  U5      $ )zGet terminal 'name'.)r   r   r   s     r!   getTerminalManager.get?   s    &&t,,r$   c                    U R                    Vs/ s H  oR                  U5      PM     nn[        R                  [	        U5      5        U$ s  snf )z$Get a list of all running terminals.)	terminalsr   r   setlen)r   r   modelss      r!   listTerminalManager.listC   sB    <@NNKND))$/NK 	#f+&	 Ls   Ac                   >#    U R                  U5        [        TU ]	  XS9I Sh  vN   [        R	                  5         g N7f)zTerminate terminal 'name'.forceN)_check_terminalsuper	terminater   dec)r   r   r2   	__class__s      r!   r5   TerminalManager.terminateK   s=     T"g222 		 	3s   "A?Ac                |   #    [        U R                  5      nU H  nU R                  USS9I Sh  vN   M     g N	7f)zTerminate all terminals.Tr1   N)r.   r*   r5   )r   termsr   s      r!   terminate_allTerminalManager.terminate_allT   s6     T^^$D..T.222 2s   .<:
<c                r    U R                  U5        U R                  U   nU[        UR                  5      S.$ )zeReturn a JSON-safe dict representing a terminal.
For use in representing terminals in the JSON APIs.
)r   r   )r3   r*   r   r   )r   r   r   s      r!   r   "TerminalManager.get_terminal_modelZ   s;     	T"~~d#&t'9'9:
 	
r$   c                V    XR                   ;  a  [        R                  " SSU-  5      eg)z9Check a that terminal 'name' exists and raise 404 if not.i  zTerminal not found: %sN)r*   r
   	HTTPErrorr&   s     r!   r3   TerminalManager._check_terminale   s(    ~~%--%=%DEE &r$   c                "   U R                   (       d  U R                  S:  a  U R                  c  [        R                  " 5       nU R
                  S::  aB  U R                  R                  SU R
                  U R                  5        U R                  U l        [        U R                  SU R
                  -  5      U l        U R                  R                  SU R                  U R
                  5        U R                  R                  5         SU l         g)zwStart 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   "TerminalManager._initialize_cullerj   s     ''D,F,F,J$$,NN$%%*HH$$e**22
 *.)C)CD&(8(($1C1C*C)% _..&&
 %%++-#' r$   c                H  #    U R                   R                  SU R                  U R                  5        [	        U R
                  5       H  n U R                  U5      I S h  vN   M     g  N	! [         a(  nU R                   R                  SUU5         S nAMQ  S nAff = f7f)NzCPolling every %s seconds for terminals inactive for > %s seconds...zVThe following exception was encountered while checking the activity of terminal %s: %s)	rH   debugrG   rD   r.   r*   _cull_inactive_terminal	Exception	exception)r   r   es      r!   rK   TerminalManager._cull_terminals   s     Q&&	
 (D224888 )8 ""2	 sB   A
B"A-!A+"A-&B"+A--
B7BB"BB"c                  #     U R                   U   nU R                  R                  SXR                  5        [        US5      (       a  [        5       nX2R                  -
  nU[        U R                  S9:  nU(       aN  [        UR                  5       5      nU R                  R                  SX5        U R                  USS9I S h  vN   g g g ! [         a     g f = f N7f)Nzname=%s, last_activity=%sr   )secondsz6Culling terminal '%s' due to %s seconds of inactivity.Tr1   )r*   KeyErrorrH   rQ   r   hasattrr   r   rD   inttotal_secondsrI   r5   )r   r   r   dt_nowdt_inactiveis_time
inactivitys          r!   rR   'TerminalManager._cull_inactive_terminal   s     	>>$'D 	2D:L:LM4))XF #5#55K!Id6P6P$QQG !:!:!<=
  Ld nnTn666  *	  		 7s4   C!C B4C!CC!
CC!CC!c                "    [        5       Ul        g)zThe pre-pty read hook.N)r   r   )r   ptywclientss     r!   pre_pty_read_hook!TerminalManager.pre_pty_read_hook   s    $*H!r$   )rE   rC   rG   )r   zt.AnyreturnMODEL)r   strrf   rg   )rf   zlist[MODEL])F)r   rh   r2   boolrf   None)rf   rj   )r   rh   rf   rj   )rc   r	   rf   rj   )__name__
__module____qualname____firstlineno____doc__rE   rC   r   rD   rJ   rG   r"   r'   r.   r5   r;   r   r3   r   rK   rR   rd   __static_attributes____classcell__)r7   s   @r!   r   r      s    B#	1  rM- 3	
F
(4$7(- -r$   r   )ro   
__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   Dictrh   Anyrg   r   r   r$   r!   <module>r      s]    #   0 - A  3  088	sAEEzS-)+; S-r$   