+
    iHàj  ã                  óä   € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIHt RtR R lt	R R lt
RR R	 lltRtR
 R ltR R ltR R ltR R lt]P"                  3R R lltRR R lltRR/R R lltR# )az  NO_PROXY matching shared by the LLM transport (``agent/process_bootstrap.py``) and the
gateway platform adapters (``gateway/platforms/base.py``).

One matcher so "is this host in NO_PROXY" has one answer everywhere: exact hosts, domain
suffixes (``example.com``, ``.example.com``, ``*.example.com``), IP literals, CIDR ranges,
optional ``host:port`` entries and ``*``. The stdlib ``proxy_bypass_environment`` understands
none of the CIDR / ``*.`` forms, which is why the LLM path used to route ``10.x`` endpoints
through the corporate proxy while Telegram/Discord bypassed it.

Leaf module: stdlib only, importable during early boot.
)ÚannotationsN)Úurlsplitc               ó   € V ^8„  d   QhRR/# )é   ÚreturnÚstr© )Úformats   "Ú7/home/ubuntu/.hermes/hermes-agent/agent/proxy_bypass.pyÚ__annotate__r      s   € ÷ ]ñ ]˜sñ ]ó    c                 ó8   a € \        V 3R l\         4       R4      # )zMFirst non-empty HTTPS_PROXY / HTTP_PROXY / ALL_PROXY value (any case), or ''.c              3  óª   <"  € T FH  p\         P                  P                  V4      ;'       g    R P                  4       ;o'       g   KD  Sx € KJ  	  R# 5i©Ú N)ÚosÚenvironÚgetÚstrip)Ú.0ÚkÚvs   & €r
   Ú	<genexpr>Ú(first_proxy_env_value.<locals>.<genexpr>   s;   øé € ÐW™N�q´R·Z±Z·^±^ÀAÓ5F×5LÐ5LÈ"×4SÑ4SÓ4UÐ/U¨qÓ/U—’›Nùs   ƒ*A®AÁ	
Ar   )ÚnextÚPROXY_ENV_KEYS©r   s   @r
   Úfirst_proxy_env_valuer      s   ø€ äÔW�NÓWÐY[Ó\Ð\r   c               ó    € V ^8„  d   QhRRRR/# )r   Úvaluer   r   ztuple[str, int | None]r   )r	   s   "r
   r   r      s   € ÷ *ñ *˜3ð *Ð#9ñ *r   c                óJ  € \        T ;'       g    R4      P                  4       pV'       g   R# RV9   g   VP                  R4      '       d0   \        V4      pVP                  ;'       g    Rp VP
                  pMöVP                  R4      '       dl   RV9   de   VR,          P                  R4      w  r5pVP                  R4      '       d0   VR,          P                  4       '       d   \        VR,          4      MRpMtVP                  R4      ^8X  dM   VP                  R4      ^,          P                  4       '       d!   VP                  R4      w  r5p\        V4      pMVP                  R	4      RrCVP                  4       P                  R
4      V3#   \         d    Rp L0i ; i)zÜ``(host, port)`` from a URL (scheme optional: ``//host/path``), ``[v6]:port``,
``host:port`` or bare host; host lowercased. A malformed URL port (``host:abc``,
``host:99999``) yields ``(host, None)`` rather than raising.r   Nz://z//Ú[Ú]:é   NNÚ:ú[]Ú.r   )r   r   Ú
startswithr   ÚhostnameÚportÚ
ValueErrorÚ	partitionÚisdigitÚintÚcountÚ
rpartitionÚlowerÚrstrip)r   ÚrawÚparsedÚhostr)   Ú_ÚrestÚport_ss   &       r
   Úsplit_host_portr8      sI  € ô ˆe�kˆk�rÓ
×
 Ñ
 Ó
"€CßØˆØ�„|�s—~‘~ d×+Ò+Ü˜#“ˆØ�‰×$Ð$ "ˆð	Ø—;‘;‰Dð 
�‰˜×	Ò	 ¨¤Ø˜B�×)Ñ)¨#Ó.‰ˆ�Ø $§¡°× 4Ò 4¸¸b½×9IÑ9I×9KÒ9KŒs�4˜•8Œ}ÐQU‰Ø	�‰�3‹˜1Ô	 §¡°Ó!4°QÕ!7×!?Ñ!?×!AÒ!AØŸ.™.¨Ó-‰ˆ�Ü�6‹{‰à—Y‘Y˜t“_ dˆdØ�:‰:‹<×Ñ˜sÓ# TÐ)Ð)øô ô 	ØŠDð	ús   Á.F ÆF"Æ!F"c               ó    € V ^8„  d   QhRRRR/# )r   Úno_proxy_valueú
str | Noner   z	list[str]r   )r	   s   "r
   r   r   5   s   € ÷ Rñ R Zð R¸9ñ Rr   c                óÀ   € V f   RP                  R R 4       4      p \        P                  ! RV P                  4       4       Uu. uF  q'       g   K  VNK  	  up# u upi )zqComma/whitespace-separated NO_PROXY entries; from the environment (both casings) when
``no_proxy_value`` is None.Ú,c              3  ób   "  € T F%  p\         P                  P                  VR 4      x € K'  	  R# 5ir   )r   r   r   )r   Úkeys   & r
   r   Ú#no_proxy_entries.<locals>.<genexpr>9   s$   é € Ð!^ÑE]¸c¤"§*¡*§.¡.°°b×"9Ð"9ÓE]ùs   ‚-/z[\s,]+©ÚNO_PROXYÚno_proxy)ÚjoinÚreÚsplitr   )r:   Úparts   & r
   Úno_proxy_entriesrH   5   sQ   € ð ÒØŸ™Ñ!^ÑE]Ó!^Ó^ˆÜŸXšX i°×1EÑ1EÓ1GÔHÓQÑH�TËD�DˆDÑHÑQÐQùÒQs   Á	AÁAc               ó    € V ^8„  d   QhRRRR/# )r   r4   r;   r   Úboolr   )r	   s   "r
   r   r   G   s   € ÷ Fñ F˜:ð F¨$ñ Fr   c                óâ   € \        T ;'       g    R4      P                  4       P                  4       P                  R4      p \        V 4      pV R8H  ;'       g    VRJ;'       d    VP                  # )z‰True for a host that must always bypass a proxy: ``localhost`` or any loopback IP literal
(``127.x.x.x``, ``::1``, ``::ffff:127.0.0.1``).r   r%   Ú	localhostN)r   r   r0   Ú_ip_or_noneÚis_loopback)r4   Úips   & r
   Úis_loopback_hostrP   G   s]   € ô ˆt�zˆz�r‹?× Ñ Ó"×(Ñ(Ó*×0Ñ0°Ó6€DÜ	�TÓ	€BØ�;Ñ×EÐE 2¨T >×#DÐ#D°b·n±nÐEr   c               ó    € V ^8„  d   QhRRRR/# ©r   Úurlr   r   Údictr   )r	   s   "r
   r   r   O   s   € ÷ Pñ P ð P¨ñ Pr   c                óP   € \        \        V 4      ^ ,          4      '       d   RR/# / # )zÛ``websockets.connect`` kwargs for an in-process dial: ``{"proxy": None}`` when ``url``
targets loopback (skip the library's system-proxy auto-detection), else ``{}`` so remote
endpoints keep the default proxy behaviour.ÚproxyN©rP   r8   ©rS   s   &r
   Úloopback_connect_kwargsrY   O   s'   € ô /¬¸sÓ/CÀAÕ/F×GÒGˆG�Tˆ?ÐOÈRÐOr   c               ó    € V ^8„  d   QhRRRR/# rR   r   )r	   s   "r
   r   r   V   s   € ÷ kñ k ð k¨ñ kr   c                óX   € \        \        V 4      ^ ,          4      '       d	   RRRRR//# / # )a  ``requests.get`` kwargs for an in-process HTTP dial (CDP ``/json/version`` discovery /
readiness): ``{"proxies": {"http": None, "https": None}}`` when ``url`` targets loopback so
``requests`` skips ``getproxies()`` (env and macOS system proxy), else ``{}``.ÚproxiesÚhttpNÚhttpsrW   rX   s   &r
   Úloopback_request_kwargsr_   V   s5   € ô :JÌ/ÐZ]ÓJ^Ð_`ÕJa×9bÒ9bˆI˜  g¨tÐ4Ð5ÐjÐhjÐjr   c               ó    € V ^8„  d   QhRRRR/# )r   ÚenvrT   r   r   )r	   s   "r
   r   r   ]   s   € ÷ ñ ˜tð ¨ñ r   c                ór  a € \         ;QJ d    V 3R lR 4       F  '       g   K   RM	  RM! V 3R lR 4       4      '       d   S # R Fh  p\        S P                  V4      ;'       g    R4      p\         Uu. uF  q3V9  g   K  VNK  	  ppV'       g   KN  RP	                  W$,           4      S V&   Kj  	  S # u upi )a  Append the loopback hosts to ``NO_PROXY`` / ``no_proxy`` in ``env`` (both casings),
keeping every operator-provided entry; returns ``env``. An operator ``*`` (bypass everything)
already covers loopback and would stop being the wildcard once anything is appended to it.c              3  ór   <"  € T F,  pR \        SP                  V4      ;'       g    R4      9   x € K.  	  R# 5i)Ú*r   N)rH   r   )r   r?   ra   s   & €r
   r   Ú(add_loopback_no_proxy.<locals>.<genexpr>a   s.   øé € Ð
[ÑBZ¸3ˆ3Ô" 3§7¡7¨3£<×#5Ð#5°2Ó6Ö6ÓBZùs   ƒ"7¦7TFr   r=   rA   )ÚanyrH   r   ÚLOOPBACK_HOSTSrD   )ra   r?   Úentriesr4   Úmissings   f    r
   Úadd_loopback_no_proxyrj   ]   s“   ø€ ÷ ƒsÔ
[ÑBZÓ
[‡s‡s‚sÔ
[ÑBZÓ
[×[Ò[Øˆ
Û'ˆÜ" 3§7¡7¨3£<×#5Ð#5°2Ó6ˆÝ$2ÓJ¡N˜DÀ'Ñ6I—4�4¡NˆÐJß‰7Ø—x‘x Õ 1Ó2ˆC�‹Hñ	 (ð
 €Jùò Ks   Á5B4ÂB4c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r	   s   "r
   r   r   k   s   € ÷ ñ �sñ r   c                ó8   €  V! V 4      #   \          d     R# i ; i)zR``parse(value)`` or None on ``ValueError`` (``parse`` is ip_address / ip_network).N)r*   )r   Úparses   &&r
   rM   rM   k   s#   € ðÙ�U‹|ÐøÜô Úðús   ‚
 Š˜c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úentryr   r4   r)   z
int | Noner   rJ   r   )r	   s   "r
   r   r   s   s(   € ÷ 9ñ 9 #ð 9¨Sð 9¸
ð 9Èdñ 9r   c                ó¬  € \        T ;'       g    R 4      P                  4       P                  4       pV'       g   R# VR8X  d   R# \        V4      w  rEV'       d   Ve   Ve   WR8w  d   R# \	        V4      p\	        VR 4      pVe   VRJ;'       d    Wg9   # VP                  R4      P                  R4      pW8H  ;'       g    VP                  RV 24      # )r   Frd   TNc                ó2   € \         P                  ! V R R7      # )F)Ústrict)Ú	ipaddressÚ
ip_networkr   s   &r
   Ú<lambda>Ú(no_proxy_entry_matches.<locals>.<lambda>}   s   € ´	×0DÒ0DÀQÈuÕ0Ur   r&   )r   r   r0   r8   rM   ÚremoveprefixÚendswith)	ro   r4   r)   ÚtokenÚ
token_hostÚ
token_portÚhost_ipÚnetworkÚsuffixs	   &&&      r
   Úno_proxy_entry_matchesr   s   sÄ   € Ü�—�˜Ó×"Ñ"Ó$×*Ñ*Ó,€EßÙØ�„|ÙÜ,¨UÓ3Ñ€Jß˜*Ò0°d²lÀjÔFXÙÜ˜$Ó€GÜ˜*Ñ&UÓV€GØÒØ˜dÐ"×9Ð9 wÑ'9Ð9ð ×$Ñ$ SÓ)×6Ñ6°sÓ;€FØ‰>×8Ð8˜TŸ]™]¨Q¨v¨h¨<Ó8Ð8r   r:   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Útarget_hostsz3str | list[str] | tuple[str, ...] | set[str] | Noner:   r;   r   rJ   r   )r	   s   "r
   r   r   †   s)   € ÷ Fñ FØEðFØZdðFà	ñFr   c          
     ój  a€ \        V4      oS'       d	   V '       g   R# \        V \        4      '       d   V .M
\        V 4      p\        ;QJ d;    V3R l\        \        \        \        V4      4       4       F  '       g   K   R# 	  R# ! V3R l\        \        \        \        V4      4       4       4      # )z�True when NO_PROXY (the environment, or ``no_proxy_value``) matches at least one target
host (a URL, ``host:port`` or bare host).Fc              3  óº   <aa"  € T FN  w  ooS;'       d=    \         ;QJ d     VV3R  lS 4       F  '       g   K   RM	  RM! VV3R  lS 4       4      x € KP  	  R# 5i)c              3  ó>   <"  € T F  p\        VSS4      x € K  	  R # 5i©N)r   )r   ro   r4   r)   s   & €€r
   r   Ú0should_bypass_proxy.<locals>.<genexpr>.<genexpr>�   s   øé € ÐTÉGÀ5Ô+¨E°4¸×>Ð>ËGùs   ƒTFN)rf   )r   r4   r)   rh   s   &@@€r
   r   Ú&should_bypass_proxy.<locals>.<genexpr>�   sC   úé € ð FáD‰JˆD�$ð 	×TÐT—“ÕTÉGÓT——’ÕTÉGÓTÓTÔTÛDùs   …A–A¢Aº!AT)rH   Ú
isinstancer   Úlistrf   Úmapr8   )r�   r:   Ú
candidatesrh   s   &$ @r
   Úshould_bypass_proxyrŒ   †   s�   ø€ ô
 ˜~Ó.€GßŸ,ÙÜ#-¨l¼C×#@Ò#@�,‘ÄdÈ<ÓFX€Jß‹3ô Fäœo¬s´3¸
Ó/CÔDóF�3Œ3ð FŠ3ð Fˆ3ô Fäœo¬s´3¸
Ó/CÔDóFó Fð Fr   )ÚHTTPS_PROXYÚ
HTTP_PROXYÚ	ALL_PROXYÚhttps_proxyÚ
http_proxyÚ	all_proxyr…   )z	127.0.0.1rL   z::1)Ú__doc__Ú
__future__r   rs   r   rE   Úurllib.parser   r   r   r8   rH   rg   rP   rY   r_   rj   Ú
ip_addressrM   r   rŒ   r   r   r
   Ú<module>r—      sy   ðñ
õ #ã Û 	Û 	Ý !àe€õ]õ
*÷2Rð 3€õFõPõkõð #,×"6Ñ"6÷ ÷9ð&FØgk÷Fñ Fr   