Ë
    :vžj%  ã                  ód  — d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlmZ ddlmZ ddlmZ ddlmZ 	 ddlZe	j.                  dk(  rej0                  Zndd	„Zddd
„Z G d„ d«      Z G d„ de«      Z ej6                  ej8                  «       y# e$ r dZY Œ`w xY w)z!JupyterLab Server process handleré    )ÚannotationsN)ÚLogger)Úwhich)ÚAny)ÚgenÚwin32c                óT   — ddl }dj                  t        |j                  | «      «      S )zShim for list2cmdline on posix.r   NÚ )ÚshlexÚjoinÚmapÚquote)Úcmd_listr   s     új/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/jupyterlab_server/process.pyÚlist2cmdliner       s   € ãà�x‰xœ˜EŸK™K¨Ó2Ó3Ð3ó    c                ó<  — |xs t         j                  }|j                  d«      xs t         j                  }t	        | |¬«      }| dk(  r|sd} t	        d|¬«      }|s"| dv rd}t        |«      ‚t        dd| z  z   «      ‚t         j                  j                  |«      S )	zËGet the full path to a command.

    Parameters
    ----------
    command: str
        The command name or path.
    env: dict, optional
        The environment variables, defaults to `os.environ`.
    ÚPATH)ÚpathÚnodeÚnodejs)r   r   ÚnpmzÃPlease install Node.js and npm before continuing installation. You may be able to install Node.js from your package manager, from conda, or directly from the Node.js website (https://nodejs.org).z%The command was not found or was not zexecutable: %s.)ÚosÚenvironÚgetÚdefpathÚ_whichÚ
ValueErrorr   Úabspath)ÚcommandÚenvr   Úcommand_with_pathÚmsgs        r   r   r   '   sž   € ð Ò
”—‘€CØ�7‰7�6‹?Ò(œbŸj™j€DÜ˜w¨TÔ2Ðð �&ÒÑ!2ØˆÜ" 8°$Ô7ÐáØÐ/Ñ/ð XˆCÜ˜S“/Ð!ÜÐ@ÐCTÐW^ÑC^Ñ^Ó_Ð_Ü�7‰7�?‰?Ð,Ó-Ð-r   c                  óÈ   — e Zd ZU dZ ej
                  «       Zded<   dZ	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Z	dd„Z
dd„Zej                  dd„«       Zdd	„Zedd
„«       Zdd„Zy)ÚProcesszA wrapper for a child process.zweakref.WeakSetÚ_procsNc                óþ  — t        |t        t        f«      sd}t        |«      ‚|r|j	                  «       rd}t        |«      ‚|xs | j                  «       | _        d| _        |s%| j                  j                  dt        |«      «       || _
        i }|rt        j                  |d<    | j                  d||dœ|¤Ž| _        |xs t        j                   «       | _        t$        j&                  j)                  | «       y)	a)  Start a subprocess that can be run asynchronously.

        Parameters
        ----------
        cmd: list
            The command to run.
        logger: :class:`~logger.Logger`, optional
            The logger instance.
        cwd: string, optional
            The cwd of the process.
        env: dict, optional
            The environment for the process.
        kill_event: :class:`~threading.Event`, optional
            An event used to kill the process operation.
        quiet: bool, optional
            Whether to suppress output.
        zCommand must be given as a listzProcess abortedÚ z> %sÚstdout)Úcwdr!   N© )Ú
isinstanceÚlistÚtupler   Úis_setÚget_logÚloggerÚ
_last_lineÚinfor   ÚcmdÚ
subprocessÚDEVNULLÚ_create_processÚprocÚ	threadingÚEventÚ_kill_eventr%   r&   Úadd)	Úselfr4   r1   r*   Ú
kill_eventr!   Úquietr#   Úkwargss	            r   Ú__init__zProcess.__init__H   sÖ   € ô4 ˜#¤¤e˜}Ô-Ø3ˆCÜ˜S“/Ð!á˜*×+Ñ+Ô-Ø#ˆCÜ˜S“/Ð!àÒ. §¡£ˆŒØˆŒÙØ�K‰K×Ñ˜V¤\°#Ó%6Ô7ØˆŒàˆÙÜ)×1Ñ1ˆF�8Ñà(�D×(Ñ(ÐD¨S°cÑD¸VÑDˆŒ	Ø%Ò:¬¯©Ó):ˆÔä�‰×Ñ˜4Õ r   c                ó¦  — | j                   }|j                  «       €.t        j                  |j                  t
        j                  «       	 |j                  d¬«       | t        j                  v rt        j                  j                  | «       |j                  «       S # t        j                  $ rg t        j                  dk(  rt
        j                  }nt
        j                  }|j                  «       € t        j                  |j                  |«       Y Œºw xY w# | t        j                  v r t        j                  j                  | «       w w xY w)z/Terminate the process and return the exit code.g       @)ÚtimeoutÚnt)r8   Úpollr   ÚkillÚpidÚsignalÚSIGTERMÚwaitr5   ÚTimeoutExpiredÚnameÚSIGBREAKÚSIGKILLr%   r&   Úremove)r=   r8   Úsigs      r   Ú	terminatezProcess.terminatey   sç   € à�y‰yˆð �9‰9‹;ÐÜ�G‰G�D—H‘HœfŸn™nÔ-ð	,Ø�I‰I˜cˆIÔ"ð ”w—~‘~Ñ%Ü—‘×%Ñ% dÔ+à�y‰y‹{Ðøô ×(Ñ(ò 	'Ü�w‰w˜$ŠÜ—o‘o‘ä—n‘n�à�y‰y‹{Ð"Ü—‘˜Ÿ™ #Ô&ùð	'ûð ”w—~‘~Ñ%Ü—‘×%Ñ% dÕ+ð &ús%   ÁB ÂA7DÄD ÄDÄD Ä4Ec                ó  — | j                   }| j                  }|j                  «       €S|j                  «       r| j	                  «        d}t        |«      ‚t        j                  d«       |j                  «       €ŒS| j	                  «       S )zhWait for the process to finish.

        Returns
        -------
        The process exit code.
        úProcess was abortedç      ð?)r8   r;   rE   r/   rQ   r   ÚtimeÚsleep©r=   r8   r>   r#   s       r   rJ   zProcess.wait“   sq   € ð �y‰yˆØ×%Ñ%ˆ
Ø�i‰i‹kÐ!Ø× Ñ Ô"Ø—‘Ô Ø+�Ü  “oÐ%Ü�J‰J�sŒOð �i‰i‹kÑ!ð �~‰~ÓÐr   c              #  óJ  K  — | j                   }| j                  }|j                  «       €U|j                  «       r| j	                  «        d}t        |«      ‚t        j                  d«      –— |j                  «       €ŒUt        j                  | j	                  «       «      ‚­w)z.Asynchronously wait for the process to finish.rS   rT   )	r8   r;   rE   r/   rQ   r   r   rV   ÚReturnrW   s       r   Ú
wait_asynczProcess.wait_async¤   s�   è ø€ ð �y‰yˆØ×%Ñ%ˆ
Ø�i‰i‹kÐ!Ø× Ñ Ô"Ø—‘Ô Ø+�Ü  “oÐ%Ü—)‘)˜C“.Ò ð �i‰i‹kÑ!ô �j‰j˜Ÿ™Ó)Ó*Ð*ùs   ‚A=B#Â #B#c                ó
  — t        | j                  «      }|j                  dt        j                  «       t        |d   |j                  d«      «      |d<   t        j                  dk(  rd|d<   t        j                  |fi |¤ŽS )zCreate the process.Ústderrr   r!   rD   TÚshell)
r-   r4   Ú
setdefaultr5   ÚSTDOUTr   r   r   rL   ÚPopen)r=   r@   r4   s      r   r7   zProcess._create_process²   sl   € ä�4—8‘8‹nˆØ×Ñ˜(¤J×$5Ñ$5Ô6ä�s˜1‘v˜vŸz™z¨%Ó0Ó1ˆˆA‰ä�7‰7�dŠ?Ø"ˆF�7‰Oä×Ñ Ñ. vÑ.Ð.r   c                óX   — t        | j                  «      D ]  }|j                  «        Œ y)z*Clean up the started subprocesses at exit.N)r-   r&   rQ   )Úclsr8   s     r   Ú_cleanupzProcess._cleanup¾   s!   € ô ˜Ÿ™Ö$ˆDØ�N‰NÕñ %r   c                óè   — t        | d«      r| j                  �| j                  S t        j                  d«      | _        | j                  j	                  t        j
                  «       | j                  S )zGet our logger.r1   Ú
jupyterlab)Úhasattrr1   ÚloggingÚ	getLoggerÚsetLevelÚINFO)r=   s    r   r0   zProcess.get_logÄ   sQ   € ä�4˜Ô" t§{¡{Ð'>Ø—;‘;Ðä×'Ñ'¨Ó5ˆŒØ�‰×ÑœWŸ\™\Ô*Ø�{‰{Ðr   )NNNNF)r4   ú	list[str]r1   úLogger | Noner*   ú
str | Noner>   úthreading.Event | Noner!   údict[str, str] | Noner?   ÚboolÚreturnÚNone©rq   Úint)rq   r   ©r@   r   rq   zsubprocess.Popen[str])rb   ztype[Process]rq   rr   )rq   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚweakrefÚWeakSetr&   Ú__annotations__Ú_poolrA   rQ   rJ   r   Ú	coroutinerZ   r7   Úclassmethodrc   r0   r+   r   r   r%   r%   B   s¸   … Ù(à-˜gŸo™oÓ/€FˆOÓ/Ø€Eð
 !%ØØ-1Ø%)Øð/!àð/!ð ð/!ð ð	/!ð
 +ð/!ð #ð/!ð ð/!ð 
ó/!óbó4 ð" 	‡]�]ò+ó ð+ó
/ð òó ðô
r   r%   c                  ód   ‡ — e Zd ZdZ	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zdd„Zd	d„Zd
ˆ fd„Zˆ xZS )ÚWatchHelperz%A process helper for a watch process.c                óÄ  •— t         ‰	| �  |||||¬«       t        €| j                  j                  | _        	 | j
                  j                  «       j                  d«      }|sd}t        |«      ‚t        |j                  «       «       t        j                  ||«      rnŒit        j                  | j                  d¬«      | _        | j                   j#                  «        y)a  Initialize the process helper.

        Parameters
        ----------
        cmd: list
            The command to run.
        startup_regex: string
            The regex to wait for at startup.
        logger: :class:`~logger.Logger`, optional
            The logger instance.
        cwd: string, optional
            The cwd of the process.
        env: dict, optional
            The environment for the process.
        kill_event: callable, optional
            A function to call to check if we should abort.
        )r1   r*   r>   r!   Núutf-8zProcess ended improperlyT)ÚtargetÚdaemon)ÚsuperrA   Úptyr8   r)   Ú_stdoutÚreadlineÚdecodeÚRuntimeErrorÚprintÚrstripÚreÚmatchr9   ÚThreadÚ_read_incomingÚ_read_threadÚstart)
r=   r4   Ústartup_regexr1   r*   r>   r!   Úliner#   Ú	__class__s
            €r   rA   zWatchHelper.__init__Ñ   s»   ø€ ô4 	‰Ñ˜ V°ÀÐQTÐÔUäˆ;ØŸ9™9×+Ñ+ˆDŒLàØ—<‘<×(Ñ(Ó*×1Ñ1°'Ó:ˆDÙØ0�Ü" 3Ó'Ð'Ü�$—+‘+“-Ô Ü�x‰x˜ tÔ,Øð ô &×,Ñ,°D×4GÑ4GÐPTÔUˆÔØ×Ñ×ÑÕ!r   c                óJ  — | j                   }|j                  «       €ƒt        j                  dk7  rBt        j                  t        j
                  |j                  «      t        j                  «       n.t        j                  |j                  t        j                  «       	 |j                  «        | t        j                  v rt        j                  j                  | «       |j                  S # | t        j                  v r t        j                  j                  | «       w w xY w)zTerminate the process.rD   )r8   rE   r   rL   ÚkillpgÚgetpgidrG   rH   rI   rF   rJ   r%   r&   rO   Ú
returncode)r=   r8   s     r   rQ   zWatchHelper.terminateü   s´   € à�y‰yˆà�9‰9‹;ÐÜ�w‰w˜$Šä—	‘	œ"Ÿ*™* T§X¡XÓ.´·±Õ?ä—‘˜Ÿ™¤&§.¡.Ô1ð	,Ø�I‰IŒKà”w—~‘~Ñ%Ü—‘×%Ñ% dÔ+à�‰Ðøð ”w—~‘~Ñ%Ü—‘×%Ñ% dÕ+ð &ús   Â!C. Ã.4D"c                ó
  — | j                   j                  «       }	 	 t        j                  |d«      }|syt        |j                  d«      d¬«       Œ7# t        $ r&}| j
                  j                  d|«       Y d}~yd}~ww xY w)z(Run in a thread to read stdout and printi   zRead incoming error %sNrƒ   r(   )Úend)	rˆ   Úfilenor   ÚreadÚOSErrorr1   ÚdebugrŒ   rŠ   )r=   r�   ÚbufÚes       r   r‘   zWatchHelper._read_incoming  sv   € à—‘×$Ñ$Ó&ˆØðÜ—g‘g˜f dÓ+�ñ
 Øä�#—*‘*˜WÓ%¨2Õ.ð øô ò Ø—‘×!Ñ!Ð":¸AÔ>Üûðús   �A Á	BÁA=Á=Bc                ó°  •— d|d<   t         �Bt        j                  «       \  }}|x|d<   |d<   d|d<   t        j                  |d«      | _        nzt
        j                  |d<   t        j                  dk(  rTt        j                  «       }|xj                  t
        j                  z  c_	        ||d	<   t
        j                  |d
<   d|d<   t        ‰| �4  di |¤ŽS )z"Create the watcher helper process.r   Úbufsizer\   r)   TÚstart_new_sessionÚrbrD   ÚstartupinfoÚcreationflagsr]   r+   )r‡   Úopenptyr   Úfdopenrˆ   r5   ÚPIPErL   ÚSTARTUPINFOÚdwFlagsÚSTARTF_USESHOWWINDOWÚCREATE_NEW_PROCESS_GROUPr†   r7   )r=   r@   ÚmasterÚslaver§   r–   s        €r   r7   zWatchHelper._create_process  sÆ   ø€ àˆˆyÑäˆ?ÜŸK™K›M‰MˆF�EØ27Ð7ˆF�8Ñ˜v hÑ/Ø*.ˆFÐ&Ñ'ÜŸ9™9 V¨TÓ2ˆD�Lä)Ÿ™ˆF�8Ñä�w‰w˜$ŠÜ(×4Ñ4Ó6�Ø×#Ò#¤z×'FÑ'FÑFÕ#Ø(3��}Ñ%Ü*4×*MÑ*M��Ñ'Ø"&��w‘ä‰wÑ&Ñ0¨Ñ0Ð0r   )NNNN)r4   rk   r”   Ústrr1   rl   r*   rm   r>   rn   r!   ro   rq   rr   rs   )rq   rr   ru   )	rv   rw   rx   ry   rA   rQ   r‘   r7   Ú__classcell__)r–   s   @r   r�   r�   Î   sr   ø„ Ù/ð !%ØØ-1Ø%)ð)"àð)"ð ð)"ð ð	)"ð
 ð)"ð +ð)"ð #ð)"ð 
õ)"óVó(/÷1ñ 1r   r�   )r   rk   rq   r²   )N)r    r²   r!   ro   rq   r²   )ry   Ú
__future__r   Úatexitrg   r   rŽ   rH   r5   Úsysr9   rU   rz   r   Úshutilr   r   Útypingr   Útornador   r‡   ÚImportErrorÚplatformr   r%   r�   Úregisterrc   r+   r   r   Ú<module>r½      s«   ðÙ 'õ #ã Û Û 	Û 	Û Û Û 
Û Û Û Ý Ý "Ý å ðÛð ‡<�<�7ÒØ×*Ñ*�Ló4ô.÷6Iñ IôXd1�'ô d1ðP €‡��× Ñ Õ !øð{ ò Ø
‚Cðús   Á
B% Â%B/Â.B/