Ë
    ãß²j»>  ã                   óþ   — U d Z ddlZdZ edh«      Z eh d£«      Zdefd„Z e«       Zdede	fd	„Z
d
Zdede	fd„Zde	fd„Zdede	fd„ZdZdede	fd„ZdZdede	fd„Zdedefd„Zdefd„Z eh d£«      Zee   ed<   y)a  Secret-scrub policy for Hermes child processes: pure data + predicates for which env
names are Hermes-managed credentials. The env *builders* applying it (``_make_run_env``,
``_sanitize_subprocess_env``, ``hermes_subprocess_env``) live in ``tools.environments.local``.é    NÚ_HERMES_FORCE_ÚAWS_BEARER_TOKEN_BEDROCK>E   ÚGH_TOKENÚHASS_URLÚ	LLM_MODELÚ
HASS_TOKENÚXAI_API_KEYÚGROQ_API_KEYÚVERCEL_TOKENÚEMAIL_ADDRESSÚGITHUB_APP_IDÚOPENAI_ORG_IDÚWHATSAPP_MODEÚCOHERE_API_KEYÚEMAIL_PASSWORDÚGOOGLE_API_KEYÚMODAL_TOKEN_IDÚOPENAI_API_KEYÚSIGNAL_ACCOUNTÚVERCEL_TEAM_IDÚANTHROPIC_TOKENÚDAYTONA_API_KEYÚEMAIL_IMAP_HOSTÚEMAIL_SMTP_HOSTÚMISTRAL_API_KEYÚOPENAI_API_BASEÚOPENAI_BASE_URLÚSIGNAL_HTTP_URLÚDEEPSEEK_API_KEYÚGATEWAY_RELAY_IDÚHELICONE_API_KEYÚPARALLEL_API_KEYÚTOGETHER_API_KEYÚWHATSAPP_ENABLEDÚANTHROPIC_API_KEYÚFIRECRAWL_API_KEYÚFIRECRAWL_API_URLÚFIREWORKS_API_KEYÚVERCEL_OIDC_TOKENÚVERCEL_PROJECT_IDÚANTHROPIC_BASE_URLÚEMAIL_HOME_ADDRESSÚMODAL_TOKEN_SECRETÚOPENROUTER_API_KEYÚPERPLEXITY_API_KEYÚSLACK_HOME_CHANNELÚDISCORD_AUTO_THREADÚOPENAI_ORGANIZATIONÚSIGNAL_HOME_CHANNELÚSLACK_ALLOWED_USERSÚDISCORD_HOME_CHANNELÚGATEWAY_RELAY_SECRETÚSIGNAL_ALLOWED_USERSÚGATEWAY_ALLOWED_USERSÚSIGNAL_IGNORE_STORIESÚTELEGRAM_HOME_CHANNELÚWHATSAPP_ALLOWED_USERSÚDISCORD_REQUIRE_MENTIONÚEMAIL_HOME_ADDRESS_NAMEÚSLACK_HOME_CHANNEL_NAMEÚVERTEX_CREDENTIALS_PATHÚSIGNAL_HOME_CHANNEL_NAMEÚDISCORD_HOME_CHANNEL_NAMEÚGATEWAY_RELAY_DELIVERY_KEYÚGITHUB_APP_INSTALLATION_IDÚSIGNAL_GROUP_ALLOWED_USERSÚTELEGRAM_HOME_CHANNEL_NAMEÚGITHUB_APP_PRIVATE_KEY_PATHÚDISCORD_FREE_RESPONSE_CHANNELSÚGOOGLE_APPLICATION_CREDENTIALSÚHERMES_DASHBOARD_SESSION_TOKENÚreturnc                  óX  — t        t        «      } 	 ddlm} |j	                  «       D ]i  }| j                  |j                  «       |j                  dk(  r| j                  t        «       |j                  sŒO| j                  |j                  «       Œk 	 	 ddlm} |j                  «       D ]C  \  }}|j                  d«      }|dv s|dk(  sŒ!|j                  d«      sŒ3| j                  |«       ŒE 	 | j!                  d	«       t#        | «      S # t        $ r Y Œ…w xY w# t        $ r Y Œ6w xY w)
z=Derive the blocklist from provider, tool, and gateway config.r   )ÚPROVIDER_REGISTRYÚaws_sdk)ÚOPTIONAL_ENV_VARSÚcategory>   ÚtoolÚ	messagingÚsettingÚpasswordÚCLAUDE_CODE_OAUTH_TOKEN)ÚsetÚ_STATIC_PROVIDER_ENV_BLOCKLISTÚhermes_cli.authrL   ÚvaluesÚupdateÚapi_key_env_varsÚ	auth_typeÚ_AWS_SDK_CREDENTIAL_ENV_VARSÚbase_url_env_varÚaddÚImportErrorÚhermes_cli.configrN   ÚitemsÚgetÚdiscardÚ	frozenset)ÚblockedrL   ÚpconfigrN   ÚnameÚmetadatarO   s          úH/home/ubuntu/.hermes/hermes-agent/tools/environments/local_env_policy.pyÚ_build_provider_env_blocklistrj   ,   s  € äÔ:Ó;€Gð	Ý5Ø(×/Ñ/Ó1ò 	6ˆGØ�N‰N˜7×3Ñ3Ô4Ø× Ñ  IÒ-Ø—‘Ô;Ô<Ø×'Ó'Ø—‘˜G×4Ñ4Õ5ñ	6ðÝ7Ø/×5Ñ5Ó7ò 	"‰NˆD�(Ø—|‘| JÓ/ˆHØÐ0Ñ0Ø 	Ó)¨h¯l©l¸:Õ.FØ—‘˜DÕ!ñ		"ð" ‡O�OÐ-Ô.ô �WÓÐøô1 ò Ùðûô ò Ùðús6   ‘A$D Á6D Â6D ÃD ÃD Ä	DÄDÄ	D)Ä(D)rg   c                 óB   — | t         v xs | j                  «       t         v S )aP  ``name`` is a blocklisted provider/tool credential, matched the way the
    platform's environment resolves names: exact plus case-folded. On Windows
    the environment block is case-insensitive, so ``openai_api_key`` IS
    ``OPENAI_API_KEY``; consistent with ``_is_hermes_internal_secret``, which
    already folds (``key.upper()``).)Ú_HERMES_PROVIDER_ENV_BLOCKLISTÚupper©rg   s    ri   Ú_is_provider_env_blocklistedro   U   s&   € ð Ô2Ð2ò >Ø�z‰z‹|Ô=Ð=ð?ó    )ÚBUZZ_c                 óH   — | j                  «       j                  t        «      S )um  Pure name check (``BUZZ_*``), regardless of session context â€” the snapshot
    exclusion must stay conservative even when the carve-out is inactive.
    Case-folded: on Windows the env block is case-insensitive, so a
    lowercase-stored ``buzz_private_key`` IS the credential; it needs the
    carve-out (and the snapshot exclusion) just like the canonical name.)rm   Ú
startswithÚ"_TERMINAL_FIRST_PARTY_ENV_PREFIXESrn   s    ri   Ú$_matches_terminal_first_party_prefixru   …   s   € ð �:‰:‹<×"Ñ"Ô#EÓFÐFrp   c                  ó¾   — t         j                  j                  d«      ry	 ddlm}   | dd«      j                  «       j                  «       dk(  S # t        $ r Y yw xY w)	u£  True when this process/session operates as a Buzz agent: ``BUZZ_MANAGED_AGENT`` in
    the process env (set only by Buzz Desktop's buzz-acp harness), or the live session's
    platform is ``buzz`` via the gateway ContextVar â€” authoritative under a concurrent
    multi-session host, so a sibling Telegram session resolves its OWN platform.

    Gateway / CLI / cron / kanban processes never carry it. See #76243.
    ÚBUZZ_MANAGED_AGENTTr   ©Úget_session_envÚHERMES_SESSION_PLATFORMÚ ÚbuzzF)ÚosÚenvironrb   Úgateway.session_contextry   ÚstripÚlowerÚ	Exceptionrx   s    ri   Ú_buzz_terminal_context_activerƒ   Ž   sX   € ô 
‡z�z‡~�~Ð*Ô+ØðÝ;áÐ8¸"Ó=×CÑCÓE×KÑKÓMÐQWÑWÐWøÜò Ùðús   ¢-A Á	AÁAc                 ó0   — t        | «      xr
 t        «       S )zŽ``name`` is a first-party platform credential (``BUZZ_*``) AND the current
    process/session context entitles it to reach terminal children.)ru   rƒ   rn   s    ri   Ú_is_terminal_first_party_envr…       s   € ô 0°Ó5ÒYÔ:WÓ:YÐYrp   )ÚVIRTUAL_ENVÚCONDA_PREFIXÚ
PYTHONHOMEÚkeyc                 ó°   — | j                  «       }|j                  d«      r|j                  d«      ry|j                  d«      xr |j                  d«      S )a�  True for Hermes-internal secrets injected under *dynamic* names the static
    blocklist cannot enumerate: ``AUXILIARY_<TASK>_API_KEY``/``_BASE_URL`` (per-task
    side-LLM credentials) and ``GATEWAY_RELAY_*_SECRET``/``_KEY``/``_TOKEN`` (relay
    auth; non-secret routing hints stay visible). Stripped on every spawn path
    regardless of env_passthrough registration or ``inherit_credentials``.Ú
AUXILIARY_)Ú_API_KEYÚ	_BASE_URLTÚGATEWAY_RELAY_)Ú_SECRETÚ_KEYÚ_TOKEN)rm   rs   Úendswith)r‰   rm   s     ri   Ú_is_hermes_internal_secretr“   ¹   sM   € ð �I‰I‹K€EØ×Ñ˜Ô%¨%¯.©.Ð9RÔ*SØØ×ÑÐ,Ó-Ò_°%·.±.ÐA^Ó2_Ð_rp   )
Ú	_ALLOWED_Ú_ALLOW_ALL_Ú_ALLOW_FROMÚ_ALLOW_BOTSÚ_ALLOW_PUBLIC_Ú_IGNORED_CHANNELSÚ_NO_THREAD_CHANNELSÚ_FREE_RESPONSE_CHANNELSÚ_BACKFILL_CHANNELSÚ_GROUP_ALLOWEDc                 óš   ‡— | j                  «       Š‰j                  d«      s‰j                  d«      ryt        ˆfd„t        D «       «      S )uú   True for a platform authorization gate (``DISCORD_ALLOWED_CHANNELS``, ``TELEGRAM_ALLOW_ALL_USERS``,
    ``GATEWAY_ALLOWED_USERS``, ``WHATSAPP_GROUP_ALLOW_FROM`` ...) â€” profile-scoped policy a child acting
    for ANOTHER profile must never inherit.ÚHERMES_Ú_Fc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w)N© )Ú.0Úmarkerrm   s     €ri   ú	<genexpr>z&is_profile_gate_env.<locals>.<genexpr>Ú   s   øè ø€ ÒG 6ˆv˜ŒÑGùs   ƒ)rm   rs   ÚanyÚ_PROFILE_GATE_ENV_MARKERS)rg   rm   s    @ri   Úis_profile_gate_envr¨   Ó   s@   ø€ ð �J‰J‹L€EØ×Ñ˜	Ô" e×&6Ñ&6°sÔ&;ØÜÓGÔ-FÔGÓGÐGrp   Úenvc                 óX   — | D �cg c]  }t        |«      sŒ|‘Œ c}D ]  }| |= Œ | S c c}w )zTDrop every authorization gate from *env* in place (see :func:`is_profile_gate_env`).)r¨   )r©   Úkr‰   s      ri   Ústrip_profile_gate_envr¬   Ý   s5   € àÖ9�aÔ"5°aÕ"8’Ò9ò ˆØ�‰Hðà€Jùò :s   …'–'c                  óP   — 	 ddl m}   | «       S # t        $ r t        «       cY S w xY w)zËCredential env keys owned by plugin-registered terminal backends (Tier-1:
    stripped from every spawned subprocess). Computed at call time because plugins
    register after import; fail-soft to empty.r   ©Úplugin_strip_env_keys)Úagent.terminal_env_registryr¯   r‚   rd   r®   s    ri   Ú_plugin_terminal_env_strip_keysr±   ä   s*   € ðÝEá$Ó&Ð&øÜò Ü‹{Òðús   ‚ �%¤%>   r   r   ÚGITHUB_TOKENr   r   r   r   ÚSLACK_APP_TOKENÚSLACK_BOT_TOKENr    ÚDISCORD_BOT_TOKENr-   ÚTELEGRAM_BOT_TOKENr6   ÚSLACK_SIGNING_SECRETr8   ÚGATEWAY_ALLOW_ALL_USERSrB   rC   rF   rI   Ú_ALWAYS_STRIP_KEYS)Ú__doc__r}   Ú!_HERMES_PROVIDER_ENV_FORCE_PREFIXrd   r\   rV   rj   rl   ÚstrÚboolro   rt   ru   rƒ   r…   Ú_ACTIVE_VENV_MARKER_VARSr“   r§   r¨   Údictr¬   r±   r¹   Ú__annotations__r¢   rp   ri   ú<module>rÁ      s  ðòbó 
ð %5Ð !ñ  )Ð*DÐ)EÓFÐ á!*ò ,ó "Ð ð6# yó #ñL "?Ó!@Ð ð? sð ?¨tó ?ðZ &0Ð "ðG¨sð G°tó Gð tó ð$Z sð Z¨tó Zð, IÐ ð	` Cð 	`¨Dó 	`ð(Ð ðH˜cð H dó Hð ð ¨ó ð	¨ó 	ñ &/ò 0ó &Ð �I˜c‘Nô rp   