
    kKj                      r   d 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mZ ddlmZ dd	lmZ dd
lmZ  ee      Z ej0                  d      ZdedefdZdedeeef   fdZdededz  dee   dz  dee   dz  dedz  deeedz  eee   eeef   dz  f   fdZ dedede!fdZ"y)z&Shared utilities for install commands.    N)Path)urlparse)dotenv_values)ValidationError)print)
get_logger)MCPServerConfig)FileSystemSourcez^[\w\-. ]+$namereturnc                 x    t         j                  |       s$t        d|  d       t        j                  d       | S )zValidate that a server name is safe for use as a subprocess argument.

    Raises SystemExit if the name contains shell metacharacters.
    z [red]Invalid server name '[bold]z`[/bold]': names may only contain letters, numbers, hyphens, underscores, dots, and spaces.[/red]   )_SAFE_NAME_REmatchr   sysexit)r   s    k/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/fastmcp/cli/install/shared.pyvalidate_server_namer      s?    
 t$.tf 5e e	
 	K    env_varc                 $   d| vr$t        d|  d       t        j                  d       | j                  dd      \  }}|j	                         s$t        d|  d       t        j                  d       |j	                         |j	                         fS )z6Parse environment variable string in format KEY=VALUE.=z1[red]Invalid environment variable format: '[bold]z![/bold]'. Must be KEY=VALUE[/red]r   z#[/bold]'. KEY cannot be empty[/red])r   r   r   splitstrip)r   keyvalues      r   parse_env_varr   *   s    
'?yHij	
 	sA&JC99;?yHkl	
 	99;%%r   server_specserver_namewith_packagesenv_varsenv_filec                   K   |xs g }|xs g }d}d}| j                  d      rt        |       j                         }|j                         s$t	        d| d       t        j                  d       	 t        |      5 }t        j                  |      }ddd       dv r!t	        d       t        j                  d       nat        j                  |      }|j                  j                  r6t        |j                  j                        }	t        t        ||	z               }nt%        | 	      }t        |
      }t        |j&                  j(                        j+                         }|j-                         s ||j.                  |z  j                         }n|j                         }t1        |      |j&                  _        t3        |j&                  d      r|j&                  j4                  nd}t6        j9                  dt1        |      |||d       |j;                         s$t	        d| d       t        j                  d       |}d}|s/	 |j&                  j=                          d{   }|j>                  }d}|s|rRi }|r4	 |tI        |      jK                         D ci c]  \  }}|	|| c}}z  }|D ]  }tO        |      \  }}|||<    |||||fS # 1 sw Y   KxY w# t        j                   t"        f$ r/}
t	        d|
 d       t        j                  d       Y d}
~
d}
~
ww xY w7 # t@        tB        tD        f$ r9}
t6        j9                  ddt1        |
      i       |jF                  }Y d}
~
d}
~
ww xY wc c}}w # tL        $ r/}
t	        d|
 d       t        j                  d       Y d}
~
d}
~
ww xY ww)zProcess common arguments shared by all install commands.

    Handles both fastmcp.json config files and traditional file.py:object syntax.
    Nz.jsonz#[red]Configuration file not found: z[/red]r   
mcpServersz=[red]MCPConfig files are not supported for installation[/red]z![red]Invalid configuration file: )path)source
entrypointzInstalling server)filer   server_objectr    )extraz[red]Server file not found: zFCould not import server (likely missing dependencies), using file nameerrorz[red]Failed to load .env file: )(endswithr   resolveexistsr   r   r   openjsonloadr	   	from_fileenvironmentdependencieslistsetJSONDecodeErrorr   r
   r&   r%   
expanduseris_absoluteparentstrhasattrr'   loggerdebugis_fileload_serverr   ImportErrorModuleNotFoundError
SystemExitstemr   items	Exceptionr   )r   r   r    r!   r"   configconfig_pathfdataconfig_packageser&   source_pathr(   r)   r   serverenv_dictkvr   r   r   s                          r   process_common_argsrR   :   sl     "'RM~2HF#KG$;'//1!!#7}FKLHHQK	k"ayy| # t#UV )22;? %%22&*6+=+=+J+J&KO$(]_-L)M$NM "{3 / v}}))*557K""$)@""[099;""$TFMM$+FMM<$H  d  LLI&**	
   <<>,TF&9:
 DF	!==4466F;;D '+H8%28%<%B%B%D%DTQAqD%D   G&w/JC!HSM   mX==s #"" $$o6 	5aS?@HHQKK	X 70*= 	LLXA'   99D	  7s&ABs   A/O2K) =KBK) !D-OL6 ,L4-L6 =
ON %
N0N5N ;!OK&!K) )L1$L,&O,L11O4L6 6N
.M>8O>NON 	O$N?9O?OOurlexpected_schemec                   t        |       }|j                  |k7  r&t        j                  d|j                   d|        y	 t        j
                  dk(  rt        j                  d| gdd       yt        j
                  dk(  rt        j                  |        yt        j                  d	| gdd       y# t        j                  t        t        f$ r Y yw xY w)
a  Attempt to open a deeplink URL using the system's default handler.

    Args:
        url: The deeplink URL to open.
        expected_scheme: The URL scheme to validate (e.g. "cursor", "goose").

    Returns:
        True if the command succeeded, False otherwise.
    zInvalid deeplink scheme: z, expected Fdarwinr/   T)checkcapture_outputwin32zxdg-open)r   schemer=   warningr   platform
subprocessrunos	startfileCalledProcessErrorFileNotFoundErrorOSError)rS   rT   parseds      r   open_deeplinkre      s     c]F}}''k/ARS	
 	<<8#NNFC=TJ
 	 \\W$LL  NNJ,DN))+<gF s   -B4 0(B4 B4 4CC)#__doc__r0   r_   rer]   r   pathlibr   urllib.parser   dotenvr   pydanticr   richr   fastmcp.utilities.loggingr   #fastmcp.utilities.mcp_server_configr	   9fastmcp.utilities.mcp_server_config.v1.sources.filesystemr
   __name__r=   compiler   r;   r   tupler   r5   dictrR   boolre    r   r   <module>rv      s   ,  	 	  
  !   $  0 ? V	H	 

>*s s &3 &5c? & q>q>tq> 9t#q> 3i$	q>
 Tkq> 4tS$s)T#s(^d-BBCq>hs   r   