
    lKj|                       d Z ddlmZ ddlZddlmZmZ ddlmZ e G d d             Z	e G d d	             Z
e G d
 d             Ze G d d             Z ed      j                         Zedz  ZddZddZddZddZddZy)z8Configuration loading and merge utilities for macos-mcp.    )annotationsN)	dataclassfield)Pathc                  p    e Zd ZU dZded<   dZded<   dZded<   d	Zd
ed<   dZded<   dZ	ded<   dZ
ded<   y)ServerConfigstdiostr	transport	localhosthosti@  intportFboolallow_insecure_remoteN
str | Noneauth_keyssl_certfilessl_keyfile)__name__
__module____qualname__r   __annotations__r   r   r   r   r   r        p/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/macos_mcp/infrastructure/config.pyr   r   
   sI    IsD#D#"'4'Hj#L*#"K"r   r   c                  F    e Zd ZU  ee      Zded<   dZded<   dZded<   y)SecurityConfigdefault_factory	list[str]ip_allowlistNr   oauth_client_idoauth_client_secret)	r   r   r   r   listr"   r   r#   r$   r   r   r   r   r      s&    #D9L)9"&OZ&&**r   r   c                  *    e Zd ZU  ee      Zded<   y)ToolsConfigr   r!   excludeN)r   r   r   r   r%   r(   r   r   r   r   r'   r'      s    t4GY4r   r'   c                  p    e Zd ZU  ee      Zded<    ee      Zded<    ee	      Z
ded<   dZd	ed
<   y)MacOSMCPConfigr   r   serverr   securityr'   toolsNPath | Nonesource_path)r   r   r   r   r   r+   r   r   r,   r'   r-   r/   r   r   r   r*   r*   !   s9     >FL>$^DHnD{;E;;#K#r   r*   z~/.macos-mcpzconfig.tomlc                n    | rt        |       j                         S t        j                         rt        S y)zGFind config path using precedence: explicit > ~/.macos-mcp/config.toml.N)r   
expanduserCONFIG_FILEexists)explicit_paths    r   discover_config_pathr5   -   s.    M"--//r   c                n    | g S t        | t              rt        d | D              st        | d      | S )Nc              3  <   K   | ]  }t        |t                y w)N)
isinstancer
   ).0is     r   	<genexpr>z#_list_of_strings.<locals>.<genexpr>;   s     +L1Jq#,>s   z must be an array of strings)r8   r%   all
ValueErrorrawkeys     r   _list_of_stringsrA   8   s;    
{	c4 +L+L(LC5 <=>>Jr   c                l    t        | t              r| S t        | dt        |       j                         )Nz must be a TOML boolean, not )r8   r   r=   typer   r>   s     r   _strict_boolrD   @   s3    #t

u9$s):L:L9MN
OOr   c                   t               }| |S | j                         st        d|        t        j                  | j                  d            }|j                  di       }|j                  di       }h d}d|v r4t        |d         }||vrt        d	| d
|      ||j                  _
        d|v rt        |d         |j                  _        d|v rt        |d         |j                  _        d|v rt        |d   d      |j                  _        d|v r!t        |d         xs d|j                  _        d|v rKt        |d         xs d}|r7| j"                  |z  j%                         }t        |      |j                  _        d|v rKt        |d         xs d}|r7| j"                  |z  j%                         }t        |      |j                  _        d|v rt+        |d   d      |j,                  _        d|v r!t        |d         xs d|j,                  _        d|v r!t        |d         xs d|j,                  _        |j                  di       }	d|	v rt+        |	d   d      |j4                  _        | |_        |S )zGLoad and validate TOML config file. Returns defaults when path is None.NzConfig file not found: utf-8encodingr+   r,   >   streamable-httpsser	   r   z server.transport must be one of z, got r   r   r   zserver.allow_insecure_remoter   r   r   r"   zsecurity.ip_allowlistr#   r$   r-   r(   ztools.exclude)r*   r3   FileNotFoundErrortomllibloads	read_textgetr
   r=   r+   r   r   r   r   rD   r   r   parentresolver   r   rA   r,   r"   r#   r$   r-   r(   r/   )
pathcfgdatar+   r,   _VALID_TRANSPORTStr?   resolvedr-   s
             r   load_configrX   F   sm   

C|
;;="9$ @AA==9:DXXh#Fxx
B'H;f{#$%%?@Q?RRXYZX]^__ 

fVn-

fVn-

&(+7*+-K,


( V!&"45=

&()1Tc)224H&)(mCJJ#&'(0Dc)224H%(]CJJ"!$4Xn5MOf$g!H$'*84E+F'G'O4$(+.x8M/N+O+WSW(HHWb!EE,U9-=O		COJr   c                ,   g }| j                   t               }}g }|j                  |j                  k7  r|j                  d|j                   d       |j                  |j                  k7  r|j                  d|j                   d       |j
                  |j
                  k7  r|j                  d|j
                          |j                  r|j                  d       |j                  r|j                  d|j                   d       |j                  r|j                  d|j                   d       |j                  r|j                  d|j                   d       |r|d	g|z   d
gz   z  }| j                  }g }|j                  r7dj                  d |j                  D              }|j                  d| d       |j                  r|j                  d|j                   d       |j                  r|j                  d|j                   d       |r|dg|z   d
gz   z  }| j                  j                   r8dj                  d | j                  j                   D              }|dd| dd
gz  }|j#                  dj                  |      d       y)zCSerialize *cfg* to TOML at *path*, writing only non-default values.ztransport = ""zhost = "zport = zallow_insecure_remote = truezauth_key = "zssl_certfile = "zssl_keyfile = "z[server] z, c              3  (   K   | ]
  }d | d   ywrZ   Nr   )r9   ips     r   r;   zwrite_config.<locals>.<genexpr>   s     ?.>AbT).>   zip_allowlist = []zoauth_client_id = "zoauth_client_secret = "z
[security]c              3  (   K   | ]
  }d | d   ywr]   r   )r9   rV   s     r   r;   zwrite_config.<locals>.<genexpr>   s     >,=qAaS(,=r_   z[tools]zexclude = [
rF   rG   N)r+   r   r   appendr   r   r   r   r   r   r,   r"   joinr#   r$   r-   r(   
write_text)	rS   rR   linessdddserver_linessec	sec_linesitemss	            r   write_configrm   ~   sH   EZZB L	||r||#mBLL>;<	ww"''hrwwiq12	ww"''gbggY/0	:;	{{l2;;-q9:	.r.?qAB	~~obnn-=Q?@*,t33
,,CI
		?c.>.>??+E7!45
.s/B/B.C1EF
233J3J2K1MN,)+rd22
yy		>CII,=,=>>){5'3R88OODIIe$wO7r   )r4   r   returnr.   )r?   objectr@   r
   rn   r!   )r?   ro   r@   r
   rn   r   )rR   r.   rn   r*   )rS   r*   rR   r   rn   None)__doc__
__future__r   rL   dataclassesr   r   pathlibr   r   r   r'   r*   r1   
CONFIG_DIRr2   r5   rA   rD   rX   rm   r   r   r   <module>rv      s    > "  (  # # # + + + 5 5 5 $ $ $ .!,,.
=(P5p'8r   