
    Cj                    2   % S r SSKJr  SSKrSSKrSSKrSSKrSSKJr  SSK	J
r
Jr  SSKJrJr  SSKJr  \
(       a  SSKJr  \R&                  " \5      r\R,                  " 5       S	-  S
-  rS\S'   SqS\S'   SqS\S'   SS jrSS jrSS jrSS jrSS jrg)z7Settings loader, override switch, and disk persistence.    )annotationsN)Path)TYPE_CHECKINGAny)AliasChoices	BaseModel)Settings)	FieldInfoz.strixzcli-config.jsonr   _DEFAULT_PATHzPath | None	_overridezSettings | None_cachedc            
        [         cs  [        =(       d    [        n [        U 5      n[	        S0 UD6q [
        R                  S[        SLU R                  5       [        S UR                  5        5       5      5        [         $ )zResolve settings from env + JSON file + defaults. Memoized.

Precedence: env vars win, then the JSON file, then field defaults.
NzAload_settings: resolved (override=%s, file_used=%s, json_keys=%d)c              3  8   #    U  H  n[        U5      v   M     g 7fN)len).0vs     e/home/rurouni/.local/share/pipx/venvs/strix-agent/lib/python3.13/site-packages/strix/config/loader.py	<genexpr> load_settings.<locals>.<genexpr>+   s     5 41A 4s    )
r   r   r   _read_json_overridesr	   loggerdebugexistssumvalues)source_pathinit_kwargss     r   load_settingsr       sk     0=&:;&G)[)OT! 5 2 2 455		
 N    c                8    U q Sq[        R                  SU 5        g)z<Switch the JSON source to ``path`` and invalidate the cache.Nzconfig override applied: %s)r   r   r   info)paths    r   apply_config_overrider%   0   s     IG
KK-t4r!   c                    [        5       n [        =(       d    [        nUR                  R	                  SSS9  0 nU R
                   H  n[        X5      n[        U[        5      (       d  M%  [        U5      R
                  R                  5        H^  n[        U5       HL  n[        R                  R                  UR                  5       5      nU(       d  M9  XrUR                  5       '     M\     M`     M     UR!                  ["        R$                  " SU0SS9SS9  [&        R(                  " [*        5         UR-                  S5        S	S	S	5        g	! , (       d  f       g	= f)
z?Write currently-set env vars to the active config file (0o600).T)parentsexist_okenv   )indentutf-8encodingi  N)r    r   r   parentmkdirmodel_fieldsgetattr
isinstancer   typer   _aliases_forosenvirongetupper
write_textjsondumps
contextlibsuppressOSErrorchmod)starget	env_blocksub_name	sub_modelfinfoaliasvalues           r   persist_currentrI   8   s    A'-F
MMt4 "INNA(	)Y//)_1188:E%e,

u{{}55/4ekkm,	 - ;	 # djj%!3A>Q			W	%U 
&	%	%s   3E
Ec                8   / nU R                   (       a  UR                  U R                   5        U R                  n[        U[        5      (       a$  UR                  S UR                   5       5        U$ [        U[        5      (       a  UR                  U5        U$ )z:Collect every env-var name that should populate ``finfo``.c              3  T   #    U  H  n[        U[        5      (       d  M  Uv   M      g 7fr   )r3   str)r   cs     r   r   _aliases_for.<locals>.<genexpr>V   s     C*Q
1c0Bqq*s   (	()rG   appendvalidation_aliasr3   r   extendchoicesrL   )rF   aliasesvas      r   r5   r5   O   ss    G{{u{{#			B"l##C"**CC N 
B		rNr!   c                x   U R                  5       (       d  0 $  [        R                  " U R                  SS95      n[        U[        5      (       a  UR                  S0 5      O0 n[        U[        5      (       d  0 $ UR                  5        VVs0 s H  u  p4[        U5      R                  5       U_M!     nnn0 n[        R                  R                  5        H  u  pxUR                  n	[        U	[        5      (       a  [!        U	["        5      (       d  M=  0 n
U	R                  R                  5        HL  u  p[%        U5       H8  nUR                  5       nU[&        R(                  ;   a    M:  X;   d  M1  X^   X'     MJ     MN     U
(       d  M  XU'   M     U$ ! [        R                  [
        4 a    0 s $ f = fs  snnf )zRead ``{"env": {...}}`` from ``path`` and remap to nested kwargs.

Only includes keys whose env var is NOT already set, so env always
wins over the persisted file.
r,   r-   r)   )r   r;   loads	read_textJSONDecodeErrorr?   r3   dictr8   itemsrL   r9   r	   r1   
annotationr4   
issubclassr   r5   r6   r7   )r$   datarC   kr   env_block_uppernestedrD   	sub_finfosub_clssub_datafnamerF   rG   keys                  r   r   r   \   sr    ;;==	zz$..'.:; (2$'='=#2Ii&&	5>__5FG5FTQs1v||~q(5FOG(*F'44::<&&7D))j).L.L#%#00668LE%e,kkm"**$)&5&:HO - 9 8'8  = M1   '* 	 Hs   #F &F6F32F3)returnr	   )r$   r   rf   None)rf   rg   )rF   r
   rf   z	list[str])r$   r   rf   zdict[str, dict[str, Any]]) __doc__
__future__r   r=   r;   loggingr6   pathlibr   typingr   r   pydanticr   r   strix.config.settingsr	   pydantic.fieldsr
   	getLogger__name__r   homer   __annotations__r   r   r    r%   rI   r5   r   r   r!   r   <module>rt      s    = "    	  % , * ) 
		8	$ iikH,/@@t @	;  &5.
"r!   