
    i2.              	          U d Z ddlZddlmZ ddlmZmZmZ ddlm	Z	 ddl
Z
 e	d       G d d	             Z e	d       G d
 d             Z e	d       G d d             Z e	d       G d d             Zi aeeef   ed<   daeed<   d7dee   ddfdZd7dedee   dee   fdZdefdZdefdZdefdZdefdZdee   fdZdee   fdZdee   fdZdee   fd Zd8d!edeeef   fd"Zd9d#Ze d$k(  rYddl!Z! e"e!jF                        d%kD  r7e!jF                  d%   Z$e$d&k(  r e        ye$d'k(  r e       Z% e&e%jO                               Z(e(r e)d(        e!jT                  d       ye%jW                         D  cg c]
  \  } }|r	|  c}} Z, e)d)d*j[                  e,               e!jT                  d%       ye$d+k(  r< e       Z. e)d,e.j^                   d-e.j`                   d.e.jb                  rd/nd0 d1       ye$d2k(  r/ e       Z. e)d3e.jd                   d4e.jf                  rd/nd0 d1       y e)d5e$         e)d6       y e        yyc c}} w ):a  
Genesis Secrets Loader
======================
Secure credential management for Genesis memory system.

Priority Order:
1. Environment variables (production)
2. secrets.env file (development)
3. Default to None (fail safely)

NEVER commit actual credentials to source code.

Usage:
    from secrets_loader import get_redis_config, get_qdrant_config

    redis = get_redis_config()
    qdrant = get_qdrant_config()
    N)Path)OptionalDictAny)	dataclassT)frozenc                   p    e Zd ZU dZeed<   eed<   ee   ed<   dZe	ed<   e
de	fd       Zdeeef   fd	Zy
)RedisConfigzRedis connection configuration.hostportpasswordFsslreturnc                 H    t        | j                  xr | j                        S )z&Check if Redis is properly configured.boolr   r   selfs    ,/mnt/e/genesis-system/core/secrets_loader.pyis_configuredzRedisConfig.is_configured#        DII+$)),,    c                 `    | j                   | j                  | j                  | j                  dS )2Convert to dictionary for backwards compatibility.r   r   r   r   r   r   s    r   to_dictzRedisConfig.to_dict(   s*     IIII88	
 	
r   N)__name__
__module____qualname____doc__str__annotations__intr   r   r   propertyr   r   r   r    r   r   r
   r
      sP    )
I
IsmC-t - -
c3h 
r   r
   c                       e Zd ZU dZeed<   eed<   ee   ed<   dZeed<   dZ	e
ed<   ed	e
fd
       Zed	efd       Zd	eeef   fdZy)QdrantConfigz%Qdrant vector database configuration.r   r   api_keygenesis_memoriescollection_nameT	use_httpsr   c                 H    t        | j                  xr | j                        S )z'Check if Qdrant is properly configured.r   r   s    r   r   zQdrantConfig.is_configured;   r   r   c                 ^    | j                   rdnd}| d| j                   d| j                   S )z#Get full URL for Qdrant connection.httpshttpz://:)r+   r   r   )r   protocols     r   urlzQdrantConfig.url@   s0     #nn7&3tyyk499+66r   c                 v    | j                   | j                  | j                  | j                  | j                  dS )r   r   r   r(   r*   r2   r4   r   s    r   r   zQdrantConfig.to_dictF   s3     IIII||#3388
 	
r   N)r   r   r   r    r!   r"   r#   r   r*   r+   r   r$   r   r2   r   r   r   r%   r   r   r'   r'   2   su    /
I
Ic]-OS-It-t - - 7S 7 7

c3h 
r   r'   c                   t    e Zd ZU dZeed<   eed<   eed<   eed<   eed<   dZeed<   ed	e	fd
       Z
d	efdZy)PostgresConfigz$PostgreSQL connection configuration.r   r   userr   dbnamerequiresslmoder   c                     t        | j                  | j                  | j                  | j                  | j
                  g      S )z+Check if PostgreSQL is properly configured.)allr   r   r7   r   r8   r   s    r   r   zPostgresConfig.is_configured[   s.     DIItyy$))T]]DKKPQQr   c                     d| j                    d| j                   d| j                   d| j                   d| j                   d| j
                   dS )z!Return a DSN string for psycopg2.zdbname='z' user='z' host='z' password='z' port='z' sslmode='')r8   r7   r   r   r   r:   r   s    r   to_dsnzPostgresConfig.to_dsn`   st    $++htyyk$))LY]YfYfXggoptpypyoz  {F  GK  GS  GS  FT  TU  V  	Vr   N)r   r   r   r    r!   r"   r#   r:   r$   r   r   r?   r%   r   r   r6   r6   Q   sR    .
I
I
IMKGSRt R RV Vr   r6   c                   H    e Zd ZU dZee   ed<   ee   ed<   edefd       Z	y)	MCPConfigz+MCP (Model Context Protocol) configuration.endpointr(   r   c                 ,    t        | j                        S )z$Check if MCP is properly configured.)r   rB   r   s    r   r   zMCPConfig.is_configuredk   s     DMM""r   N)
r   r   r   r    r   r!   r"   r$   r   r   r%   r   r   rA   rA   e   s2    5smc]#t # #r   rA   
_env_cacheF_env_loadedenv_pathr   c                    t         ry| t        d      t        d      t        j                         dz  dz  t        j                         dz  g}|D ]  }|s|j	                         s	 t        |d      5 }|D ]  }|j                         }|r|j                  d      r'd|v s,|j                  d      \  }}}|j                         }|j                         }|j                  d	      r|j                  d	      r|d
d }n'|j                  d      r|j                  d      r|d
d }|t        |<    	 ddd       t        d|         da y da y# 1 sw Y   xY w# t        $ r&}t        j                  d| d|        Y d}~7d}~ww xY w)z`
    Load environment variables from secrets.env file.
    Only loads once, caches results.
    Nz(/mnt/e/genesis-system/config/secrets.envz$E:/genesis-system/config/secrets.envz.genesiszsecrets.envr#="   r>   z[OK] Secrets loaded from: zFailed to load secrets from z: T)rE   r   homecwdexistsopenstrip
startswith	partitionendswithrD   print	Exceptionwarningswarn)	rF   search_pathspathflinekey_valuees	            r   _load_env_filerb   v   s     	7834		j =0
]"L  JDKKMJ$_ 4 ! 4#zz|#ts';$$;,0NN3,?MCE"%))+C$)KKME$//49L(-a!&!1!1#!65>>#;N(-a.3JsO44" 24&9: K3J2 K-4 4&  J <TF"QCHIIJs7   (E4.E#BE3EE	E	F&FFr^   defaultc                     t         j                  j                  |       }|r|S t                t        j                  |       }|r|S |S )zs
    Get environment variable with fallback to env file.
    Priority: OS env var > secrets.env file > default
    )osenvirongetrb   rD   )r^   rc   r`   s      r   _get_envrh      sA     JJNN3E NN3ENr   c                     t        dd      } t        dd      }t        d      }t        dd      }	 t        |      }|j                         dv }t        | |||      S # t        $ r d}t        j                  d	| d
       Y Gw xY w)am  
    Get Redis configuration from environment.

    Environment Variables:
        GENESIS_REDIS_HOST: Redis host (default: localhost)
        GENESIS_REDIS_PORT: Redis port (default: 6379)
        GENESIS_REDIS_PASSWORD: Redis password (optional)
        GENESIS_REDIS_SSL: Use SSL (default: false)

    Returns:
        RedisConfig with connection parameters
    GENESIS_REDIS_HOST	localhostGENESIS_REDIS_PORT6379GENESIS_REDIS_PASSWORDGENESIS_REDIS_SSLfalsei  zInvalid GENESIS_REDIS_PORT 'z', using 6379true1yesr   )rh   r#   
ValueErrorrX   rY   lowerr
   )r   port_strr   ssl_strr   r   s         r   get_redis_configry      s     (+6D,f5H01H*G4GN8}
 --/1
1C	   N4XJmLMNs   A $BBc                  (   t        dd      } t        dd      }t        d      }t        dd      }t        dd	      }	 t        |      }|j                         dv }t        | ||||      S # t        $ r d
}t        j                  d| d       Y Hw xY w)a  
    Get Qdrant configuration from environment.

    Environment Variables:
        GENESIS_QDRANT_HOST: Qdrant host
        GENESIS_QDRANT_PORT: Qdrant port (default: 6333)
        GENESIS_QDRANT_API_KEY: Qdrant API key (optional)
        GENESIS_QDRANT_COLLECTION: Collection name (default: genesis_memories)
        GENESIS_QDRANT_HTTPS: Use HTTPS (default: true)

    Returns:
        QdrantConfig with connection parameters
    GENESIS_QDRANT_HOST GENESIS_QDRANT_PORT6333GENESIS_QDRANT_API_KEYGENESIS_QDRANT_COLLECTIONr)   GENESIS_QDRANT_HTTPSrr   i  zInvalid GENESIS_QDRANT_PORT 'z', using 6333rq   )r   r   r(   r*   r+   )rh   r#   ru   rX   rY   rv   r'   )r   rw   r(   
collection	https_strr   r+   s          r   get_qdrant_configr      s     )2.D-v6H/0G57IJJ/8IO8}
 !%99I"   O5hZ}MNOs   A* *$BBc                  ,   t        dd      } t        dd      }t        dd      }t        dd      }t        dd      }t        dd	      }	 t        |      }t        | |||||      S # t        t        f$ r d
}t	        j
                  d| d       Y =w xY w)z
    Get PostgreSQL configuration from environment.

    Environment Variables:
        GENESIS_PG_HOST
        GENESIS_PG_PORT
        GENESIS_PG_USER
        GENESIS_PG_PASSWORD
        GENESIS_PG_DB
        GENESIS_PG_SSLMODE (default: require)
    GENESIS_PG_HOSTr|   GENESIS_PG_PORT5432GENESIS_PG_USERGENESIS_PG_PASSWORDGENESIS_PG_DBGENESIS_PG_SSLMODEr9   i8  zInvalid GENESIS_PG_PORT 'z', using 5432)r   r   r7   r   r8   r:   )rh   r#   ru   	TypeErrorrX   rY   r6   )r   rw   r7   r   r8   r:   r   s          r   get_postgres_configr      s     %r*D)62H%r*D-r2Hor*F+Y7GK8}
  	 	" K1(=IJKs   
A& &*BBc                  H    t        d      } t        d      }t        | |      S )z
    Get MCP configuration from environment.

    Environment Variables:
        GENESIS_MCP_ENDPOINT: MCP server endpoint
        GENESIS_MCP_API_KEY: MCP API key (optional)

    Returns:
        MCPConfig with connection parameters
    GENESIS_MCP_ENDPOINTGENESIS_MCP_API_KEYrB   r(   )rh   rA   r   s     r   get_mcp_configr   "  s'     ./H,-Gh88r   c                      t        d      S )z$Get Anthropic API key for LLM calls.ANTHROPIC_API_KEYrh   r%   r   r   get_anthropic_api_keyr   3  s    '((r   c                      t        d      S )z+Get OpenAI API key for embeddings/fallback.OPENAI_API_KEYr   r%   r   r   get_openai_api_keyr   8      $%%r   c                  2    t        d      xs t        d      S )zGet Gemini API key.GEMINI_API_KEYGOOGLE_API_KEYr   r%   r   r   get_gemini_api_keyr   <  s    $%C2B)CCr   c                      t        d      S )zGet Telnyx API key.TELNYX_API_KEYr   r%   r   r   get_telnyx_api_keyr   A  r   r   require_allc           	         t               }t               }t               }t        |j                  xr |j                  dk7        t        |j
                        t        |j                        t        |j                        t        |j                        t        t                     d}| r.t        t                     |d<   t        |j                        |d<   |S )z
    Validate that required secrets are configured.

    Args:
        require_all: If True, check all secrets. If False, only core ones.

    Returns:
        Dict mapping secret name to availability status
    rk   )
redis_hostredis_passwordqdrant_hostqdrant_api_keymcp_endpointanthropic_api_keyopenai_api_keymcp_api_key)
ry   r   r   r   r   r   r(   rB   r   r   )r   redisqdrantmcpstatuss        r   validate_secretsr   F  s     E F

C 5::C%***CDu~~.FKK(v~~.S\\*!"7"9:F #'(:(<#=  $S[[ 1}Mr   c                  @   t        d      } t        d       | j                         D ]  \  }}|rdnd}t        d| d|         t        d | j	                         D              }t        |       }t        d	| d
|        |dk  rt        d       t        d       yy)zCPrint current secrets configuration status (safe, no values shown).T)r   z
=== Genesis Secrets Status ===u   ✓u   ✗z   c              3   &   K   | ]	  }|sd   yw)rL   Nr%   ).0vs     r   	<genexpr>z'print_secrets_status.<locals>.<genexpr>m  s     511Q5s   z
Configured: /   zP
[!] Some core secrets missing. Create secrets.env or set environment variables.z:    See: /mnt/e/genesis-system/config/secrets.env.templateN)r   rV   itemssumvalueslen)r   r^   	availableicon
configuredtotals         r   print_secrets_statusr   d  s    $/F	
,- ,,. !Y!uu4&# ! 555JKE	N:,aw
/0A~abJK r   __main__rL   r   validatez [OK] All core secrets configuredz[!] Missing secrets: z, z
test-rediszRedis: r0   z (password: setnone)ztest-qdrantzQdrant: z (key: zUnknown command: zHUsage: python secrets_loader.py [status|validate|test-redis|test-qdrant])N)F)r   N)4r    re   pathlibr   typingr   r   r   dataclassesr   rX   r
   r'   r6   rA   rD   r!   r"   rE   r   rb   rh   ry   r   r   r   r   r   r   r   r   r   r   sysr   argvcmdr   r<   r   all_okrV   exitr   missingjoinconfigr   r   r   r2   r(   )kr   s   00r   <module>r      s  & 
  & & !  $
 
 
, $
 
 
< $V V V& $# # #  
DcN T ,Xd^ ,t ,^#  # &+ D"< "J ^  F9	 9")x} )
&HSM &DHSM D
&HSM &
$ 4T	? <L& z
388}qhhqk(? "J%'F)F89)/AAq1A-dii.@-ABCL %'FGFKK=&++lFOO5agBhhijkM!&(FHVZZLV/TTUVW %cU+,\]A   Bs   
II