§
    ‰eîi  ã                  ó”   — U d Z ddlmZ ddlZddlZddlmZ ddlmZ dZ	 e
¦   «         Zded<   ddd„Zd d„Zd!d„Zd"d„Zdddœd#d„ZdS )$zFHelpers for loading Hermes .env files consistently across entrypoints.é    )ÚannotationsN)ÚPath)Úload_dotenv)Ú_API_KEYÚ_TOKENÚ_SECRETÚ_KEYzset[str]Ú_WARNED_KEYSé   ÚvalueÚstrÚlimitÚintÚreturnc                ó  — g }| D ]s}t          |¦  «        dk    r^dt          |¦  «        d›�}|                     ¦   «         r	|d|›d�z  }||vr|                     |¦  «         t          |¦  «        |k    r nŒtd                     |¦  «        S )zEReturn a compact 'U+XXXX ('c'), ...' summary of non-ASCII codepoints.é   zU+Ú04Xú (ú)z, )ÚordÚisprintableÚappendÚlenÚjoin)r   r   ÚseenÚchÚlabels        ú7/home/div/.hermes/hermes-agent/hermes_cli/env_loader.pyÚ_format_offending_charsr      s£   € à€DØð ð ˆÝˆr‰7Œ7�SŠ=ˆ=Ø&�˜R™œÐ&Ð&Ð&ˆEØ�~Š~ÑÔð &Ø˜˜b˜˜˜Ñ%�Ø˜DÐ Ð Ø—’˜EÑ"Ô"Ð"Ý�4‰yŒy˜EÒ!Ð!Ø�øØ�9Š9�T‰?Œ?Ðó    ÚNonec                 ó®  ‡— t          t          j                             ¦   «         ¦  «        D �]&\  Š} t	          ˆfd„t
          D ¦   «         ¦  «        sŒ'	 |                      d¦  «         Œ># t          $ r Y nw xY w|                      dd¬¦  «                             d¦  «        }|t          j        ‰<   ‰t          v rŒ‘t           
                    ‰¦  «         t          | ¦  «        t          |¦  «        z
  }t          | ¦  «        pd}t          d‰› d|› d|d	k    rd
nd› d|› d�	t          j        ¬¦  «         t          dt          j        ¬¦  «         �Œ(dS )a!  Strip non-ASCII characters from credential env vars in os.environ.

    Called after dotenv loads so the rest of the codebase never sees
    non-ASCII API keys.  Only touches env vars whose names end with
    known credential suffixes (``_API_KEY``, ``_TOKEN``, etc.).

    Emits a one-line warning to stderr when characters are stripped.
    Silent stripping would mask copy-paste corruption (Unicode lookalike
    glyphs from PDFs / rich-text editors, ZWSP from web pages) as opaque
    provider-side "invalid API key" errors (see #6843).
    c              3  óB   •K  — | ]}‰                      |¦  «        V — Œd S )N)Úendswith)Ú.0ÚsuffixÚkeys     €r   ú	<genexpr>z/_sanitize_loaded_credentials.<locals>.<genexpr>4   s/   øè è € ÐKÐK¨F�3—<’< Ñ'Ô'ÐKÐKÐKÐKÐKÐKr    ÚasciiÚignore)Úerrorsznon-printablez  Warning: z contained z non-ASCII characteré   ÚsÚ r   u8   ) â€” stripped so the key can be sent as an HTTP header.)Úfilea@    This usually means the key was copy-pasted from a PDF, rich-text editor, or web page that substituted lookalike
  Unicode glyphs for ASCII letters. If authentication fails (e.g. "API key not valid"), re-copy the key from the
  provider's dashboard and run `hermes setup` (or edit the .env file in a plain-text editor).N)ÚlistÚosÚenvironÚitemsÚanyÚ_CREDENTIAL_SUFFIXESÚencodeÚUnicodeEncodeErrorÚdecoder
   Úaddr   r   ÚprintÚsysÚstderr)r   ÚcleanedÚstrippedÚdetailr'   s       @r   Ú_sanitize_loaded_credentialsr@   '   s£  ø€ õ �2œ:×+Ò+Ñ-Ô-Ñ.Ô.ð 
ñ 
‰
ˆˆUÝÐKÐKÐKÐKÕ6JÐKÑKÔKÑKÔKð 	Øð	Ø�LŠL˜Ñ!Ô!Ð!ØøÝ!ð 	ð 	ð 	ØˆDð	øøøà—,’,˜w¨x�,Ñ8Ô8×?Ò?ÀÑHÔHˆØ!�Œ
�3‰Ø•,ÐÐØÝ×Ò˜ÑÔÐÝ�u‘:”:¥ G¡¤Ñ,ˆÝ(¨Ñ/Ô/ÐB°?ˆÝð2˜#ð 2ð 2¨(ð 2ð 2Ø !’m�mˆsˆs¨ð2ð 2Ø/5ð2ð 2ð 2õ ”ð		
ñ 	
ô 	
ð 	
õ 	ð1õ ”ð	
ñ 	
ô 	
ð 	
ñ 	
ð+
ð 
s   ÁA+Á+
A8Á7A8Úpathr   ÚoverrideÚboolc               óŽ   — 	 t          | |d¬¦  «         n"# t          $ r t          | |d¬¦  «         Y nw xY wt          ¦   «          d S )Núutf-8)Údotenv_pathrB   Úencodingzlatin-1)r   ÚUnicodeDecodeErrorr@   )rA   rB   s     r   Ú_load_dotenv_with_fallbackrI   S   sn   € ðMÝ ¨xÀ'ÐJÑJÔJÐJÐJøÝð Mð Mð MÝ ¨xÀ)ÐLÑLÔLÐLÐLÐLðMøøøõ !Ñ"Ô"Ð"Ð"Ð"s   ‚ •4³4c                ó  — |                       ¦   «         sdS 	 ddlm} n# t          $ r Y dS w xY wdddœ}	 t	          | fi |¤Ž5 }|                     ¦   «         }ddd¦  «         n# 1 swxY w Y    ||¦  «        }||k    rüddl}|                     t          | j	        ¦  «        dd¬	¦  «        \  }}	 t          j        |d
d¬¦  «        5 }|                     |¦  «         |                     ¦   «          t          j        |                     ¦   «         ¦  «         ddd¦  «         n# 1 swxY w Y   t          j        || ¦  «         dS # t"          $ r( 	 t          j        |¦  «         n# t&          $ r Y nw xY w‚ w xY wdS # t(          $ r Y dS w xY w)uÂ  Pre-sanitize a .env file before python-dotenv reads it.

    python-dotenv does not handle corrupted lines where multiple
    KEY=VALUE pairs are concatenated on a single line (missing newline).
    This produces mangled values â€” e.g. a bot token duplicated 8Ã—
    (see #8908).

    We delegate to ``hermes_cli.config._sanitize_env_lines`` which
    already knows all valid Hermes env-var names and can split
    concatenated lines correctly.
    Nr   )Ú_sanitize_env_linesrE   Úreplace)rG   r+   z.tmpz.env_)Údirr&   ÚprefixÚw)rG   )ÚexistsÚhermes_cli.configrK   ÚImportErrorÚopenÚ	readlinesÚtempfileÚmkstempr   Úparentr1   ÚfdopenÚ
writelinesÚflushÚfsyncÚfilenorL   ÚBaseExceptionÚunlinkÚOSErrorÚ	Exception)	rA   rK   Úread_kwÚfÚoriginalÚ	sanitizedrU   ÚfdÚtmps	            r   Ú_sanitize_env_file_if_neededrg   `   sn  € ð �;Š;‰=Œ=ð ØˆðØ9Ð9Ð9Ð9Ð9Ð9Ð9øÝð ð ð Øˆˆðøøøð #¨iÐ8Ð8€GðÝ�$Ð"Ð"˜'Ð"Ð"ð 	% aØ—{’{‘}”}ˆHð	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%à'Ð'¨Ñ1Ô1ˆ	Ø˜Ò Ð ØˆOˆOˆOØ×&Ò&Ý˜œÑ$Ô$¨V¸Gð 'ñ ô ‰GˆB�ðÝ”Y˜r 3°Ð9Ñ9Ô9ð )¸QØ—L’L Ñ+Ô+Ð+Ø—G’G‘I”I�IÝ”H˜QŸXšX™ZœZÑ(Ô(Ð(ð)ð )ð )ñ )ô )ð )ð )ð )ð )ð )ð )øøøð )ð )ð )ð )õ ”
˜3 Ñ%Ô%Ð%Ð%Ð%øÝ ð ð ð ðÝ”I˜c‘N”N�N�NøÝð ð ð Ø�Dðøøøàðøøøð !Ð øõ" ð ð ð Øˆˆðøøøs�   ˜ Ÿ
-¬-¶E> ÁA$ÁE> Á$A(Á(E> Á+A(Á,AE> Â2E Ã	AD%ÄE Ä%D)Ä)E Ä,D)Ä-E Å
E9ÅE'Å&E9Å'
E4Å1E9Å3E4Å4E9Å9E> Å>
FÆF)Úhermes_homeÚproject_envrh   ústr | os.PathLike | Noneri   ú
list[Path]c                ó(  — g }t          | p(t          j        dt          j        ¦   «         dz  ¦  «        ¦  «        }|dz  }|rt          |¦  «        nd}|                     ¦   «         rt          |¦  «         |r#|                     ¦   «         rt          |¦  «         |                     ¦   «         r&t          |d¬¦  «         |                     |¦  «         |r;|                     ¦   «         r't          || ¬¦  «         |                     |¦  «         |S )a[  Load Hermes environment files with user config taking precedence.

    Behavior:
    - `~/.hermes/.env` overrides stale shell-exported values when present.
    - project `.env` acts as a dev fallback and only fills missing values when
      the user env exists.
    - if no user env exists, the project `.env` also overrides stale shell vars.
    ÚHERMES_HOMEz.hermesz.envNT)rB   )r   r1   ÚgetenvÚhomerP   rg   rI   r   )rh   ri   ÚloadedÚ	home_pathÚuser_envÚproject_env_paths         r   Úload_hermes_dotenvrt   �   s"  € ð €Få�[ÐU¥B¤I¨m½T¼Y¹[¼[È9Ñ=TÑ$UÔ$UÑVÔV€IØ˜6Ñ!€HØ,7ÐA•t˜KÑ(Ô(Ð(¸TÐð ‡‚ÑÔð /Ý$ XÑ.Ô.Ð.Øð 7Ð,×3Ò3Ñ5Ô5ð 7Ý$Ð%5Ñ6Ô6Ð6à‡‚ÑÔð  Ý" 8°dÐ;Ñ;Ô;Ð;Ø�Š�hÑÔÐàð (Ð,×3Ò3Ñ5Ô5ð (Ý"Ð#3À&¸jÐIÑIÔIÐIØ�ŠÐ&Ñ'Ô'Ð'à€Mr    )r   )r   r   r   r   r   r   )r   r!   )rA   r   rB   rC   r   r!   )rA   r   r   r!   )rh   rj   ri   rj   r   rk   )Ú__doc__Ú
__future__r   r1   r;   Úpathlibr   Údotenvr   r5   Úsetr
   Ú__annotations__r   r@   rI   rg   rt   © r    r   ú<module>r|      sÿ   ðØ LÐ LÐ Là "Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø 
€
€
€
Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð ð AÐ ð
 ˜™œ€Ð Ð Ð Ñ ðð ð ð ð ð)
ð )
ð )
ð )
ðX
#ð 
#ð 
#ð 
#ð*ð *ð *ð *ð^ -1Ø,0ð!ð !ð !ð !ð !ð !ð !ð !r    