
    i)                         d Z ddlZddlZddlZddlZddlZddlZddlmZm	Z	  ej
                    dk    ZdZdefdZ e            Zddedz  d	edz  defd
ZdefdZeZdZdedefdZ G d de          ZdS )uE   Local execution environment — spawn-per-call with session snapshot.    N)BaseEnvironment_pipe_stdinWindows_HERMES_FORCE_returnc                  `   t                      } 	 ddlm} |                                D ]=}|                     |j                   |j        r|                     |j                   >n# t          $ r Y nw xY w	 ddl	m
} |                                D ]d\  }}|                    d          }|dv r|                     |           4|dk    r*|                    d          r|                     |           en# t          $ r Y nw xY w|                     h d           t          |           S )	z=Derive the blocklist from provider, tool, and gateway config.r   )PROVIDER_REGISTRY)OPTIONAL_ENV_VARScategory>   tool	messagingsettingpassword>;   GH_TOKENHASS_URL	LLM_MODEL
HASS_TOKENXAI_API_KEYGROQ_API_KEY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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HELICONE_API_KEYPARALLEL_API_KEYTOGETHER_API_KEYWHATSAPP_ENABLEDFIRECRAWL_API_KEYFIRECRAWL_API_URLFIREWORKS_API_KEY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SIGNAL_ALLOWED_USERSGATEWAY_ALLOWED_USERSSIGNAL_IGNORE_STORIESTELEGRAM_HOME_CHANNELWHATSAPP_ALLOWED_USERSCLAUDE_CODE_OAUTH_TOKENDISCORD_REQUIRE_MENTIONEMAIL_HOME_ADDRESS_NAMESLACK_HOME_CHANNEL_NAMESIGNAL_HOME_CHANNEL_NAMEDISCORD_HOME_CHANNEL_NAMEGITHUB_APP_INSTALLATION_IDSIGNAL_GROUP_ALLOWED_USERSTELEGRAM_HOME_CHANNEL_NAMEGITHUB_APP_PRIVATE_KEY_PATHDISCORD_FREE_RESPONSE_CHANNELS)sethermes_cli.authr	   valuesupdateapi_key_env_varsbase_url_env_varaddImportErrorhermes_cli.configr
   itemsget	frozenset)blockedr	   pconfigr
   namemetadatar   s          @/home/agentuser/.hermes/hermes-agent/tools/environments/local.py_build_provider_env_blocklistr\      s   G555555(//11 	6 	6GNN73444' 6G4555	6    	777777/5577 	" 	"ND(||J//H000D!!!!Y&&8<<
+C+C&D!!!	"     NN < < < < < <z Ws%   AA) )
A65A6:A?C: :
DDbase_env	extra_envc                    	 ddl m} n# t          $ r d }Y nw xY wi }| pi                                 D ]9\  }}|                    t
                    r |t          vs ||          r|||<   :|pi                                 D ]Z\  }}|                    t
                    r"|t          t
                    d         }|||<   A|t          vs ||          r|||<   [ddlm	}  |            }|r||d<   |S )z<Filter Hermes-managed secrets from a subprocess environment.r   is_env_passthroughc                     dS NF _s    r[   <lambda>z*_sanitize_subprocess_env.<locals>.<lambda>s       E     Nget_subprocess_homeHOME)
tools.env_passthroughra   	ExceptionrT   
startswith!_HERMES_PROVIDER_ENV_FORCE_PREFIX_HERMES_PROVIDER_ENV_BLOCKLISTlenhermes_constantsrk   )	r]   r^   _is_passthrough	sanitizedkeyvaluereal_keyrk   _profile_homes	            r[   _sanitize_subprocess_envrz   n   sf   *OOOOOOO * * *)/* !#I~2,,.. # #
U>>;<< 	4448L8L4"IcN B--// # #
U>>;<< 	#3@AABBCH"'Ih666//#:N:N6"IcN 544444''))M *)	&   	 c            	         t           s{t          j        d          pft          j                            d          rdndpCt          j                            d          rdndp t          j                            d          pdS t          j                            d          } | r!t          j                            |           r| S t          j        d          }|r|S t          j                            t          j                            dd	          d
dd          t          j                            t          j                            dd          d
dd          t          j                            t          j                            dd          dd
dd          fD ]'}|r#t          j                            |          r|c S (t          d          )z Find bash for command execution.bashz/usr/bin/bashNz	/bin/bashSHELLz/bin/shHERMES_GIT_BASH_PATHProgramFileszC:\Program FilesGitbinzbash.exezProgramFiles(x86)zC:\Program Files (x86)LOCALAPPDATA ProgramszGit Bash not found. Hermes Agent requires Git for Windows on Windows.
Install it from: https://git-scm.com/download/win
Or set HERMES_GIT_BASH_PATH to your bash.exe location.)
_IS_WINDOWSshutilwhichospathisfileenvironrU   joinRuntimeError)customfound	candidates      r[   
_find_bashr      s    
L   #%7>>/#B#BL!w~~k::D z~~g&& 	
 Z^^233F "'..(( L  E  	RZ^^N4GHH%QVXbcc
RZ^^$79RSSUZ\acmnn
RZ^^NB77UES]^^  	
  		22 	
	A  ri   za/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binenvc                    	 ddl m} n# t          $ r d }Y nw xY wt          t          j        | z            }i }|                                D ]Z\  }}|                    t                    r"|t          t                    d         }|||<   A|t          vs ||          r|||<   [|                    dd          }d|                    d          vr|r| dt           nt          |d<   dd	lm}  |            }	|	r|	|d
<   |S )zDBuild a run environment with a sane PATH and provider-var stripping.r   r`   c                     dS rc   rd   re   s    r[   rg   z_make_run_env.<locals>.<lambda>   rh   ri   NPATHr   z/usr/bin:rj   rl   )rm   ra   rn   dictr   r   rT   ro   rp   rr   rq   rU   split
_SANE_PATHrs   rk   )
r   rt   mergedrun_envkvrx   existing_pathrk   ry   s
             r[   _make_run_envr      s^   *OOOOOOO * * *)/* "*s"##FG  1<<9:: 	>??@@AH !GH4448J8J4GAJKK++M,,S1111=JZ]99Z999PZ
 544444''))M ('Nr{   c                        e Zd ZdZddededef fdZd	efd
Zdddddede	dededz  d	e
j        f
dZd ZdefdZd Z xZS )LocalEnvironmentzRun commands directly on the host machine.

    Spawn-per-call: every execute() spawns a fresh bash process.
    Session snapshot preserves env vars across calls.
    CWD persists via file-based read after each command.
    r   <   Ncwdtimeoutr   c                     t                                          |pt          j                    ||           |                                  d S )N)r   r   r   )super__init__r   getcwdinit_session)selfr   r   r   	__class__s       r[   r   zLocalEnvironment.__init__   sE    S/BIKKcJJJri   r   c                    dD ]k}| j                             |          pt          j                            |          }|r.|                    d          r|                    d          pdc S lt          j                            d          r.t          j        dt          j	        t          j
        z            rdS t          j                    }|                    d          r|                    d          pdS dS )a6  Return a shell-safe writable temp dir for local execution.

        Termux does not provide /tmp by default, but exposes a POSIX TMPDIR.
        Prefer POSIX-style env vars when available, keep using /tmp on regular
        Unix systems, and only fall back to tempfile.gettempdir() when it also
        resolves to a POSIX path.

        Check the environment configured for this backend first so callers can
        override the temp root explicitly (for example via terminal.env or a
        custom TMPDIR), then fall back to the host process environment.
        )TMPDIRTMPTEMP/z/tmp)r   rU   r   r   ro   rstripr   isdiraccessW_OKX_OKtempfile
gettempdir)r   env_varr   s      r[   get_temp_dirzLocalEnvironment.get_temp_dir   s     1 	4 	4GW--H1H1HI 4Y11#66 4 '',,33337==   	RYvrw7H%I%I 	6'))	$$ 	0##C((/C/vri   Fx   )loginr   
stdin_data
cmd_stringr   r   c                @   t                      }|r|dd|gn|d|g}t          | j                  }t          j        |d|ddt          j        t          j        |t          j        nt          j        t          rd nt          j
        	  	        }|t          ||           |S )Nz-lz-cTzutf-8replace)textr   encodingerrorsstdoutstderrstdin
preexec_fn)r   r   r   
subprocessPopenPIPESTDOUTDEVNULLr   r   setsidr   )	r   r   r   r   r   r}   argsr   procs	            r[   	_run_bashzLocalEnvironment._run_bash   s     ||16TdD*--T4<T))?$%/%;*//AS*9tt	

 

 

 !j)))ri   c                    	 t           r|                                 dS t          j        |j                  }t          j        |t          j                   	 |                    d           dS # t          j
        $ r# t          j        |t          j                   Y dS w xY w# t          t          f$ r+ 	 |                                 Y dS # t          $ r Y Y dS w xY ww xY w)z-Kill the entire process group (all children).g      ?)r   N)r   	terminater   getpgidpidkillpgsignalSIGTERMwaitr   TimeoutExpiredSIGKILLProcessLookupErrorPermissionErrorkillrn   )r   r   pgids      r[   _kill_processzLocalEnvironment._kill_process  s    	 4     z$(++	$///4IIcI*****!0 4 4 4IdFN3333334"O4 	 	 			   	sL   B% 8B% A0 0.B"B% !B""B% %C!7C
CC!CC!resultc                     	 t          | j                                                                                  }|r|| _        n# t
          t          f$ r Y nw xY w|                     |           dS )z;Read CWD from temp file (local-only, no round-trip needed).N)open	_cwd_filereadstripr   OSErrorFileNotFoundError_extract_cwd_from_output)r   r   cwd_paths      r[   _update_cwdzLocalEnvironment._update_cwd(  s    	DN++002288::H $#*+ 	 	 	D	 	%%f-----s   AA AAc                 r    | j         | j        fD ]'}	 t          j        |           # t          $ r Y $w xY wdS )zClean up temp files.N)_snapshot_pathr   r   unlinkr   )r   fs     r[   cleanupzLocalEnvironment.cleanup4  sY    %t~6 	 	A	!   	 	s   '
44)r   r   N)__name__
__module____qualname____doc__strintr   r   r   boolr   r   r   r   r   r   __classcell__)r   s   @r[   r   r      s         C s d      c    4 ;@!$+/  C 4 !Dj4>4D   0  $
.$ 
. 
. 
. 
.      ri   r   )N)r   r   platformr   r   r   r   tools.environments.baser   r   systemr   rp   rV   r\   rq   r   rz   r   r   _find_shellr   r   r   rd   ri   r[   <module>r      so   K K 				         @ @ @ @ @ @ @ @ho9, %5 !Uy U U U Up "?!>!@!@  td{ td{ VZ    >C    F 
C t     <b b b b b b b b b bri   