Ë
    ïñþi8*  ã                   ód  — d 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m	Z	m
Z
 ddlZddlmZ ddlmZ ddlmZmZ ddlmZ  ej(                  d	«      Zej,                  d
k(  rddlZddlZddlZddlZndZdZdZdZeZdedefd„Z G d„ d«      Zdej@                  dfdede!e   de"eef   dz  de	dz  deez  dz  deez  fd„Z#dej@                  dfdede!e   de"eef   dz  de	dz  deez  dz  defd„Z$dedz  fd„Z%deez  dedz  ddfd„Z&ddeez  de'ddfd„Z( ed«      deez  fd„«       Z)y)z=
Windows-specific functionality for stdio client operations.
é    N)ÚPath)ÚBinaryIOÚTextIOÚcast)Ú	to_thread)ÚProcess)ÚFileReadStreamÚFileWriteStream)Ú
deprecatedzclient.stdio.win32Úwin32ÚcommandÚreturnc                 ó¬   — 	 t        j                  | «      x}r|S dD ]#  }| › |› �}t        j                  |«      x}sŒ!|c S  | S # t        $ r | cY S w xY w)aB  
    Get the correct executable command normalized for Windows.

    On Windows, commands might exist with specific extensions (.exe, .cmd, etc.)
    that need to be located for proper execution.

    Args:
        command: Base command (e.g., 'uvx', 'npx')

    Returns:
        str: Windows-appropriate command path
    )z.cmdz.batz.exez.ps1)ÚshutilÚwhichÚOSError)r   Úcommand_pathÚextÚext_versionÚext_paths        úV/root/aria/mcps/aria-brain/venv/lib/python3.12/site-packages/mcp/os/win32/utilities.pyÚget_windows_executable_commandr   $   sv   € ðä!Ÿ<™<¨Ó0Ð0ˆ<Ð0ØÐð 4ò 	 ˆCØ$˜I c UÐ+ˆKÜ!Ÿ<™<¨Ó4Ð4ˆxÑ4Ø’ð	 ð ˆøÜò ð Šðús!   ‚A ›"A ¾A ÁA ÁAÁAc                   ó�   — e Zd ZdZdej
                  e   fd„Zd„ Zde	dz  de	dz  de
dz  d	dfd
„Zd„ Zd„ Zdd„Zed	efd„«       Zy)ÚFallbackProcessa7  
    A fallback process wrapper for Windows to handle async I/O
    when using subprocess.Popen, which provides sync-only FileIO objects.

    This wraps stdin and stdout into async-compatible
    streams (FileReadStream, FileWriteStream),
    so that MCP clients expecting async streams can work properly.
    Ú	popen_objc                 ó\  — || _         |j                  | _        |j                  | _        |j
                  | _        | j                  r#t        t        t        | j                  «      «      nd | _        | j                  r)t        t        t        | j                  «      «      | _        y d | _        y )N)
ÚpopenÚstdinÚ	stdin_rawÚstdoutÚ
stdout_rawÚstderrr
   r   r   r	   )Úselfr   s     r   Ú__init__zFallbackProcess.__init__N   sr   € Ø.7ˆŒ
Ø"Ÿ™ˆŒØ#×*Ñ*ˆŒØ×&Ñ&ˆŒàHLÏÊ”_¤T¬(°D·N±NÓ%CÔDÐ\`ˆŒ
ØIMÏÊ”n¤T¬(°D·O±OÓ%DÓEˆ�Ð^bˆ�ó    c              ƒ   ó   K  — | S ­w)z$Support async context manager entry.© ©r#   s    r   Ú
__aenter__zFallbackProcess.__aenter__W   s   è ø€ àˆùs   ‚Úexc_typeNÚexc_valÚexc_tbr   c              ƒ   óL  K  — | j                   j                  «        t        j                  | j                   j                  «      ƒ d{  –—†  | j
                  r"| j
                  j                  «       ƒ d{  –—†  | j                  r"| j                  j                  «       ƒ d{  –—†  | j                  r| j                  j                  «        | j                  r| j                  j                  «        | j                  r| j                  j                  «        yy7 ŒÔ7 Œ¨7 Œ|­w)z3Terminate and wait on process exit inside a thread.N)r   Ú	terminater   Úrun_syncÚwaitr   Úacloser    r   Úcloser!   r"   )r#   r*   r+   r,   s       r   Ú	__aexit__zFallbackProcess.__aexit__[   sÉ   è ø€ ð 	�
‰
×ÑÔÜ× Ñ  §¡§¡Ó1×1Ð1ð �:Š:Ø—*‘*×#Ñ#Ó%×%Ð%Ø�;Š;Ø—+‘+×$Ñ$Ó&×&Ð&Ø�>Š>Ø�N‰N× Ñ Ô"Ø�?Š?Ø�O‰O×!Ñ!Ô#Ø�;Š;Ø�K‰K×ÑÕð ð 	2øð &øà&ús7   ‚AD$Á	DÁ
-D$Á7D Á8-D$Â%D"Â&A9D$Ä D$Ä"D$c              ƒ   óp   K  — t        j                  | j                  j                  «      ƒ d{  –—† S 7 Œ­w)z"Async wait for process completion.N)r   r/   r   r0   r(   s    r   r0   zFallbackProcess.waitq   s%   è ø€ ä×'Ñ'¨¯
©
¯©Ó8×8Ð8Ð8ús   ‚-6¯4°6c                 ó6   — | j                   j                  «       S )z%Terminate the subprocess immediately.)r   r.   r(   s    r   r.   zFallbackProcess.terminateu   s   € à�z‰z×#Ñ#Ó%Ð%r%   c                 ó$   — | j                  «        y)z6Kill the subprocess immediately (alias for terminate).N)r.   r(   s    r   ÚkillzFallbackProcess.killy   s   € à�‰Õr%   c                 ó.   — | j                   j                  S )zReturn the process ID.)r   Úpidr(   s    r   r9   zFallbackProcess.pid}   s   € ð �z‰z�~‰~Ðr%   )r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú
subprocessÚPopenÚbytesr$   r)   ÚBaseExceptionÚobjectr3   r0   r.   r7   ÚpropertyÚintr9   r'   r%   r   r   r   D   sˆ   „ ñðc *×"2Ñ"2°5Ñ"9ó còð à $Ñ&ð ð  Ñ%ð ð ˜‘ð	 ð
 
ó ò,9ò&óð ð�Sò ó ñr%   r   ÚargsÚenvÚerrlogÚcwdc              ƒ   óz  K  — t        «       }d}	 t        j                  | g|¢|t        t        d«      rt        j
                  nd||¬«      ƒ d{  –—† }t        ||«       |S 7 Œ# t        $ r t        | ||||«      ƒ d{  –—†7  }Y Œ3t        $ r( t        j                  | g|¢|||¬«      ƒ d{  –—†7  }Y Œbw xY w­w)a¦  
    Creates a subprocess in a Windows-compatible way with Job Object support.

    Attempt to use anyio's open_process for async subprocess creation.
    In some cases this will throw NotImplementedError on Windows, e.g.
    when using the SelectorEventLoop which does not support async subprocesses.
    In that case, we fall back to using subprocess.Popen.

    The process is automatically added to a Job Object to ensure all child
    processes are terminated when the parent is terminated.

    Args:
        command (str): The executable to run
        args (list[str]): List of command line arguments
        env (dict[str, str] | None): Environment variables
        errlog (TextIO | None): Where to send stderr output (defaults to sys.stderr)
        cwd (Path | str | None): Working directory for the subprocess

    Returns:
        Process | FallbackProcess: Async-compatible subprocess with stdin and stdout streams
    NÚCREATE_NO_WINDOWr   )rF   Úcreationflagsr"   rH   )rF   r"   rH   )
Ú_create_job_objectÚanyioÚopen_processÚhasattrr>   rJ   ÚNotImplementedErrorÚ _create_windows_fallback_processÚ	ExceptionÚ_maybe_assign_process_to_job)r   rE   rF   rG   rH   ÚjobÚprocesss          r   Úcreate_windows_processrV   ˆ   sÔ   è ø€ ô8 Ó
€CØ€Gð
ä×*Ñ*ØÐ�tÐØô ”zÐ#5Ô6ô %×5Ò5àØØô	
÷ 	
ˆô, ! ¨#Ô.Ø€Nð/	
ùô ò Zä8¸À$ÈÈVÐUXÓY×YÐYŠÜò 
ä×*Ñ*ØÐ�tÐØØØô	
÷ 
ð 
Šð
üs_   ‚B;�A A% ÁA#ÁA% ÁB;Á#A% Á%B8Â BÂB8ÂB;Â'B8Â/B2Â0B8Â5B;Â7B8Â8B;c              ƒ   ó`  K  — 	 t        j                  | g|¢t         j                  t         j                  |||dt        t         dd«      ¬«      }t        |«      S # t        $ rH t        j                  | g|¢t         j                  t         j                  |||d¬«      }Y t        |«      S w xY w­w)z©
    Create a subprocess using subprocess.Popen as a fallback when anyio fails.

    This function wraps the sync subprocess.Popen in an async-compatible interface.
    r   rJ   )r   r    r"   rF   rH   ÚbufsizerK   )r   r    r"   rF   rH   rX   )r>   r?   ÚPIPEÚgetattrrR   r   )r   rE   rF   rG   rH   r   s         r   rQ   rQ   Ã   s¬   è ø€ ð
ä×$Ñ$ØÐ�tÐÜ—/‘/Ü—?‘?ØØØØÜ!¤*Ð.@À!ÓDô	
ˆ	ô* ˜9Ó%Ð%øô ò 

ä×$Ñ$ØÐ�tÐÜ—/‘/Ü—?‘?ØØØØô
‰	ô ˜9Ó%Ð%ð

üs*   ‚B.„AA ÁB.ÁAB+ÂB.Â*B+Â+B.c                  ó’  — t         j                  dk7  st        sy	 t        j                  dd«      } t        j                  | t        j
                  «      }|d   dxx   t        j                  z  cc<   t        j                  | t        j
                  |«       | S # t        $ r"}t        j                  d|› �«       Y d}~yd}~ww xY w)zX
    Create a Windows Job Object configured to terminate all processes when closed.
    r   NÚ ÚBasicLimitInformationÚ
LimitFlagsz9Failed to create Job Object for process tree management: )ÚsysÚplatformÚwin32jobÚCreateJobObjectÚQueryInformationJobObjectÚ!JobObjectExtendedLimitInformationÚ"JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSEÚSetInformationJobObjectrR   ÚloggerÚwarning)rT   Úextended_infoÚes      r   rL   rL   é   s§   € ô ‡|�|�wÒ¥hØð	Ü×&Ñ& t¨RÓ0ˆÜ ×:Ñ:¸3Ä×@jÑ@jÓkˆàÐ-Ñ.¨|Ó<Ä×@kÑ@kÑkÓ<Ü×(Ñ(¨¬h×.XÑ.XÐZgÔhØˆ
øÜò Ü�‰ÐRÐSTÐRUÐVÔWÜûðús   œA>B Â	CÂ$CÃCrU   rT   c                 óB  — |syt         j                  dk7  st        rt        rt        sy	 t        j
                  t        j                  t        j                  z  d| j                  «      }|st        d«      ‚	 t	        j                  ||«       || _        t        j                  |«       y# t        j                  |«       w xY w# t        $ rO}t        j                  d| j                  › d|› �«       t        rt        j                  |«       Y d}~yY d}~yd}~ww xY w)zt
    Try to assign a process to a job object. If assignment fails
    for any reason, the job handle is closed.
    Nr   FzFailed to open process handlezFailed to assign process z to Job Object: )r_   r`   Úwin32apiÚwin32conra   ÚOpenProcessÚPROCESS_SET_QUOTAÚPROCESS_TERMINATEr9   rR   ÚAssignProcessToJobObjectÚ_job_objectÚCloseHandlerg   rh   )rU   rT   Úprocess_handlerj   s       r   rS   rS   ü   sã   € ñ
 Øä
‡|�|�wÒ¥hµhÅhØð&Ü!×-Ñ-Ü×&Ñ&¬×)CÑ)CÑCÀUÈGÏKÉKó
ˆñ ÜÐ;Ó<Ð<ð	1Ü×-Ñ-¨c°>ÔBØ"%ˆGÔä× Ñ  Õ0øŒH× Ñ  Õ0ûÜò &Ü�‰Ð2°7·;±;°-Ð?OÐPQÈsÐSÔTÝÜ× Ñ  ×%Ñ%ô ûð&ús1   «AC Á9B, ÂC Â,CÃC Ã	DÃA DÄDÚtimeout_secondsc              ƒ   ó¢  K  — t         j                  dk7  ryt        | dd«      }|r9t        r3	 t        j                  |d«       t        r	 t        j                  |«       	 | j                  «        y# t
        $ r Y Œ9w xY w# t
        $ r Y Œ,w xY w# t        r&	 t        j                  |«       w # t
        $ r Y w w xY ww xY w# t
        $ r Y yw xY w­w)aD  
    Terminate a process and all its children on Windows.

    If the process has an associated job object, it will be terminated.
    Otherwise, falls back to basic process termination.

    Args:
        process: The process to terminate
        timeout_seconds: Timeout in seconds before force killing (default: 2.0)
    r   Nrr   é   )	r_   r`   rZ   ra   ÚTerminateJobObjectrR   rl   rs   r.   )rU   ru   rT   s      r   Úterminate_windows_process_treery     sÑ   è ø€ ô ‡|�|�wÒØä
�'˜=¨$Ó
/€CÙ
�xð
	Ü×'Ñ'¨¨QÔ/õ
 ðÜ×(Ñ(¨Ô-ð
Ø×ÑÕøô ò 	áð	ûô !ò Ùðûõ ðÜ×(Ñ(¨Õ-øÜ ò Ùðúð ûô ò Ùðüsš   ‚*C­A1 ÁCÁ
B  Á C  Á0CÁ1	A=Á:B Á<A=Á=B Â 	BÂ	CÂBÂCÂB=ÂB-Â,B=Â-	B9Â6B=Â8B9Â9B=Â=CÃ 	CÃ	CÃCÃCz£terminate_windows_process is deprecated and will be removed in a future version. Process termination is now handled internally by the stdio_client context manager.c              ƒ   óô   K  — 	 | j                  «        t        j                  d«      5  | j                  «       ƒ d{  –—†  ddd«       y7 Œ# 1 sw Y   yxY w# t        $ r | j                  «        Y yw xY w­w)aB  
    Terminate a Windows process.

    Note: On Windows, terminating a process with process.terminate() doesn't
    always guarantee immediate process termination.
    So we give it 2s to exit, or we call process.kill()
    which sends a SIGKILL equivalent signal.

    Args:
        process: The process to terminate
    ç       @N)r.   rM   Ú
fail_afterr0   ÚTimeoutErrorr7   )rU   s    r   Úterminate_windows_processr~   <  sh   è ø€ ð Ø×ÑÔÜ×Ñ˜cÓ"ñ 	!Ø—,‘,“.× Ð ÷	!ð 	!Ø ø÷	!ð 	!ûäò à�‰Žðüs[   ‚A8„%A ©A½A¾AÁA Á
A8ÁAÁAÁA ÁA8ÁA ÁA5Á2A8Á4A5Á5A8)r{   )*r=   Úloggingr   r>   r_   Úpathlibr   Útypingr   r   r   rM   r   Ú	anyio.abcr   Úanyio.streams.filer	   r
   Útyping_extensionsr   Ú	getLoggerrg   r`   Ú
pywintypesrl   rm   ra   rD   Ú	JobHandleÚstrr   r   r"   ÚlistÚdictrV   rQ   rL   rS   Úfloatry   r~   r'   r%   r   ú<module>rŒ      sõ  ðñó Û Û Û 
Ý ß )Ñ )ã Ý Ý ß >Ý (à	ˆ×	Ñ	Ð/Ó	0€ð ‡<�<�7ÒÛÛÛÜð €HØ€HØ€HØ€Jà€	ð¨Cð °Có ÷@<ñ <ðN "&ØŸJ™JØ!ñ8Øð8à
ˆs‰)ð8ð 
ˆc�3ˆh‰˜$Ñ	ð8ð �T‰Mð	8ð
 
�‰�dÑ	ð8ð ˆÑó8ð| "&ØŸJ™JØ!ñ#&Øð#&à
ˆs‰)ð#&ð 
ˆc�3ˆh‰˜$Ñ	ð#&ð �T‰Mð	#&ð
 
�‰�dÑ	ð#&ð ó#&ðL˜C $™Jó ð&&¨'°OÑ*Cð &È)ÐVZÑJZð &Ð_có &ñ: °'¸OÑ2Kð  Ð^cð  Ðnró  ñF ðYóð¨W°Ñ-Fò ó	ñr%   